本帖最后由 woai32lala 于 2024-2-28 21:14 编辑
[url=home.php?mod=space&uid=760190]@21小跑堂 #申请原创#[/url] 解决STM32F407VET6 PA9管脚不能正常输出之怪象 一、前言 这几天在用Stm32F407VET6 在做项目时,发现一个非常奇怪问题,有一个通过IIC读取的器件一直报错,有时候能正常读取,有时候读取错误。IIC是用的模拟的,IO配置开漏输出,IIC引脚是通过4.7k 5%电阻上拉至3.3V。其他IIC通道相同的配置没有出现问题。通过用示波器抓取有问题的器件波形发现,SCL信号波形正常,波形为高电平为 3.3V左右,低电平为0V左右,而SDA波形也正常,低电平为0V左右,而高电平有点低,只有2.6V左右,这明显感觉是不正常的。
二、STM32电平特性 对于Stm32 COMS电平 最小输入高电平电压为 VIH = 0.7 X 3.3V = 2.31V , 2.6V 这个电压对于STM32来说是可以容忍接受的,可以正常识别。 三、读取的设备器件DLC-L10D-D4 电平特性 我们读取的器件为一个差压传感器,电平特性如下图所示。 我们可以看到,器件视为输入高电平的最小电压为0.8 Vs (Vs为器件供电电压3.3V),即0.8 x 3.3V =2.64V ,由此可见,Stm32输出的高电平正好是读取器件的高电平门槛电压,所以有时候读取正常,有时候读取不正常。读取不正常的原因找到了,是因为输出电压电平不对导致,那接下来就找为什么引脚输出电平不是3.3V。
四、问题查找 没有什么特别好的方式,只能先保留读取该该器件IIC程序,然后一步步屏蔽其他代码。 当屏蔽函数usb_init()的时候,发现器件读取正常了,用示波器查看波形发现 PA9管脚可以正常输出高电平3.3V了,看来是跟USB函数有关系。 细看数据手册发现,PA9是UBS功能的 VBUS管脚,是用来监测USB是外部供电是否掉电的。该引脚通过初始化是可以作为普通IO来用的,但初始化了该引脚IO口后,又初始化了USB函数功能,可能导致了引脚功能发生了改变。
测试发现, 1、当使用推挽模式时,作为正常IO口使用,无论是否初始化usb_init()函数, PA9也可以正常输出3.3V高电平。 2、当 PA9为开漏输出GPIO,NO PU/PD,没有初始化usb_init()函数,PA9被 4.7k 的上拉电阻拉到Vdd电压3V3,正常。 3、当初始化usb_init()函数 ,则PA9为2.6V左右。 五、解决方式 根据数据手册可以看出,如果正常使用PA9作为普通IO口,需要USB初始化如下进行配置 1、NOVBUSSENS 当将OTG_FS 通用模块配置寄存器 (OTG_FS_GCCFG)NOVBUSSENS(bit21)置为0,则硬件支持 VBUS 感应。 2、禁止B器件的 Vbus感应功能 当将OTG_FS 通用模块配置寄存器 (OTG_FS_GCCFG)位 19 VBUSBSEN置为0时,则禁止“B”器件的 VBUS 感应功能。
1、 首先要关闭NOVBUSSENS 即 gccfg.b.disablevbussensing = 1; 2、如果OTG_FS_GCCFG(offset_0x038) = 0xXX2DXXXX,使能VBUSBSEN 。 PA9 输出为2.6V方波波形,如下图所示。 3、如果OTG_FS_GCCFG(offset_0x038)= 0xXX25XXXX,即禁止VBUSBSEN,如下图所示。 PA9输出为3V3方波波形,如下图所示。 此时通过IIC也能正常读取器件,问题也就解决了
解决方式即为 1、关闭 OTG_FS_GCCFG寄存器 VBUS sensing(bit 21)功能,即将该为置为0。 2、OTG_FS_GCCFG寄存器 Bit 19 VBUSBSEN and Bit 18 VBUSASEN 这两个比特位也需要被复位,置为0(只复位Bit 19 VBUSBSEN也行)。
|
细心排查问题,根据手册查找原因,解决PA9默认作为OTG_FS_VBUS功能导致不能作为正常IO使用的问题。二姨贴心tips:https://bbs.21ic.com/icview-1849724-1-1.html (香水城大佬在论坛发表过该问题的决绝方法哦!以后遇到问题可以在论坛查找一下哦)