我理解你目前遇到的CY7C68013A Slave FIFO数据传输异常问题确实令人困惑。根据你的描述,特别是00 00 FF FF 00 00 00 00变成00 00 7F 1F 00 00 00 00,并且只有当末尾字节为0xFF时才能传输成功,以下是可能的原因和解决办法分析:
Slave FIFO的自动打包机制(Auto Packetization)问题 - 这是最核心、最可能的原因:
INPKTEND命令(仅对IN端点有效)。FLAGx标志指示FIFO为空(或低于某个阈值)(这主要与IN端点的手动/自动模式选择有关)。00 00 FF FF 00 00 00 00时,68013可能误判了数据包的结束点,导致将非完整数据提前打包发送了。00, 00, FF, FF, 00, 00, 00, 00。FLAG引脚或内部状态寄存器)。FF, FF后,FIFO中有4字节数据(2个16位字)。00被写入FIFO后(此时共有00 00 FF FF 00 00,6字节数据),68013可能错误地认为此时已经满足某个发送条件(例如认为FIFO内有足够数据、或FLAG信号短暂触发空标志),在未收到INPKTEND信号的情况下,错误地将这6字节数据打包并发送出去。但USB包大小通常是64字节(512字节)或其倍数,而你的有效数据包只有8字节,所以可能还有其他标志触发了打包逻辑。FF后,数据变为00 00 FF FF 00 00 00 FF。这种情况下可能FLAG信号未误触发或68013正确等到INPKTEND才发送数据,因此整个8字节作为完整包被正确传输。7F 1F的含义:7F(二进制0111 1111)和1F(二进制0001 1111)很可能是误打包那一刻FIFO状态寄存器(如EP6FIFOFLGS)或其他内部状态的值被误写入数据流。EPxFIFOFLGS)的值当成了FIFO中的数据。7F和1F非常符合状态寄存器位的特征。FLAGC/FLAGD标志映射冲突(可能性较高):
FLAGx(A、B、C、D)可用于指示FIFO状态(如空、满、可编程标志)。FLAGx引脚通过内部寄存器映射到FX2LP的地址/数据总线的某些位(如FIFOADR[1:0])。00值到FIFO时(尤其是在数据结尾处),可能使内部FIFOADR状态(或其映射)发生改变,暂时将标志寄存器映射到了数据位。FLAGx的设置(PINFLAGSAB,PINFLAGSCD寄存器),确保没有将标志映射到可能冲突的地址位(尤其是在发送大量零的情况下)。如果FLAGx配置不当,可能会导致标志信号被当成数据写入。时序或信号完整性问题(可能性较低,但需检查):
SLWR,PKTEND,IFCLK)。FF(所有位跳变)或00(所有位为低电平)时,总线易受干扰,导致数据传输异常。IFCLK)符合时序规范,特别是建立/保持时间。PKTEND信号(将PKTEND引脚置低一个周期)。// MCU伪代码示例
for (int i = 0; i < PACKET_SIZE_IN_WORDS; i++) {
WriteWordToFIFO(data[i]); // 写入数据到FIFO
}
AssertPKTEND(); // 关键:显式触发包结束
DeassertPKTEND();SlaveFIFO.c或类似文件中设置:SYNCDELAY; EP6FIFOCFG = 0x00; // 或 0x02(注意设置说明)
// 通常设置为0x00(AUTOOUT+自动提交禁用),确保手动PKTEND触发FLAGx标志配置PINFLAGSAB、PINFLAGSCD寄存器的设置。推荐配置:SYNCDELAY; PINFLAGSAB = 0x8E; // 常用配置:FLAGA(EP2 Empty), FLAGB(EP6 Full)
SYNCDELAY; PINFLAGSCD = 0x00; // FLAGC/D不用于标志输出(避免冲突)FLAGx没有映射到FIFOADR[1:0](查看寄存器设置),以避免数据冲突。SYNCDELAY; EP6CFG = 0xA0; // VALID, IN, TYPE=BULK, SIZE=512(如果16bit,实际有效包大小是1024字节?)
SYNCDELAY; EP6FIFOCFG = 0x10; // AUTOIN=1, ZERO-LENGTH IN=0, WORDWIDE=1 (16-bit)EP6FIFOCFG:确保AUTOIN使能,但INPKTEND触发方式正确。FD[15:0], SLWR, FIFOADR[1:0], PKTEND, IFCLK。PKTEND是否在正确时间点被MCU触发?FIFOADR在数据传输过程中是否有意外变化?FF跳变时出现振铃)。INPKTEND(即使未满):// 在TD_Poll()或类似地方
if (/* 包就绪条件 */) {
SYNCDELAY; EP6BCL = 0x00; // 触发IN包发送(自动提交模式)
// 或使用 INPKTEND 手动提交
}PKTEND,这是最直接有效的方案,能直接规避自动打包导致的误判。PINFLAGSAB/CD配置正确,禁用可能导致冲突的映射。PKTEND是否触发。如果手头无设备,可先跳过,执行步骤1通常即能解决问题。从现象(FF FF变7F 1F、00结尾触发异常、FF结尾可正常)来看,极可能是FX2LP误判包结束点,导致状态标志被误写入数据流。最有效的解决手段是在MCU端每个数据包后手动触发PKTEND,并确认固件中Slave FIFO配置为等待此信号。只要包结束信号被精确控制,问题通常即可解决。
举报
更多回帖