【68013】slave-fifo模式的调试心得之初始化

少女dtysky

世界Skill

时刻2014.05.05

68013这个片子用了不少时间,从一开始的懵懂时期凑活能用到现在研究的算是比较深入,期间遇到了一些令人抓狂的问题,现在与大家分享一下。
由于博主是利用68013来达到PC和FPGA的通信,所以用的是它的slave-fifo模式,其中使用EP2作为批量输出端口,EP6作为批量输入端口,下面就通过一个初始化函数来说明68013的slave-fifo模式的初始化过程。
这个初始化函数的定义位于用户自定义的c文件内的开头,具体固件的架构将在下一帖内说到。


slave-fifo模式的初始化

在看下面的内容之前,建议先在这里下载官方的slave-fifo开发文档来对照寄存器的位定义,也可以直接参考官网的EZUSB_TRM

void TD_Init( void ){ 
    CPUCS = 0x10;   
    //以上定义MCU设置
    PINFLAGSAB = 0x4A;          // FLAGB - EP2PF ,FLAGA - EP6EF
    SYNCDELAY;  
    PINFLAGSCD = 0x08;          // FLAGC - EP2EF
    SYNCDELAY;  
    //以上定义对外的标志信号,如果设定了PF(可编程标志位,还需同时设定EPXFIFOPFH/L)。  
    //每一句赋值后面的"SYNCDELAY"是cypress自己在固件里定义的延时同步函数,用来保证寄存器写入正常。
    PORTACFG |= 0x80;
    SYNCDELAY;  
    //以上定义端口A的功能,在此模式下一般不需要关心。
    IFCONFIG = 0x03; // for async? for sync?
    SYNCDELAY;  
    //以上定义68013的工作模式。
    FIFOPINPOLAR |= 0x3F;
    SYNCDELAY;  
    //以上定义某些引脚的有效极性(高有效或者低有效)。*
    CPUCS |= 0x02;
    SYNCDELAY;  
    //以上定义MCU设置,在此模式下默认此值即可**  
    REVCTL = 0x01;
    SYNCDELAY;  
    //以上定义是否开启每个端口的SKIP功能,这里开启自动输出,关闭自动输入。
    EP4CFG = 0x01;                //clear valid bit
    SYNCDELAY;                     
    EP8CFG = 0x01;                //clear valid bit
    SYNCDELAY;   
    EP2CFG = 0xA0;                //out 512 bytes, 4x, bulk
    SYNCDELAY;                    
    EP6CFG = 0xE0;                // in 512 bytes, 4x, bulk
    SYNCDELAY;              
    //以上定义每一个端口的功能,此处定义为端口2bulk输出,四缓冲,一个缓冲512bytes;端口4bulk输入,四缓冲,一个缓冲512bytes。  
    //注意,此处的缓冲区个数和大小不可随心设定,而且有些诡异,在之后的贴中会说到。
    FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions
    SYNCDELAY;                    // see TRM section 15.14
    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
    SYNCDELAY;   
    //以上为FIFO端口复位操作,首先将FIFORESET的最高位有效,用此来屏蔽其他所有请求,然后依次复位2、4、6、8端口,最后最高位写零,退出复位。
    EP2FIFOCFG = 0x00;            
    SYNCDELAY;
    EP2FIFOCFG = 0x10;            // AUTOOUT=1, WORDWIDE=0
    SYNCDELAY;  
    EP6FIFOCFG = 0x00;            
    SYNCDELAY;
    EP6FIFOCFG = 0x09;            // AUTOIN=1, ZEROLENIN=0, WORDWIDE=1
    SYNCDELAY;  
    //以上设定上面有效的端口2、6的slave-fifo模式设置,比较需要注意的的是AUTOX和ZEROLENIN,这个在后面的贴中会说到。
    EP6AUTOINLENH = 0x02;
    SYNCDELAY;
    EP6AUTOINLENL = 0x00;
    SYNCDELAY;
    //以上设定EP6在自动输入模式下的打包提交阈值。   
    EP2FIFOPFH = 0x88;
    SYNCDELAY;
    EP2FIFOPFL = 0x00;
    SYNCDELAY;  
    //以上设定EP2PF编程位的有效方式—大于或等于512个字节时有效,这个寄存器的官方说明也有点问题,后面的贴中会说到。
    INPKTEND = 0x84;
    SYNCDELAY;
    INPKTEND = 0x84;
    SYNCDELAY;
    INPKTEND = 0x84;
    SYNCDELAY;
    INPKTEND = 0x84;
    SYNCDELAY;  
    //以上操作是为了清空IN包,以防万一(只有在开启了SKIP功能的情况下才有效)。
}

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。