1

这是我多年来一直试图解决的问题,定期花费 1-2 个月的时间。

我正在使用 Metrowerks IDE 和 ColdFire C 编译器 MCFCCompiler 4.0 版来构建使用 USB 模块与主机通信的嵌入式代码。带有这种硬件的产品已经推出了八年并且相当成功。然而,这些年来我们收到了来自现场的抱怨,称与主机的通信偶尔会挂断,操作无法恢复。

我使用 USB 嗅探器和 Coldfire 调试硬件跟踪了错误,这是我在其中找到代码的条件和场景。

  1. 通信中断发生在固件端,而不是主机上的驱动程序。

  2. 仅当从多个线程快速发送主机(Windows 7)的 USB 固件命令时才会发生挂起。每个固件命令都会回复主机。因此,通过 USB 端口的流量最大。

  3. 我正在使用摩托罗拉提供的实现,该实现在 USB-STAND-ALONE-DRIVER_V03.pdf 中有详细记录(谷歌会为您找到它)。有两个函数是我关注的重点,它们应该很好地配合使用:usb_in_service(由中断处理程序调用)和 usb_tx_data(启动传输,在某些时候会产生中断)。

  4. 实现了 usb_tx_data 函数,以便在 USB fifo 仍有数据要发送到主机时退出。但是等待fifo清除会使代码进入无限循环。

  5. 尽管 USB 模块的寄存器内容告诉我中断已启用,但此后不再发生中断。

  6. 我检查了 USB 模块没有收到重置事件,也没有挂起。

主要问题是错误是在 USB 模块硬件中还是在代码中。我没有发现任何指向这个问题的勘误表。如果是代码,那么逻辑没有考虑到的整体在哪里?

紧追不舍,因为我们正在制作基于相同固件的新产品线,在解决此问题之前我无法发布它。

4

0 回答 0