void CH375_INIT() { unsigned char i; unsigned char xdata str[20]; lcd_init() ;
CH375_WR_CMD_PORT(CMD_CHECK_EXIST); //测试CH375是否正常工作 CH375_WR_DAT_PORT(0x55); //写入测试数据 i = CH375_RD_DAT_PORT(); //返回数据应该是测试数据取反
if(i != ~0x55) { for ( i=80; i!=0; i-- ) { CH375_WR_CMD_PORT(CMD_RESET_ALL); //多次重复发命令,执行硬件复位 */ CH375_RD_DAT_PORT(); } CH375_WR_CMD_PORT(0); delay_ms(15); //延时50ms sprintf(str,"####################"); print_str(2,0,str); } CH375_WR_CMD_PORT(CMD_SET_USB_MODE); CH375_WR_DAT_PORT(0x02); //设置为使用内置固件的USB设备方式 */ delay_ms(50); i = CH375_RD_DAT_PORT(); if(i == CMD_RET_SUCCESS) { sprintf(str,"枚举成功!%bx ",CMD_RET_SUCCESS); print_str(1,0,str); } else { sprintf(str,"枚举失败!%x ",CMD_RET_ABORT); print_str(1,0,str); } /*******************外部中断0初始化*************************/ IT0 = 0; //低电平触发 EX0 = 1; //开外部中断0 EA = 1; //开中断总开关 }
void CH375_ISR() interrupt 0 using 2 { unsigned char status = 0; unsigned char i, length; unsigned char buffer[20]; uchar xdata str2[20]; EA = 0;
CH375_WR_CMD_PORT(CMD_GET_STATUS); //获取中断状态并取消中断请求 status = CH375_RD_DAT_PORT(); //获取中断状态 sprintf(str2,"status: %bx ",status); print_str(2,0,str2); switch (status) { //分析中断状态处理 case USB_INT_EP2_OUT: //批量端点下传成功 { CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 length = CH375_RD_DAT_PORT(); //首先读取后续数据长度 for(i=0; i { buffer[i] = CH375_RD_DAT_PORT(); //接收数据包 } buffer[i] = '\0'; CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(length); // 首先写入后续数据长度,回传刚接收到的数据长度 for ( i=0;i< length; i++) { CH375_WR_DAT_PORT(buffer[i]+1); // 数据取反后返回,由计算机应用程序测试数据是否正确 */ } break; } case USB_INT_EP2_IN: //批量数据上传成功 { CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } default: { //其它中断,未用到,解锁后退出即可 CH375_WR_CMD_PORT(CMD_UNLOCK_USB); //释放当前USB缓冲区 break; } } // EA = 1; }
想问沁恒的工程师们一个问题,我最近做一个项目,用的是华邦单片机做USB设备开发,CH375枚举成功,发送数据后也能响应中断,但是在中断服务程序中用CH375_WR_CMD_PORT(CMD_GET_STATUS);获得中断状态,返回中断状态傎都是0,测中断引脚一直为低电平,也就是说CH375_WR_CMD_PORT(CMD_GET_STATUS)命令执行不成功,不然的话,这个引脚会变成高电平,请问我的说法是不是正确?上面贴的是初始化和中断程序,问题急待解决,匆吝赐教!