在嵌入式系统开发中,USB控制器作为连接主机与外围设备的关键桥梁,其架构设计直接影响系统性能。TMS320DM35x系列芯片集成的USB 2.0控制器支持全速(12Mbps)和高速(480Mbps)模式,采用独特的CPPI DMA架构实现高效数据传输。让我们深入剖析其核心模块:
物理层是USB通信的基础,正确的PHY初始化至关重要:
c复制// 关键PHY初始化代码示例
sysRegs->USB_PHY_CTRL = 0x000000D0; // 开启PHY和时钟
usleep(100); // 等待稳定
PHY初始化需要特别注意:
4KB的共享FIFO空间通过智能分配支持多端点:
c复制// 端点1的FIFO配置示例(64字节单缓冲)
usbRegs->INDEX = 1; // 选择端点1
usbRegs->RXFIFOSZ = 3; // 64字节大小
usbRegs->RXFIFOADDR = 8; // 起始地址(端点0保留前64字节)
usbRegs->TXFIFOSZ = 3;
usbRegs->TXFIFOADDR = 72; // TX起始地址=RX地址+64
FIFO分配策略建议:
通道协议处理器接口(CPPI)DMA通过描述符链实现零拷贝传输:
(图示:描述符包含NextPtr、BufferPtr、Offset/Length、Control字段)
关键控制寄存器:
主机模式下需特别注意设备枚举过程:
c复制// 主机端点配置示例(批量传输)
usbRegs->INDEX = 1;
usbRegs->HOST_TXTYPE = (2<<6) | (BULK<<4) | 1; // 全速批量端点1
usbRegs->HOST_NAKLIMIT0 = 8; // NAK超时限制
主机需处理四种传输类型:
| 传输类型 | 特点 | 典型应用 | 配置要点 |
|---|---|---|---|
| 控制 | 可靠, 双向 | 设备枚举 | 固定端点0 |
| 批量 | 可靠, 大容量 | 存储设备 | 大FIFO缓存 |
| 中断 | 周期轮询 | HID设备 | 合理设置轮询间隔 |
| 同步 | 实时, 无重试 | 音视频 | 高优先级 |
关键寄存器操作:
c复制// 启动批量传输示例
usbRegs->HOST_TXCSR = 0x0001; // 设置TXPKTRDY
while(!(usbRegs->HOST_TXCSR & 0x0080)); // 等待完成
外设模式下端点配置需匹配主机要求:
c复制// 中断端点配置示例
usbRegs->INDEX = 1;
usbRegs->PERI_TXCSR = 0x0080; // 启用中断传输模式
usbRegs->TXMAXP = 64; // 最大包大小
外设需正确处理四种传输状态:
状态转换示例:
c复制if(usbRegs->PERI_CSR0 & 0x0001) { // 检测SETUP包
handle_setup_packet(); // 处理控制请求
usbRegs->PERI_CSR0 |= 0x0002; // 发送ACK
}
高效的DMA操作依赖于正确的描述符配置:
c复制// 构建发送描述符链
void build_tx_descriptor(int ch, void *buf, int len) {
uint32_t *desc = &tx_desc_pool[ch][desc_index];
desc[0] = (uint32_t)(desc + 4); // 下一个描述符地址
desc[1] = (uint32_t)buf; // 数据缓冲区地址
desc[2] = (len << 16); // 偏移+长度
desc[3] = SOP | EOP | OWNER | len; // 控制字段
}
关键字段说明:
完善的DMA错误恢复策略:
c复制// DMA错误恢复示例
if(usbRegs->TCPPIMSKSR & 0x01) { // 检测错误
usbRegs->TCPPITDR = 1<<ch; // 终止通道
reset_dma_channel(ch); // 重置通道
}
通过双缓冲减少等待时间:
c复制// 启用双缓冲模式
usbRegs->TXFIFOSZ = (3<<4) | 3; // 64字节双缓冲
合并小包提升吞吐量:
c复制// 聚合多个URB请求
for(int i=0; i<BATCH_SIZE; i++) {
build_tx_descriptor(ch, buffers[i], lengths[i]);
}
start_dma_transfer(ch);
合理设置中断阈值平衡响应与效率:
c复制// 设置每4个包产生一次中断
usbRegs->RCPPICR |= (3<<8); // PKT_COUNT_THRESH=4
可能原因及解决方案:
诊断步骤:
优化建议:
实现主机/设备角色切换:
c复制// 发起SRP请求
usbRegs->DEVCTL |= 0x01; // 设置SRP
while(!(usbRegs->DEVCTL & 0x02)); // 等待ACK
启用专用硬件加速:
c复制// 配置RNDIS模式
usbRegs->RNDISR = 0x01; // 启用RNDIS
usbRegs->AUTOREQ = 0x1F; // 自动响应短包
在TMS320DM355平台上的基准测试结果:
| 测试项 | 理论值 | 实测值 | 优化手段 |
|---|---|---|---|
| 批量传输 | 53MB/s | 48MB/s | 双缓冲DMA |
| 同步传输 | 24MB/s | 22MB/s | 专用FIFO分配 |
| 控制传输 | - | 1200次/秒 | 快速ACK响应 |
通过合理的FIFO分配和DMA优化,实际吞吐量可达理论值的90%以上。