找回密码
 立即注册
查看: 315|回复: 4

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-11-12 14:14:36 | 显示全部楼层 |阅读模式
本帖最后由 rm543 于 2024-11-12 14:22 编辑

USBADR寄存器描述

USBADR寄存器描述


在 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[0] = USBDAT;                            // 获取数据
dat[1] = USBDAT;                            // 获取数据
....
dat[7] = USBDAT;                            // 获取数据


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

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

dat[1] = USBDAT;                            // 获取数据


....
dat[7] = USBDAT;                            // 获取数据



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

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

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


....
dat[7] = USBDAT;                            // 获取数据



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

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

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

dat[1] = USBDAT;                            // 获取数据


....
dat[7] = USBDAT;                            // 获取数据



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




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-27 15:15:18 | 显示全部楼层
本帖最后由 DebugLab 于 2024-11-27 15:28 编辑

unsigned char dat[n];

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;
        }
}



以下是图片:

截图202411271527451777.jpg
截图202411271526265556.jpg



DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-11-27 21:24:24 | 显示全部楼层
Debu*** 发表于 2024-11-27 15:15
unsigned char dat[n];

void usb_read_reg (unsigned char addr, unsigned char len)

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-11-28 20:13:08 | 显示全部楼层
进行硬件仿真观看数据,正常USB进行枚举时读取到的第一个Step包数据是这样的:

正常数据

正常数据


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

异常数据

异常数据




不知道官方有没有对这个功能有更多的描述?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:45
  • 最近打卡:2025-04-28 09:23:48

3

主题

43

回帖

493

积分

中级会员

积分
493
发表于 2024-12-2 20:46:04 | 显示全部楼层
官方答复表示,USB暂时没有这个自动读取功能。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 09:04 , Processed in 0.132954 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表