最近在学习USB相关的知识,从底层一点一点开始写驱动,但是遇到了点问题。
使用的芯片型号:stm32F072C8T6
USB的DM和DP分别连接到PA11和PA12
发现的问题如下:
(1)使用标准库写一个在main函数,并在其中只写一个while(1) 下载进单片机,然后将板子通过usb和电脑连接,电脑可以发现未识别的设备。
疑问:我认为默认USB设备是关闭的,那么对应的IO应该是普通IO状态,所以应该不会出现现未识别的设备
(2)通过查阅相关手册得知,通过控制USB寄存器USB_BCDR中的bit15 DPPU位可以控制内部的DP上拉电阻的连接和断开,以此来模拟USB设备的插入和拔出的过程,因此自己写代码进行相关的测试,但是发现DPPU不管如何改变,通过开发板链接的usb设备始终在设备管理器中显示为未识别设备。(已经基本排除代码问题,因为直接在仿真环境下使用仿真工具修改DPPU的状态USB设备依然不会断开)
疑问:按照道理来说DPPU是可以控制usb设备的断开和连接的,已经基本排除了是时钟或者其他的影响,难道是想要让DPPU控制有效还需要其他操作或者条件?
(3)我阅读了ST官方提供的USB的代码发现在usb的初始化中并没有对usb使用的两个GPIO做相关初始化,同时如果我在函数一开始就将usb对应的两个引脚初始化为普通IO,那么设备不会在一上电就检测到usb设备,而是在当我开启usb的时候才会发现usb设备。
疑问:是不是一旦USB功能使能,PA11和PA12就会自动设置对应的GPIO属性。那么就回到了问题(1),我有点怀疑问题(2)DPPU没有作用是和GPIO的初始化有关的,但是到底需要如何设置GPIO,请有相关经验的给我点意见建议。
(4)通过实验发现,虽然DPPU不能模拟设备的插拔的过程,但是通过对usb寄存器USB_CNTR的bit1位 PDWN设置,将其设置为1,设备断开连接,将PDWN设置为0则电脑可以发现未识别的设备。
疑问:为什么PDWN会有DPPU的功能,但是DPPU的功能却实现不了?
上面四个问题,是我在调试中遇到的,各位帮忙看一下,如果由之前测试过的代码的请您贴一下,以帮助我尽快找到问题的所在,十分感谢。 |