这是我多年来试图解决的问题,定期花费1-2个月。
我正在使用Metrowerks IDE和ColdFire C编译器MCFCCompiler ver 4.0来构建使用USB模块与主机通信的嵌入式代码。使用这种硬件的产品已经推出八年并且非常成功。然而,这些年来,我们得到了现场的投诉,偶尔与主机的通信挂断,操作无法恢复。
我使用USB嗅探器和Coldfire调试硬件跟踪了这个错误,这是条件和我找到代码的情况。
通信中断位于固件端,而不是主机上的驱动程序。
只有在主机(Windows 7)从多个线程快速发送USB固件命令时才会发生挂起。每个固件命令都会回复主机。因此通过USB端口有最大流量。
我正在使用摩托罗拉提供的实现,USB-STAND-ALONE-DRIVER_V03.pdf中有详细记录(谷歌会为您找到它)。我的焦点有两个函数,它们应该很好地结合在一起:usb_in_service(由中断处理程序调用)和usb_tx_data(启动传输,在某些时候会产生中断)。
如果USB fifo仍然有数据要发送给主机,则实现usb_tx_data函数使其失效。但等待fifo清理会使代码进入无限循环。
此后不再发生中断,尽管USB模块的寄存器内容告诉我中断已启用。
我检查过USB模块没有出现重置事件,也没有暂停。
主要问题是错误是在USB模块硬件中还是在代码中。我找不到指出这个问题的勘误表。如果它是代码,那么整个逻辑不在哪里?
由于我们正在基于相同的固件制作新的产品系列,因此我们无法释放它直到解决这个问题。