我们需要一些帮助来解决 LPC55S69 上的 USB 数据损坏问题
(或者问题可能出在 i.MX8M Quad 上)。
我们正在构建一个系统,其中包括一个用作 USB 主机的 i.MX8M,
连接到一个用作高速 USB 设备的 LPC55S69。我们看到
从主机发送并由 LPC55S69 接收的 USB 消息
在存储到 RAM 中时已损坏。我使用了 Beagle USB
480 分析器来捕获总线流量,它看到了完整的数据,
这表明 LPC55S69 中正在发生损坏。但是,
当 x86 笔记本电脑用作主机时,这种损坏永远不会发生,
而当 i.MX8M 用作主机时,这种损坏会非常频繁地发生。使用 x86 PC 作为主机,我可以无误地
发送(并接收回复)数十万条连续消息,但使用 i.MX8M 作为
一个主机在失败之前我最多得到一两次正确的传输。我
无法确定
PC 发送的消息和 i.MX8M 发送的消息之间的具体区别。
我们最初遇到 DFU 协议数据包的问题
,但已将我们在 MCU 中的代码缩减为简单的
供应商定义的“回显”协议,以便轻松
重现该问题。它只是将消息接收到缓冲区中,然后允许
主机请求将相同的缓冲区发回。CPU 不
读取或写入缓冲区。用于此测试的主机端软件是一个
小型 Python 3 程序。
数据损坏的特定形式通常仅限于
接收到的消息的前 16 个字节,并且通常会影响整个 32 位
字,但不一定会影响前 16 个字节中的所有 32 位字
。例如,我们可能会看到只有
缓冲区的第二个和第四个字是损坏的。每个损坏的字都包含
消息后面某个其他 32 位字的副本。
64 字节或更短的消息不会遇到这种损坏。使用 80 字节的传输很
容易重现,并且至少达到
512 字节也是如此。使用LPC55S69 的全速接口时不会出现此问题
- 仅在高速接口上出现。
使用 MCIMX8M-EVKB 作为主机、
运行 NXP 参考 Linux (4.9.88-imx) 图像并添加
Python 3“usb”模块和 LPCXpresso55S69
开发板作为
设备可以重现该问题。
典型的测试运行如下所示:
root@imx8mqevk:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Founda
tion 3.0 root hub
Bus 001 Device 002: ID 1fc9:0094 NXP Semiconductors
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@imx8mqevk:~# date | ./usbecho
Found 001:002 1FC9:0094 MCU VIRTUAL COM DEMO None
Data payload is 29 bytes.
Good match.
Success: received data matched sent data.
root@imx8mqevk:~# dd if=/dev/urandom bs=80 count=1 of=/tmp/shortfile
1+0 records in
1+0 records out
80 bytes copied, 0.000155521 s, 514 kB/s
root@imx8mqevk:~# ./usbecho < /tmp/shortfile
Found 001:002 1FC9:0094 MCU VIRTUAL COM DEMO None
Data payload is 80 bytes.
Receiving...
Failure: received data does not match sent data.
< d9eeb869024c4f7fac0b9b79331f7d36e7a04b7c159513d0d2277541c523a006698188b05c3c8db46bb6ace9e5c49341c4b603177eff7dee3bac0bca1b690940ed4f333ddc64ccb8b404a109126ca82a
> ed4f333ddc64ccb8b404a109126ca82ae7a04b7c159513d0d2277541c523a006698188b05c3c8db46bb6ace9e5c49341c4b603177eff7dee3bac0bca1b690940ed4f333ddc64ccb8b404a109126ca82a
在这种情况下,您可以看到数据的前 16 个字节未正确传输 - 具体而言,它们已被替换为消息的最后 16 个字节的副本。
请查收附件:
- NXP 示例程序 lpcxpresso55s69_dev_cdc_vcom_freertos 的补丁,添加了“回声”功能
补丁程序,使用 MCUXpresso 构建,在 LPCXpresso55S69 板上运行。
- 一个 Python 3 程序,用于向设备发送数据包,然后将其读回并检查其正确性
该程序在 x86 桌面 Linux 或 i.MX8M Linux 上运行。
- 一个 Beagle USB 数据捕获文件,显示一个数据包在发送到设备的途中以及一个数据包读回损坏的数据副本。
- 显示相同内容的屏幕截图
- 两个 Beagle USB 数据捕获文件显示“良好”传输(无损坏),一个来自同一 i.MX8M 板,一个来自 x86 笔记本电脑。