针对使用CyU3PDmaChannelCommitBuffer提交超过1024字节导致USB包异常大的问题,以下是分步解决方案:
CY_U3P_DMA_TYPE_AUTO或CY_U3P_DMA_TYPE_INSTR模式,避免手动模式下的缓冲区管理错误。 CyU3PDmaChannelSetXfer(&chHandle, CY_FX_DMA_TX_SIZE); // 设置缓冲区大小CyU3PDmaBufferAlloc分配缓冲区,确保对齐正确。wMaxPacketSize应设置为1024(USB3.0标准)。检查描述符代码: .maxPacketSize = 1024, // 必须为1024CyU3PDmaChannelCommitBuffer,每次提交不超过1024字节。例如: uint8_t *data_ptr = large_data_buffer;
int remaining = data_size;
while (remaining > 0) {
uint16_t chunk = (remaining > 1024) ? 1024 : remaining;
CyU3PDmaChannelCommitBuffer(&chHandle, chunk, 0, data_ptr);
data_ptr += chunk;
remaining -= chunk;
}CY_U3P_DMA_COMMIT_TIMEOUT或CY_U3P_DMA_COMMIT_EOL标志,通知主机传输结束: CyU3PDmaChannelCommitBuffer(&chHandle, last_chunk_size, CY_U3P_DMA_COMMIT_EOL, data_ptr);CyU3PDmaChannelCommitBuffer调用后的状态: CyU3PDebugPrint(4, "Committed %d bytes, status=%d", chunk, status);CyU3PDmaChannelGetStatus返回的缓冲区状态,确保无溢出或错误。cyfxusb3visionsrc),比较DMA配置和提交逻辑,确保与官方实现一致。问题通常源于DMA缓冲区配置不当或数据分片缺失。通过分片提交、正确配置缓冲区大小及端点描述符,结合抓包工具验证,可有效解决USB包异常大的问题。如果仍存在异常,建议在Cypress社区提交详细日志和配置以进一步排查。
举报
更多回帖