📄 usb.h
字号:
///////////////////////////////////////////////////////
/////////////////for usb ch375/////////////////////////
///////////////////////////////////////////////////////
//命令定义
#define CMD_RESET_ALL 0x0500 //执行硬件复位
#define CMD_CHECK_EXIST 0x0600 //测试工作状态
#define SET_USB_ID 0x1200 //设置厂商识别码VID和产品的识别码PID
#define CMD_SET_USB_MODE 0x1500 //设置USB工作模式
#define CMD_GET_STATUS 0x2200 //获取中断状态并取消请求
#define CMD_UNLOCK_USB 0x2300 //释放当前USB缓冲区
#define CMD_RD_USB_DATA 0x2800 //从当前USB中断的端点缓冲区读取数据块并释放当前缓冲区
#define CMD_WR_USB_DATA5 0x2A00 //向USB端点1的发送缓冲区写入数据块
#define CMD_WR_USB_DATA7 0x2B00 //向USB端点2的发送缓冲区写入数据块
//中断状态值定义
#define USB_INT_EP1_IN 0x09 // USB端点1的IN……发送完毕
#define USB_INT_EP2_OUT 0x02 // USB端点2的OUT……接受到数据
#define USB_INT_EP2_IN 0x0A // USB端点2的IN……发送完数据
//操作状态值定义
#define CMD_RET_SUCCESS 0x5100 // 命令操作成功
#define CMD_RET_ABORT 0x5F00 // 命令操作失败
#define DELAY_START_VALUE 3 // 根据单片机的时钟选择初值,20MHz以下为0,30MHz以上为2
// 延时1微秒,不精确,需要根据硬件实际情况调整
void Delay1us(void)
{
#if DELAY_START_VALUE != 0
uchar i;
for ( i=DELAY_START_VALUE; i!=0; i-- );
#endif
}
// 延时2微秒,不精确,需要根据硬件实际情况调整
void Delay2us(void)
{
uchar i;
for ( i=DELAY_START_VALUE*2+1; i!=0; i-- );
}
// 与CH372/CH375有关的基本I/O操作
void CH375_WR_CMD_PORT( uchar cmd ) // 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时
{
P_IOB_Data=P_IOB_Data|cmd; //写要传输的命令
P_IOB_Data=P_IOB_Data|0x0008;
P_IOB_Data=P_IOB_Data&0xFF9F; //设置为写命令
/*CH372_CS_ON;
CH372_CMD_PORT;
CH372_RD_OFF;
CH372_WR_ON;*/
//P_IOB_Data=0X0011&P_IOB_Data;
Delay2us();
P_IOB_Data=0x0076;//停止传输
}
void CH375_WR_DAT_PORT( uchar dat ) // 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时
{
uchar tmp;
tmp=dat<<2; /////////??????????????????//////////////////////////////////////////////////
P_IOB_Data=P_IOB_Data|temp; //写要传输的数据
P_IOB_Data=P_IOB_Data&0xFF97; //设置为写数据
/*CH372_SET_OUT;
CH372_CS_ON;
CH372_DATA_PORT;
CH372_RD_OFF;*/
Delay2us();
P_IOB_Data=0x0076; //停止传输
}
uchar CH375_RD_DAT_PORT( void ) // 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时
{
uchar tmp;
tmp=0;
P_IOB_Data=P_IOB_Data&0xFFA7; //设置为读数据
/*CH372_SET_IN;
CH372_CS_ON;
CH372_DATA_PORT;
CH372_WR_OFF;
CH372_RD_ON;*/
Delay2us();
tmp=P_IOB_Data>>2; ////??????????????? ///////////////////////??????????????????????
Delay1us();
P_IOB_Data=0x0076; //停止传输
return tmp;
}
//CH375初始化子程序
/*B口初始化
dir=0xfff4
attrib=0xfff4
data=0x0076
*/
void CH375_Init( void )
{
typedef unsigned char uchar;
uchar i;
/*CH375_WR_CMD_PORT( SET_USB_ID ); // 设置厂商
CH375_WR_DAT_PORT( 14 ); // 设置厂商VID低字节
CH375_WR_DAT_PORT( 23 ); // 设置厂商VID高字节
CH375_WR_DAT_PORT( 0 ); // 设置厂商PID低字节
CH375_WR_DAT_PORT( 1 ); // 设置厂商PID高字节
Delay1us();*/
CH375_WR_CMD_PORT( CMD_SET_USB_MODE ); // 设置USB工作模式, 必要操作
CH375_WR_DAT_PORT( 2 ); // 设置为使用内置固件的USB设备方式
for ( i=100; i!=0; i-- )
{
if ( CH375_RD_DAT_PORT() == CMD_RET_SUCCESS )
break; //等待操作成功,通常需要等待10uS-20uS
}
}
//CH375中断服务程序,假定CH375的INT#引脚连接到单片机的INT0,使用寄存器组1
#pragma vector=PORT2_VECTOR
__interrupt void CH375Interrupt( void )
{
uchar cnt;
uchar dat;
uchar IntStatus;
if(P2IFG&0x10)
{
CH375_WR_CMD_PORT(0x2200H); /*CMD_GET_STATUS 获取中断状态并取消中断请求 */
IntStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */
/* IE0 = 0; 清中断标志,与单片机硬件有关,对应于INT0中断 */
if ( IntStatus == USB_INT_EP2_OUT ) /* 批量端点下传成功,接收到命令包 */
{
CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */
cnt = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */
for (dat=0;dat<cnt;dat++)
{
USBbuf[dat]=CH375_RD_DAT_PORT( ); /* 接收命令包的数据 */
}
USB_GET = 1;
}
else if ( IntStatus == USB_INT_EP2_IN ) /* 批量数据发送成功,状态包已发送 */
{
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */
}
else if ( IntStatus == USB_INT_EP1_IN ) /* 中断数据发送成功,本程序未用到 */
{
CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */
}
}
else if(P2IFG&0x20)
{
if(Clock_Cnt>0)
{
Clock_Cnt--;
if(Clock_Cnt==0)
{
Page = Main_Page;
Renew_Page = 0;
KEYCODE = 0;
}
}
}
P2IFG = 0x00;
}
//----------------------------------------------------------------------------------------------------------
void USB_Send_Data(uchar a[],uchar cnt)
{
uchar i;
CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块
CH375_WR_DAT_PORT( cnt ); // 首先写入后续数据长度
for(i=0;i<cnt;i++)
{
CH375_WR_DAT_PORT( a[i] ); // 写入数据到CH375
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -