📄 ch372.c
字号:
//*******************************端口定义*************************************
#include <reg52.h>
#include <CH372INC.H>
#define CH372_DATA P0
sbit CH372_A0=P2^7;
sbit CH372_CS=P2^6;
sbit CH372_RD=P3^7;
sbit CH372_WR=P3^6;
//********************************CH372写USB命令*********************************
void CH372_WR_CMD_PORT(unsigned char cmd)
{ //向CH372的命令端口写入命令,周期不小于4uS,如果单片机较快则延时
delay2us();
CH372_DATA=cmd;
CH372_A0=1; //选择CH372的写命令方式
CH372_RD=1; //如果I/O默认电平是高电平,那么这是可选操作
CH372_CS=0;
CH372_WR=0;
CH372_WR=1;
CH372_CS=1;
CH372_A0=0;
CH372_DATA=0xFF; //对于准双向I/O,请在此设置输出全高电平
delay2us();
}
//*************************单片机读取一字节数据程序代码*****************************
unsigned char CH372_RD_DAT_PORT(void)
{ //从CH372的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
CH372_DATA=0xFF; //对于准双向I/O,请在此设置输出全高电平,便于输入
CH372_CS=0;
CH372_RD=0;
unsigned char dat=CH372_DATA;
CH372_RD=1;
CH372_CS=1;
CH372_DATA=0xFF; //对于准双向I/O,请在此设置输出全高电平
return dat;
}
//*****************************单片机发送一字节数据程序代码***************************
void CH372_WR_DAT_PORT(unsigned char dat)
{ //向CH372的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
CH372_DATA=dat;
CH372_CS=0;
CH372_WR=0;
CH372_WR=1;
CH372_CS=1;
CH372_DATA=0xFF; //对于准双向I/O,请在此设置输出全高电平
}
//***************************** CH372中断服务程序*******************************
void CH372Interrupt()interrupt 0 using 1
{
unsigned char status;
unsigned char i,length;
unsigned char data buffer[SIZE];
CH372_WR_CMD_PORT(CMD_GET_STATUS); //获取中断状态并取消中断请求
status=CH372_RD_DAT_PORT( ); //获取中断状态
switch (status)
{ //分析中断状态处理
case USB_INT_EP2_OUT:
{ /* 批量端点下传成功 */
/* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
CH372_WR_CMD_PORT(CMD_RD_USB_DATA); //执行RD_USB_DATA命令
length=CH372_RD_DAT_PORT(); //首先读取后续数据长度
for (i=0;i<length;i++ )
buffer[i]=CH372_RD_DAT_PORT(); //接收数据包
/*测试数据正确性,将接收到的命令包数据取反后返回给PC机*/
CH372_WR_CMD_PORT(CMD_WR_USB_DATA7);
//向USB端点2的发送缓冲区写入数据块
CH372_WR_DAT_PORT(length);
//首先写入后续数据长度,回传刚接收到的数据长度
for (i=0;i<length;i++)
CH372_WR_DAT_PORT(buffer[i]);
//数据取反后返回,由计算机应用程序测试数据是否正确
break;
}
case USB_INT_EP2_IN:
{ /* 批量数据发送成功 */
CH372_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区
break;
}
default:
{ /* 其它中断,未用到,解锁后退出即可 */
CH372_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -