关于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: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;
}
}
以下是图片:
DebugLab 发表于 2024-11-27 15:15
unsigned char dat;
void usb_read_reg (unsigned char addr, unsigned char len)
这个方式是我前面提到的第二种,我已按照你给的代码再次尝试,还是不可以实现自动读取。 进行硬件仿真观看数据,正常USB进行枚举时读取到的第一个Step包数据是这样的:
然后使用自动读取功能时(使用方法2),FIFO 0 的数据读回来只有第一个是对的,后面都乱了。
不知道官方有没有对这个功能有更多的描述?
官方答复表示,USB暂时没有这个自动读取功能。
页:
[1]