如何对DE1-SOC开发板HPS部分的USB OTG控制器寄存器进行写入操作
DE1-SOC HPS USB OTG控制器无法访问寄存器的解决方案
以下是你遗漏的必要配置步骤,按顺序执行即可解决寄存器访问失败问题:
- 开启USB控制器时钟
Cyclone V HPS的USB外设时钟默认处于关闭状态,需要先在时钟管理器中启用USB0的根时钟和ULPI接口时钟,添加以下代码到config_usb()函数最开头:
// 使能USB0的AHB接口时钟和ULPIphy时钟 *(CLOCK_MANAGER_PERPLLCLKGRP_USB0_PTR) = 0x00000003; // 等待时钟稳定 while(*(CLOCK_MANAGER_PERPLLCLKGRP_USB0_PTR) & 0x00000004);
- 解除USB控制器复位状态
复位管理器默认保持USB控制器在复位状态,需要手动清除复位标记:
// 解除USB0的上电复位、总线复位 *(RSTMGR_PERMODRST_PTR) &= ~(1 << 1); // 等待复位完成,至少延迟1ms for(volatile int i=0; i<10000; i++);
- 修正L3总线权限配置和MMU属性
你当前配置的SYSMGR_USBL3MASTER_ptr值开启了缓存属性,寄存器访问不能使用缓存,需要修改为:
*(SYSMGR_USBL3MASTER_ptr) = 0x0000001F; // 关闭缓存,保留特权、可缓冲属性
同时确认你的MMU页表中,USB0控制器基地址(0xFFB00000)对应的1MB区域配置为强序访问、非缓存、可读写,如果未配置则会触发数据中止异常,导致寄存器访问失败。
- 先设置USB控制器为主机模式再操作HPRT寄存器
HPRT是主机模式专属寄存器,默认OTG模式下无法写入,需要先配置控制器模式:
// 先软复位USB控制器 *(USB0_GRSTCTL_ptr) = 0x00000001; while(*(USB0_GRSTCTL_ptr) & 0x00000001); // 设置为强制主机模式 *(USB0_GUSBCFG_ptr) |= 0x00000400; // 等待模式切换完成 for(volatile int i=0; i<1000; i++); // 再执行端口上电操作 *(USB0_HPRT_ptr) = 0x00001000;
完成以上步骤后即可正常访问USB控制器的所有寄存器,后续按照USB 2.0主机模式的枚举流程完成鼠标设备的枚举,读取HID报告后将坐标同步到VGA显示即可实现目标功能。
内容的提问来源于stack exchange,提问作者Oğuz Demirhan
相关产品推荐
相关产品推荐

