在Cypress FX2LP(CY7C68013A)中配置等时(Isochronous)输出端点需要结合描述符配置和固件编程。以下是分步指南:
在设备描述符中为等时端点分配端点号和参数:
// 端点描述符示例(USB 2.0高速模式)
const USB_EP_DESCRIPTOR ep6out_iso_desc = {
sizeof(USB_EP_DESCRIPTOR), // 描述符长度
USB_DESCRIPTOR_ENDPOINT, // 类型:端点
0x06 | 0x80, // 端点地址:EP6 OUT (0x86)
0x01, // 属性:Isochronous传输,无同步
0x0400, // 最大包大小:1024字节(高速模式)
0x01 // 间隔:每1个微帧
};在固件的TD_Init()函数中进行硬件配置:
void TD_Init(void) {
// 配置EP6为等时OUT端点
EP6OUTCFG = 0xE0; // 0b11100000:
// - 启用端点
// - 方向OUT
// - 类型: Isochronous
// - 缓冲区大小: 1024字节(4x256)
// 设置ISO数据包参数
ISO0PKTSIZE = 0x0400; // 每个微帧传输1024字节
ISO0PKT = 0x0003; // 每个微帧4个数据包(1024/256=4)
// 配置FIFO
FIFORESET = 0x80; // 激活FIFO复位
SYNCDELAY; // 等待同步
OUTISOENDPKTS = 0x04; // EP6 OUT双缓冲,每个缓冲4包
FIFORESET = 0x00; // 结束复位
// 启用端点中断
USBIE |= (1<<6); // 启用EP6 OUT中断
ENABLE_EP6_OUT(); // 激活端点
}处理数据到达事件:
void ISR_Ep6Out(void) interrupt 0 {
if(EP6OUTCS & 0x02) { // 检查有效数据
// 获取数据长度
WORD pktLen = EP6OUTBCH << 8 | EP6OUTBCL;
// 处理接收到的数据(示例:DMA传输)
ISOOUTPKT = 0x0001; // 使用DMA通道1
SYNCDELAY;
ISOOUTSINGLE = 0x01; // 单次传输模式
// 清除中断标志
EP6OUTCS &= ~0x02;
}
}OUTISOENDPKTS设置双缓冲,提高吞吐量wMaxPacketSize符合USB规范(高速模式最大1024字节)IFCLKSRC寄存器配置内部时钟为48MHzSYNCDELAY宏保证时序端点不响应:
EPxCFG寄存器是否启用数据丢失:
OUTISOENDPKTS)CRC错误:
ISO0PKTSIZE)isocsrc工程建议结合USB协议分析仪(如Wireshark+USBpcap)实时监控传输过程,验证配置效果。对于高速等时传输,建议使用DMA方式处理数据以降低CPU负载。
举报
更多回帖