我用arm7控制ch375与PC相连作U盘,芯片的初始化完成之后(芯片初始化完成Ok,PC中也有一个CH375的外部设备)进入循环等待中断,可是一直没有中断产生,这是为什么?
可以不可以将你的功能描述清楚点?如果是PC-375-ARM做U盘的话,那么,你就需要将375设置模式为0X01(外置固件模式),然后模拟出一个U盘出来,计算机才会给你命令,375才会产生中断
设置成外置模式该如何模拟?我试了一下设置成外置模式,不过只能检测到复位中断,这是为什么?
设置外置固件的话,需要单片机通过372上传描述符,以及你需要知道UFI协议,计算机给你发的UFI协议的话,你要正确的返回,计算机才可以识别到你的设备是一个U盘,当然,你也要遵循海量存储协议
我也正在搞这个东西,没有进展啊,呵呵,原来做过D12的,现在用这个反而没了主意
实际上用D12或者我们的372芯片的话,真正意义上面的区别可能就是一些命令包括一些寄存器的操作方法不一样而已,最底层的协议还是一样的
在复位中断里加入读端口和解锁
查阅了USB设备枚举过程的相关资料发现:“设备要从总线接收到一个复位信号后才可对总线的处理操作作出响应。当设备接收到复位信号后就使用缺省地址(00H)来对其进行寻址。 请问这句话该如何理解?对于CH375该如何处理??
“在复位中断里加入读端口和解锁”,试过了,没用! 没人帮忙吗?顶上去!!!
void CH375_Init(void) { uint8 i,data; USB_COMW(CMD_RESET_ALL); DelayMS(2); USB_COMW(CMD_SET_USB_ID); USB_DATW(0x18); USB_DATW(0x07); USB_DATW(0x02); USB_DATW(0x00); USB_COMW(CMD_CHECK_EXIST); USB_DATW(0x55); data=USB_DATR(); if(data!=0xaa) { for(i=100;i!=0;i--) USB_COMW(CMD_RESET_ALL); } USB_COMW(CMD_SET_USB_MODE); DelayMS(2); USB_DATW(0x01); for(; ;) { if(CMD_RET_SUCCESS==USB_DATR()) break; } USB_COMW(CMD_SET_USB_ADDR); DelayMS(2); USB_DATW(0x00); EXTINT=0x08;//清除Eint3中断标志 VICIntEnable=1<<17; } 这是我的初始化函数,各位帮忙看看有什么问题? 说明:如改用内部固件模式,会有端口2上的中断产生,并且可以正确处理。就是用外部固件模式时,只有复位中断,这到底是为什么? 还请沁恒的哥们快出来给个答复,这个问题已经困扰我好几天了!!!
USB_COMW(CMD_RESET_ALL); DelayMS(2); USB_COMW(CMD_SET_USB_ID);修改为: USB_COMW(CMD_RESET_ALL); DelayMS(100); USB_COMW(CMD_SET_USB_ID);
引用回复: USB_COMW(CMD_RESET_ALL); DelayMS(2); USB_COMW(CMD_SET_USB_ID);修改为: USB_COMW(CMD_RESET_ALL); DelayMS(100); USB_COMW(CMD_SET_USB_ID); 刚刚试过,没有用,还是只有复位中断!
好象你的程序上面有问题啊,首先,建议你在复位之后不要设置USB-ID,其次,在的设置好外置固件之后,那么你应该是被动的等待主机给你发送的请求,你才可以上传数据。首先你应该分析主机发送下来的数据,如果是控制传输的话,那么你应该给计算机上传一些描述符,以及接收一些类请求之类的,按照你所说的,372是不会给你产生中断的,你可以参考CH372EVT。ZIP下面的XFIRM文件夹下面的例子程序,那个程序就是372外置固件的整个的流程
谢谢hcn,已经可以正确收到中断信号! 不过,我参照CH372EVT中的处理流程,到了第二步Set Address之后就没有相应了。 具体过程如下: 1.收到总线复位中断之后,释放缓冲区。 2.收到USB_INT_EP0_SETUP中断,根据中断内容判定为是Get Descriptor请求,向端点0上传设备描述符的前8个字节。 3.收到USB_INT_EP0_IN中断,将剩余的10个字节的设备描述符上传并释放缓冲区。 4.收到USB_INT_EP0_OUT中断,读取缓冲区。 5.收到USB_INT_EP0_SETUP中断,根据中断内容判定为是Set Address请求,保存地址值(0x01),向端点0上传长度0。 6.收到USB_INT_EP0_IN中断,设置USB地址为0x01,并释放缓冲区。 第6步结束之后就没有响应了。还请hcn帮忙看看我的处理是否有错? 按正确的枚举过程,设置完地址之后是不是也会收到一个USB_INT_EP0_OUT中断? 设置完地址之后,是不是还需要发送什么命令告诉主机?
首先,描述符每次只能上传8个字节,其次就是在收到主机给你发送来的地址的话,只需要保存下,给主机返回一个0长度的数据之后就可以了,不需要做别的事,接下来就是主机给你发送获取配置描述符的命令了
“首先,描述符每次只能上传8个字节,”:你意思是在第一次收到Get Descriptor请求时,只需要传送描述符的前8个字节就结束中断处理;还是每次传输8个字节,然后清空缓冲区,接着再传输8个字节直到将描述符全部传输完毕才结束中断处理?
“其次就是在收到主机给你发送来的地址的话,只需要保存下,给主机返回一个0长度的数据之后就可以了,不需要做别的事,接下来就是主机给你发送获取配置描述符的命令了”:根据USB1.1协议,在主机发出Set Address命令之前,它是通过地址0传输命令的,而发送完Set Address命令之后,它就只向它Set Address命令之中包含的这个地址发送命令了,如果作为device的Ch375不调用SET_USB_ADDR来设置新地址的话怎么能收到主机以后发出的命令呢?