1. CH37x系列产品简介
1) CH370:USBHost功能接口芯片,并口、SPI接口通讯,通用USB主机接口,支持控制、批量、中断、等时传输,支持12Mbps全速和1.5Mbps低速通讯,可操作Hub。
2) CH372:USB Device功能接口芯片,并口通讯,通用USB设备接口,可配置内置固件模式(自动处理端点0所有事务)或者外置固件模式,支持控制、批量、中断传输,支持12Mbps全速通讯。
3) CH374:USB Host/Device功能接口芯片,并口/SPI通讯,支持控制、批量、中断和同步传输,支持12Mbps全速和1.5Mbps低速通讯,内置3端口Hub。
4) CH375:USB Host/Device功能接口芯片,设备功能与CH372完全兼容,并口/UART通讯,支持动态切换主机与设备方式,内置Mass Storage专用通讯协议固件,支持控制、批量和中断传输,兼容USB2.0 ,支持12Mbps全速和1.5Mbps低速通讯。
5) CH376:USB Host/Device功能接口芯片,设备方式完全兼容CH372,主机方式基本兼容CH375,支持并口/SPI/UART通讯方式,支持动态切换主机与设备方式,内置Mass Storage专用通讯协议固件和FAT12/FAT16/FAT32文件系统管理固件,支持控制、批量和中断传输,兼容USB2.0 ,支持12Mbps全速和1.5Mbps低速通讯。
6) CH378:USB Host/Device功能接口芯片,支持SPI/并口/串口通讯方式,主机功能专用于管理高速U盘,SD卡。设备功能支持12Mbps全速和480Mbps高速USB通讯。
表1 CH37x产品简介与选型
2. 正常的U盘操作流程(以375 USB Host操作U盘为例)
操作流程如图1所示。文件名的创建更改、文件属性的修改等操作类似文件的读写操作,可以参考相关芯片的EVT例程。
图1 375 USB Host操作U盘
3. 通用USB设备枚举过程(以CH375操作键盘为例)
1) 总线复位(BUS Reset);
2) 检测设备速度,需根据设备速度决定是否需要切换芯片通讯速度到低速。(芯片默认为全速)
3) 获取设备描述符(Get Device Descriptor);
4) 可选,总线复位(Bus Reset),若总线复位,芯片通讯速度再次复位到全速,需根据设备速度决定是否需要切换芯片通讯速度到低速;
5) 设置地址(Set Address);
6) 获取设备描述符(Get Device Descriptor);
7) 获取配置描述符集合(Get Configuration Descriptor);
8) 获取字符串描述符(Get String Descriptor),可选过程,若有字符串描述符,则根据字符串描述符索引号获取相应字符串描述符;
9) 设置配置(Set Configuration);
/* 以下是设备类命令或厂商命令相关过程*/
10) 获取报告描述符(Get Report Descriptor),HID特有过程;
11) 设置空闲(Set Idle),HID特有过程;
12) 设置报告(Set Report),HID特有过程。
建议:某些不常用的设备描述符,或者厂商自定义描述符可以通过BUS Hound等抓包工具来抓包分析该设备的枚举过程。
4. 模拟USB设备过程及注意点(以375模拟HID键盘为例)
如图2、图3所示,初始化CH375之后,查询CH375中断状态,若有中断发生,使用GET_STATUS命令获取中断状态(CH375的设备方式与CH372完全兼容,具体操作流程参考CH372DS2.PDF)。IN中断上传数据,OUT中断接收主机下传数据,SETUP中断时根据相应SETUP请求返回相应数据。值得一提的是:
当IN中断到来时,应该在IN中断发生后立即使用UNLOCK_USB命令释放缓冲;
当OUT或SETUP中断到来,则应用OUT中断中使用RD_USB_DATA来读取IN端点缓冲区数据,并释放缓冲(该命令包含释放缓冲功能,不需额外使用UNLOCK_USB命令)。
对于任何一个CH372中断,必须唯一对应一个UNLOCK_USB命令或者RD_USB_DATA命令。中断的框架大体如下流程图所示,详细可参考我司CH372EVT.ZIP下的CH372FRM.C文件。
图2 CH375操作模拟键盘流程图
图3 CH375枚举流程图
关于CMD_UNLOCK_USB命令的相关解释:
该命令释放当前USB缓冲区,CH37x向单片机请求中断之前会锁定当前缓冲数据,以防缓冲区被其他数据覆盖,当单片机读取缓冲数据之后必需写CMD_UNLOCK_USB命令来解锁释放当前缓冲区。所以,当CH37x做设备时,OUT中断发生时应读取缓冲数据之后再解锁缓冲,而IN中断发生在缓冲数据发送之后,代表缓冲内数据已空,应先解锁缓冲,再往缓冲内写数据。