工具/软件:TI-RTOS
usbhostenum.c 文件中 USBHCPDPipeWrite (uint32_t ui32Pipe、uint8_t * pu8Data、uint32_t ui32Size)函数中有一段代码(Tiva USB 库的修订版本2.1.1.71):
//
//如果不使用 DMA,一次只发送64个字节。
//
if (ui32ByteToSend > 64)
{
ui32ByteToSend = 64;
}
其他
{
//
//发送请求的字节数。
//
ui32ByteToSend = ui32RemainingBytes;
}
//
//启动写请求。
//
G_sUSBHCD.psUSBOUTPipes[ui32PipeIdx].iState = ePipeWriting;
//
//在 USB 端点上禁用 uDMA
//
MAP_USBEndpointDMADisable (USB0_BASE、ui32端点、
USB_EP_HOST_OUT);
//
//将数据放入缓冲区。
//
MAP_USBEndpointDataPut (USB0_BASE、ui32Endpoint、pui8Data、
ui32字节发送);
代码循环运行。 假设函数是用 ui32Size = 200调用的。 在第一遍中、ui32ByteToSend 设置为64。 在第二次传递中,由于 ui32ByteToSend 不大于64,因此它设置为 ui32RemainingBytes,在我们的示例中为136。 写入64个以上字节失败、但函数返回调度发送的 ui32Size 字节数量。 这是一个严重的错误、阻止发送超过128个字节。 通过搜索 e2e.ti.com、我可以看到早在2013年10月就报告了此错误(https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/296947/1035641#1035641、 https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/468291/1681349、
https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/491095/1799245)。
已尝试按照发行说明中所述修复它:
用于 C 系列的 TivaWare SW-TM4C-RLN-2.1.4.178版本说明文献编号:SPMU299E 2015年5月–2017年2月修订版
5版本2.1.0的发行说明(2014年2月7日)
5.9.1 USBHCPepeWrite()在某些数据大小时挂起如果调用的数据大小大于64而不是64的倍数并且 USB 管道不使用 DMA,则调用会错误地尝试发送请求的完整字节数。 这也导致了对 USBHCPIPPEWrite()的调用挂起,等待的字节超过了可以发送的字节。 现在、该调用只正确发送剩余的字节并正确返回。
但从以下内容中更改:
ui32ByteToSend = ui32Size;
至:
ui32ByteToSend = ui32RemainingBytes;
为 TivaWare 版本2.1.0.12573执行的操作不能执行此操作。
一个简单的修复方法可能是替换:
if (ui32ByteToSend > 64)
其中:
if (ui32ByteToSend >= 64)
但请进行测试。
谢谢、
ED