【68013】slave-fifo模式的调试心得之初始化
世界Skill
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功能的情况下才有效)。
}
点击查看评论