USB论坛
直播中

算一挂

9年用户 962经验值
私信 关注
[问答]

CY68013 endpoint大小与设置不匹配是什么原因?

我在固件中设置ep8为输出端点,大小为512字节,零缓冲。但是在实际操作过程中上位机需要发送1024字节才能将端点8写满,读取也是要1024字节才能读空,想请问下这是什么原因?
工作在slave fifo模式,下面是固件代码片段
void TD_Init( void )
{ // Called once at startup
//设置8051的工作频率为48MHz
CPUCS = 0x12; // CLKSPD[1:0]=10, for 48MHz operation, output CLKOUT
//配置FIFO标志输出,FLAG G配置为EP2 OUT FIFO空标志
//RTACFG |= 0x80;
//NCDELAY;
//Slave使用内部48MHz的时钟
IFCONFIG = 0x43; //external clk, Slave FIFO interface
SYNCDELAY;

//将EP2断端点配置为BULK-in端点,使用3倍缓冲,1024字节FIFO
//将EP8配置为BULK-OUT端点
EP2CFG = 0xE0; //IN 512 bytes,4* , bulk
SYNCDELAY;
EP4CFG = 0x02; //clear valid bit
SYNCDELAY;
EP6CFG = 0x02; //clear valid bit
SYNCDELAY;
EP8CFG = 0xA1; //Out 512 bytes , bulk
SYNCDELAY;
//复位FIFO
SYNCDELAY;
FIFORESET = 0x80; // activate NAK-ALL to avoid race conditions
SYNCDELAY; // see TRM section 15.14
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY;
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY;
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY;
FIFORESET = 0x02; // reset, FIFO 2
SYNCDELAY;
FIFORESET = 0x04; // reset, FIFO 4
SYNCDELAY; //
FIFORESET = 0x06; // reset, FIFO 6
SYNCDELAY; //
FIFORESET = 0x08; // reset, FIFO 8
SYNCDELAY; //
FIFORESET = 0x00; // deactivate NAK-ALL
//配置FIFO标志输出,FLAG B配置为EP2 IN FIFO FULL FLAG
PINFLAGSAB = 0xC8; // FLAGB - EP2FF,FLAGA - EP2EF
SYNCDELAY;
//配置FIFO标志输出,FLAG C配置为EP8 OUT FIFO EMPTY FLAG
PINFLAGSCD = 0xFB; // FLAGC - EP8EF,FALGD - EP8FF
SYNCDELAY;
//
PORTACFG |=0x80;
SYNCDELAY;
//所有引脚低有效
FIFOPINPOLAR= 0x00;
SYNCDELAY;
// handle the case where we were already in AUTO mode...
// ...for example: back to back firmware downloads...
// core needs to see AUTOOUT=0 to AUTOOUT=1 switch to arm endp's
EP8FIFOCFG = 0x00; // AUTOOUT=0, WORDWIDE=1
SYNCDELAY; //
EP8FIFOCFG = 0x11; // AUTOOUT=1, WORDWIDE=1
SYNCDELAY; //
EP2FIFOCFG = 0x0D; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=1
SYNCDELAY;
EP2AUTOINLENH = 0x02;
SYNCDELAY;
EP2AUTOINLENL = 0x00;
SYNCDELAY;
}
描述符代码片段

HighSpeedConfigDscr:
db DSCR_CONFIG_LEN ;; Descriptor length
db DSCR_CONFIG ;; Descriptor type
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB)
db 1 ;; Number of interfaces
db 1 ;; Configuration number
db 0 ;; Configuration string
db 10100000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)

;; Alt Interface 0 Descriptor - Bulk IN-OUT
db DSCR_INTRFC_LEN ;; Descriptor length
db DSCR_INTRFC ;; Descriptor type
db 0 ;; Zero-based index of this interface
db 0 ;; Alternate setting
db 2 ;; Number of end points
db 0ffH ;; Interface class
db 00H ;; Interface sub class
db 00H ;; Interface sub sub class
db 0 ;; Interface descriptor string index This would be nice to add!

;; Bulk IN Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 82H ;; Endpoint 2 and direction IN
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB) 512 byte packets/uFrame
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Bulk OUT Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 08H ;; Endpoint 8 and direction OUT
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB) 512 byte packets/uFrame
db 00H ;; Polling interval
HighSpeedConfigDscrEnd:
图中flagc代表端点8空信号,flagd代表端点8满信号

回帖(1)

杨海清

2025-6-5 17:47:49

根据您的描述以及提供的代码片段,您在CY68013固件中将EP8配置为512字节的输出端点(OUT Endpoint),但实际通信中需要1024字节才能触发FIFO满/空状态。结合Slave FIFO模式的工作机制,以下是可能的原因及解决方案:




原因分析




  1. EP6E7CFG寄存器配置问题(最可能原因)

    CY68013的EP8端点实际大小受 EP6E7CFGEP8CFG 寄存器共同控制:  



    • EP6E7CFGbit7 (EP8ISO) 决定EP8大小优先级:

      • EP6E7CFG[7]=1 (默认值?),则强制EP8为1024字节(忽略EP8CFG的配置)。

      • EP6E7CFG[7]=0,则EP8大小由EP8CFG[7]决定(0=512字节,1=1024字节)。

        您的代码未显式配置EP6E7CFG,可能导致EP8被强制设为1024字节。





  2. EP8配置寄存器(EP8CFG)值错误  



    • 正确配置EP8为512字节输出端点:  
      EP8CFG = 0xA0;  // 二进制: 1010 0000
                   // bit7=1: 1024字节 (若EP6E7CFG[7]=0则此设置无效)
                   // bit6=0: OUT端点
                   // bit5:4=00: 单缓冲 (零缓冲)
                   // bit1:0=00: BULK传输

      但若EP6E7CFG[7]=1,此配置中的bit7会被忽略。





  3. 固件未正确初始化EP8

    您的代码片段中缺失对端点的显式配置。需确认EP8CFGEP6E7CFG的初始化逻辑是否被执行。






解决方案


1. 修改固件配置代码


TD_Init()中添加以下配置,确保EP8大小为512字节:


void TD_Init() {
    // ... 现有代码
    IFCONFIG = 0x43; // 外部时钟,Slave FIFO模式

    // 关键配置:强制EP8使用512字节
    EP6E7CFG &= ~0x80;   // 清除EP6E7CFG[7]=0 (取消EP8的1024字节强制)
    EP8CFG = 0x20;       // EP8: 512字节, OUT, 单缓冲, BULK
                         // 0x20 = 0010 0000b (bit7=0, 512字节)

    // 可选:明确设置FIFO大小
    FIFORESET = 0x80;    // 激活NAK所有FIFO
    FIFORESET = 0x08;    // 复位EP8 FIFO
    FIFORESET = 0x00;    // 结束复位
}

2. 验证端点状态寄存器


添加调试代码,检查寄存器的实际值:


void main() {
    TD_Init();
    while(1) {
        printf("EP8CFG: %02Xn", EP8CFG);     // 应为0x20
        printf("EP6E7CFG: %02Xn", EP6E7CFG); // 应为0x00 (bit7=0)
    }
}

3. 同步上位机设置


确认上位机:



  • 使用 512字节包大小 通信。

  • 检查USB描述符中定义的端点包大小是否与固件一致(需在描述符中声明wMaxPacketSize=512)。




配置说明

















































寄存器 地址 关键位 推荐值 作用
EP6E7CFG 0xE68B bit7 (EP8ISO) 0 禁用EP8 1024强制
EP8CFG 0xE68E bit7 (SIZE) 0 EP8=512字节
bit6 (DIR) 0 OUT端点
bit5-4 (MODE) 00 单缓冲
FIFORESET 0xE68C 0x80→0x08→0x00 - 复位EP8 FIFO



注意事项



  • 复位时序:修改端点配置后需复位FIFO(通过FIFORESET寄存器)。

  • 端点方向:Slave FIFO模式下,EP8作为OUT端点需通过EP8CFGDIR=0明确设置。

  • 同步问题:若仍异常,检查USB时钟同步信号(如IFCONFIG中的IFCLKSRC是否匹配硬件设计)。


请更新固件后重新测试。若问题仍存,建议使用Cypress SuiteUSB工具监控FIFO状态和寄存器值以进一步诊断。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分