您现在的位置: 主页 > 嵌入式开发入门到精通 > 单片机技术进阶 > 用CH372实现U盘与单片机通信功能 -
本文所属标签:
为本文创立个标签吧:

用CH372实现U盘与单片机通信功能 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]
  该系统的程序设计主要包括两大部分,分别是USB接口部分固件程序和计算机端的CH372驱动程序。前者主要包括了单片机和CH372的初始化、读写接口程序和中断服务程序;后者包括了USB设备的驱动程序和相关

  该系统的程序设计主要包括两大部分,分别是USB接口部分固件程序和计算机端的CH372驱动程序。前者主要包括了单片机和CH372的初始化、读写接口程序和中断服务程序;后者包括了USB设备的驱动程序和相关应用程序的编写。这里主要介绍USB接口部分固件程序。
  
  在本例中CH372工作在内部固件模式,通过8位并行数据总线挂接到单片机AT89C51上,并通过端点2上的上传端点和下传端点完成USB数据的读写。在本地端,CH372芯片以内置的固件程序自动处理了USB通信中的基本事务,在计算机端,提供了驱动程序的应用层调用接口,用以完成USB设备与计算机间的通信。
  
  由于CH372支持内部固件模式,以内置的固件程序自动处理USB通信中的基本事务,所以程序设计不需要考虑USB枚举配置过程,大大简化了程序。
  
  1.变量定义和基本操作函数
  
  该部分主要包括了CH372命令、数据端口地址的定义,对操作命令码的定义,延时函数以及CH372的数据读写和写命令基本操作函数等几部分内容。
  
  (1)变量的定义。
  
  该部分主要包括了对CH372命令、数据端口地址、USB数据缓冲区以及操作命令代码的定义,其程序代码如下:

本文引用地址: http://www.21ic.com/app/mcu/201806/761084.htm

  (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设备连接后,等待数百毫秒再对其进行操作。




              查看评论 回复



嵌入式交流网主页 > 嵌入式开发入门到精通 > 单片机技术进阶 > 用CH372实现U盘与单片机通信功能 -
 

"用CH372实现U盘与单片机通信功能 -"的相关文章

网站地图

围观()