【68013】slave-fifo模式的工作方式设置和问题

少女dtysky

世界Skill

时刻2014.05.09

在使用过程中出现了一些奇怪的问题,首先就是slave-fifo的工作方式设置中,下面将会进行说明。


寄存器的设置

FIFOPINPOLAR

这个寄存器是某些引脚极性设置,设置后必须严格按照设定值进行使用这些引脚,否则可能会造成一些奇怪的后果(比如在SLOE极性错误的情况下使能SLRD会导致读出的数据完全错误)。

REVCTL

此寄存器低二位设置的是OUT和IN端口的SKIP是否有效,只有在有效的情况下写SKIP位才能够发生作用。

EPXCFG

此类寄存器设置的是各个端口的工作模式,这里需要特别注意的是SIZE、BUF1/0的设置。按理说只要参照官方给出的要求设置便可,用户手册说明如下:

Notice that the packet byte counts differ in the upper PFC bits because the endpoints support different FIFO sizes: The EP2 FIFO can be a maximum of 4096 bytes long, the EP6 FIFO can be a maximum of 2048 bytes long, and the EP4 and EP8 FIFOS can be a maximum of 1024 bytes long.

也就是说EP2最多配置为4KB,EP6是2KB,EP4/8都是1KB。

但博主在多次尝试后发现无法配置为"EP2 2x1024 OUT"+"EP6 2x1024 IN"的模式,会强制将其转为两个2x512B的端口,百思不得其解,只得上Cypress官网询问,终于找到了问题所在
由于协议问题,在BULK传输模式下每个BUFFER的大小必须设置为512B。

EPXFIFOCFG

此类寄存器用于配置端口FIFO,需要注意的是ZEROLENIN这一位。当设定为AUTOIN模式时如果这一位有效,将可能造成IN包错乱的情形(本来没有提交被当做提交了),所以慎用。 同时,在正常设置OUT端口的此寄存器前必须要先将其设置为0x00,否则会不生效,具体原因不明。

FIFORESET

复位寄存器,注意每次复位前先对其最高位写1,来屏蔽外部请求,复位结束后清零即可。
复位结束后需要重新设置EPXFIFOCFG、EPXAUTOINLENH

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