Thread 中讨论的其他器件:SysConfig、 C2000WARE、 TMS320F28069
工具/软件:
我尝试让 USB MSC 主机应用程序运行原型硬件。
我在硬件上成功运行了"usb_msc_host_ex7"示例、只做了少量修改(时钟设置、引脚分配等)。 我可以连接闪存驱动器、程序会枚举它并装载 FAT 文件系统。
当我尝试从 CPU2而不是 CPU1与 USB 进行交互时、问题就会开始。 USB 外设看起来自发退出主机模式并进入设备模式、然后一直保持该状态。
我尝试对示例代码进行少量更改。 在 SysConfig 中为 CPU2设置了 USB 外设+库。
CPU1伪代码:
-运行 device_init ()、board_init ()等来设置时钟和其他硬件。
-运行"SysCtl_selectCPUForPeripheralInstance(SysCtl_CPUSEL_USBA, SysCtl_CPUSEL_CPU2 );"将 USB 外设控制传输至 CPU2。
-引导 CPU 2并要求它开始初始化(通过 IPC 标志)。
-等待 CPU 2完成初始化(通过 IPC 标志)。
-启用中断并启动主循环。
CPU2伪代码:
-等待 CPU 1指示我们开始初始化。
-运行 device_init ()、board_init ()等
-运行 C2000ware_libraries_init ()。 值得注意的是、这也称为"USBStackModeSet (0、eUSBModeForceHost、ModeCallback);"、因为 SYSCTL 知道我们要在主机模式下运行。
-告诉 CPU1我们完成了初始化(通过 IPC 标志)。
-启用中断并启动主循环。 主循环调用 USBHCDMain ()(从 usbhost.h )并监控状态。
具体情况如下:
1.系统启动成功。 此时、USBDEVCTL 寄存器包含 DEV=0、HOST=0且 FSDEV=0。
2.一旦启用中断、USB_INTCTRL_MODE_DETECT 中断就会熄灭。 除了 USBIDVISC=1之外、没有任何变化。 主循环开始运行。
3.插入闪存盘。 USB_INTCTRL_CONNECT 中断会关闭。 此时、USBDEVCTL 寄存器包含 DEV=0、HOST=1、FSDEV=1。
4.主循环调用 USBHCDMain (),可以看到设备已连接。 USBHCDMAIN()调用 USBHCDReset()以复位器件。
5. USB_INTCTRL_RESET 中断发出。 此时、USBDEVCTL 寄存器包含 DEV=1、HOST=0、FSDEV。 USB 控制器已确定它不再是主机、现在是设备。
——请注意,在 ISR 启动时 USBDEVCTL 已经发生了变化,所以 ISR 不能引起这个问题。
——请注意,这种情况发生在主上下文甚至从 USBHCDReset ()返回之前。
6.同时,USBHCDMain ()继续通过其状态机运行。 它启动控制传输以检索设备描述符、但控制传输会一直挂起、因为 USB 控制器认为它处于设备模式。 断开并连接闪存驱动器不再触发中断。
通读本文档后、我很难理解 USB 控制器如何决定处于哪种模式。 这似乎是一个动态过程、具体取决于 D+和 D-引脚的状态、以及(不存在) ID 和 Vbus 检测引脚的状态。 是否有人知道总线复位后为什么外设可能自行设置为器件模式? 另一张海报 过去似乎也有同样的问题、采用了 TMS320F28069。
谢谢!