用CH372实现U盘与单片机通信功能
扫描二维码
随时随地手机看文章
该系统的程序设计主要包括两大部分,分别是USB接口部分固件程序和计算机端的CH372驱动程序。前者主要包括了单片机和CH372的初始化、读写接口程序和中断服务程序;后者包括了USB设备的驱动程序和相关应用程序的编写。这里主要介绍USB接口部分固件程序。
在本例中CH372工作在内部固件模式,通过8位并行数据总线挂接到单片机AT89C51上,并通过端点2上的上传端点和下传端点完成USB数据的读写。在本地端,CH372芯片以内置的固件程序自动处理了USB通信中的基本事务,在计算机端,提供了驱动程序的应用层调用接口,用以完成USB设备与计算机间的通信。
由于CH372支持内部固件模式,以内置的固件程序自动处理USB通信中的基本事务,所以程序设计不需要考虑USB枚举配置过程,大大简化了程序。
1.变量定义和基本操作函数
该部分主要包括了CH372命令、数据端口地址的定义,对操作命令码的定义,延时函数以及CH372的数据读写和写命令基本操作函数等几部分内容。
(1)变量的定义。
该部分主要包括了对CH372命令、数据端口地址、USB数据缓冲区以及操作命令代码的定义,其程序代码如下:
(2)基本操作函数。
该部分是进行CH372读写的基本操作程序,主要包括以下几个函数。
函数DelayMs:延时毫秒。
函数Delayus:延时微秒。
函数WR_CH372_CMD_PORT:向CH372命令端口写命令数据。
函数WR_CH372_DAT_PORT:向CH372数据端口写数据。
函数RD_CH372_DAT_PORT:从CH372命令端口读数据。
①函数DelayMs:在CH372读写过程中需要用到毫秒延时,该函数可以满足要求,程序代码如下。
②函数Delayus:在读写命令的过程中经常要用到微秒的延时,该函数可以用来调用,其程序代码如下。
③函数WR_CH372_CMD_PORT:用以向CH372命令端口写命令数据,周期不小于4μs,如果太快则延时,其程序代码如下。
④WR_CH372_DAT_PORT:用以向CH372数据端口写数据,周期不小于1.5μs,如果太快则延时,其程序代码如下。
⑤RD_CH372_DAT_PORT:用以从CH372命令端口读数据,周期不小于1.5μs,如果太快则延时,其程序代码如下。
2.系统初始化
系统初始化包括单片机的初始化和CH372的初始化。单片机的初始化主要是完成外部中断INTO、I/O口等的初始化,程序较为简单,在这里不做详细介绍。CH372初始化主要用以其上电复位后,将默认的工作模式(未启用模式)初始化为外部固件模式或内部固件模式,并检查CH372的工作状态是否正常,以便对错误进行及时处理。其流程图如下图所示。
CH372初始化的程序代码如下。
3.读写接口函数及中断服务函数
本例中CH372工作在内部固件模式,使用端点2的上传端点和下传端点。CH372芯片专门用于处理USB通信,在检测到USB总线的状态变化时或者命令执行完成后,CH372以中断方式通知单片机进行处理。
该部分主要包括以下3个函数。
函数CH372_RD_EP2:CH372的读取数据程序。
函数CH372_WR_EP2:CH372的写数据程序。
函数CH372_lnt0:CH372中断服务程序。
(1)CH372的读取数据函数CH372_RD_EP2。
该函数主要用以实现从CH372端点2的上传端点读出上位机发来的数据,单次的最大长度为64字节,当收到上位机数据后产生USB_INT_EP2_OUT(02)中断。其程序代码如下。
(2)CH372的写数据函数CH372_WR_EP2。
该函数主要实现向CH372端点2的上传端点写入Length长度的数据,单次最大长度为64字节,当上位机接收数据后产生USB_INT_EP2_IN(OA)中断。其程序代码如下。
(3)CH372的中断服务函数CH372_1nt0。
该函数为外部中断服务函数,主要用以响应USB接口芯片的中断。中断服务函数的工作步骤如下。
①单片机进入中断服务程序时,首先执行GET_STATUS命令获取中断状态。CH372在GET_STATUS命令完成后,将INT#引脚恢复为高电平,取消中断请求。如果通过上述GET_STATUS命令获取的中断状态是下传成功,则单片机执行RD_USB_DATA命令从CH372读取接收到的数据,CH372在RD_USB_DATA命令完成后释放当前缓冲区,从而可以继续USB通信。单片机退出中断服务程序;如果通过上述GET_STATUS命令获取的中断状态是上传成功,则单片机执行WR._USB_DATA命令向CH372写入另一组要发送的数据。如果没有后续数据需要发送,单片机就不必执行WR_USBDATA命令。
②单片机执行UNLOCK_USB命令。
CH372在UNLOCK_USB命令完成后释放当前缓冲区,从而可以继续USB通信。
③单片机退出中断服务程序。
如果单片机已经写入了另一组要发送的数据,则CH372被动地等待USB主机在需要时取走数据,然后继续等待CH372向单片机请求中断,否则结束。
CH372的中断服务函数的程序代码如下:
注意事项
1.硬件方面
(1)在设计PCB板时应注意:退耦电容C3和C4尽量靠近CH372的相连引脚;UD+和 UD-信号线贴近平行布线,尽量在两侧提供地线或者覆铜,减少来自外界的信号干扰;尽量缩短XI和XO引脚相关信号线的长度,在相关元器件周边环绕地线或者覆铜。
(2)为进一步地保护CH372的UD+和UD-信号线,对于需要频繁带电插拔USB设备的应用场所或静电较强的环境,建议在电路中增加USB信号瞬变电压抑制器件。
(3)对于支持睡眠功能的CH372芯片,在其睡眠期间,应该使CH372的各个I/O引脚(除RSTI引脚)处于悬空或者高电平状态,避免产生不必要的上拉电流。
2.软件方面
在单片机程序设计中,应注意命令的延时及读取数据的时间间隔。主程序在检测到USB设备连接后,等待数百毫秒再对其进行操作。