DeviceCDC&HostMSC-------------项目文件
STM32Cube_FW_F4_V1.10.0-------官方cube库(有几处修改)
STM-VCP-DRIVER.zip------------官方虚拟串口驱动
程序实现了MSC主机和CDC设备的功能。设备处于哪种角色取决于ID线的状态:当ID线接地或插入microA接口时,设备工作于MSC主机模式;当ID线悬空或插入microB接口时,设备工作于CDC设备模式,在上电状态也可以热切换。
设备工作于MSC主机模式时,会在插入的U盘根目录创建“STM32.TXT”文件,并写入“This is STM32 working with FatFs ”文本。
设备工作于CDC设备模式时,在PC端会形成一个虚拟串口,PC通过串口发送给设备的数据,设备会回复给PC。
为了根据ID线自动切换工作模式,需要对cube库修改。
对cube库的修改项:
---------------------------------------------------------------------------------------
1、USBD_Init-->USBD_LL_Init-->HAL_PCD_Init-->USB_SetCurrentMode
此处由USB_OTG_DEVICE_MODE修改为USB_OTG_DRD_MODE。
2、USBH_Init-->USBH_LL_Init-->HAL_HCD_Init-->USB_SetCurrentMode
此处由USB_OTG_HOST_MODE修改为USB_OTG_DRD_MODE。
3、USBH_Init-->USBH_LL_Init-->HAL_HCD_Init-->USB_HostInit
此处根据cfg.Sof_enable决定是否打开SOF中断,原程序默认打开SOF中断,会每1ms产生SOF中断传递给CLASS,实际上MSC-CLASS没用到这个中断。
4、usbd_cdc_interface.c
与官方的CDC例子相比,去掉了串口相关的操作以及TIM,改为回环模式,在后台发送数据。
5、stm32f4xx_it.c-->OTG_FS_IRQHandler
同时加入主机中断和设备中断处理函数,函数第一步会判断模式,所以不会产生冲突。
----------------------------------------------------------------------------------------
后台中的USB_ModeSwitch函数根据CMOD位判断模式是否改变,以关闭当前模式和初始化另一个模式,是因为当初始化时USB_SetCurrentMode设置为USB_OTG_DRD_MODE,而且不使能HNP功能时,USBx->GINTSTS的CMOD位完全由ID线决定。后台主机的应用和设备的应用也要先判断当前模式是否相符。
遗留的一个BUG:工作在设备虚拟串口模式时,向PC一次性发的数据包不能是64(最大包长)的整数倍,不然PC认为下位机发送没有完成,不会通知上层。这种情况,下位机可以再发一个零长度的包作为结束。
------------------------------------------------------------------------
官方CUBE库里面没有USB主机兼USB设备的例子,因项目要求同一个USB口能支持U盘读写和与PC通信,自己就按照官方例子写了个例程。
程序实现了MSC主机和CDC设备的功能。设备处于哪种角色取决于ID线的状态:当ID线接地或插入microA接口时,设备工作于MSC主机模式;当ID线悬空或插入microB接口时,设备工作于CDC设备模式,在上电状态也可以热切换。
设备工作于MSC主机模式时,会在插入的U盘根目录创建“STM32.TXT”文件,并写入“This is STM32 working with FatFs ”文本。
设备工作于CDC设备模式时,在PC端会形成一个虚拟串口,PC通过串口发送给设备的数据,设备会回复给PC。
USBH_D_Demo.zip
(3.81 MB, 下载次数: 178)
cube库目前好像真没有复合设备的例程。不过非CUBE库文件有。
stm32_f105-07_f2_f4_usb-host-device_lib.zip
(3.73 MB, 下载次数: 95)
|