rm543 发表于 2024-11-12 14:14:36

关于USBADR寄存器自动读取的问题

本帖最后由 rm543 于 2024-11-12 14:22 编辑



在 27.1.3 USB间接寄存器 描述中提到:
B6位(AUTORD)可以设置用于USB寄存器自动读取。

按照个人理解:当该位写1时,在读取了当前地址的USBDAT后,硬件会自动再读取相同地址的USBDAT,以加速读取。
但在实际使用中,尝试了几种方法并不能使用该位设置自动读取功能,文档和例程中并无对此功能有更多描述。

尝试了以下几种实现方式,均不能自动读取到正确数据:(读取 USB FIFO0 (0x20) )
1,只写一次USBADR开启自动读写

while(USBADR & 0x80);                  //等待USBDAT数据有效
USBADR = (0x20 | 0x40 | 0x80);       // 设置读取USB寄存器地址,设置为自动读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成
dat = USBDAT;                            // 获取数据
dat = USBDAT;                            // 获取数据
....
dat = USBDAT;                            // 获取数据


2,每次读数据前先等待数据准备完成

while(USBADR & 0x80);                  // 等待USBDAT数据有效
USBADR = (0x20 | 0x40 | 0x80);       // 设置读取USB寄存器地址,设置为自动读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成
dat = USBDAT;                            // 获取数据
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成

dat = USBDAT;                            // 获取数据


....
dat = USBDAT;                            // 获取数据



3,每次设置USBADR,再读取USBDAT

while(USBADR & 0x80);                  // 等待USBDAT数据有效
USBADR = (0x20 | 0x40 | 0x80);       // 设置读取USB寄存器地址,设置为自动读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成
dat = USBDAT;                            // 获取数据

USBADR = (0x20 | 0x40 | 0x80);       // 设置读取USB寄存器地址,设置为自动读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成
dat = USBDAT;                            // 获取数据


....
dat = USBDAT;                            // 获取数据



目前只有单次读取方法可用:

while(USBADR & 0x80);                  // 等待USBDAT数据有效
USBADR = (0x20 | 0x00 | 0x80);       // 设置读取USB寄存器地址,设置为单次读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成
dat = USBDAT;                            // 获取数据

USBADR = (0x20 | 0x00 | 0x80);       // 设置读取USB寄存器地址,设置为单次读取模式,启动USB间接寄存器读取
while(USBADR & 0x80);                  // 等待USBDAT数据准备完成

dat = USBDAT;                            // 获取数据


....
dat = USBDAT;                            // 获取数据



不清楚是操作方式不当还是还有其它要关注的点
望能有解答。




DebugLab 发表于 2024-11-27 15:15:18

本帖最后由 DebugLab 于 2024-11-27 15:28 编辑

unsigned char dat;

void usb_read_reg (unsigned char addr, unsigned char len)
{
      unsigned char i;
      while (USBADR & 0x80);
      USBADR = addr | 0xC0;
      for (i=0; i<len; i++)
      {
                while (USBADR & 0x80);
                dat = USBDAT;
      }
}


以下是图片:






rm543 发表于 2024-11-27 21:24:24

DebugLab 发表于 2024-11-27 15:15
unsigned char dat;

void usb_read_reg (unsigned char addr, unsigned char len)


这个方式是我前面提到的第二种,我已按照你给的代码再次尝试,还是不可以实现自动读取。

rm543 发表于 2024-11-28 20:13:08

进行硬件仿真观看数据,正常USB进行枚举时读取到的第一个Step包数据是这样的:


然后使用自动读取功能时(使用方法2),FIFO 0 的数据读回来只有第一个是对的,后面都乱了。





不知道官方有没有对这个功能有更多的描述?

rm543 发表于 2024-12-2 20:46:04

官方答复表示,USB暂时没有这个自动读取功能。
页: [1]
查看完整版本: 关于USBADR寄存器自动读取的问题