发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
[STM32F4]

解决STM32F407VET6 PA9管脚不能正常输出之怪象

[复制链接]
2124|7
手机看帖
扫描二维码
随时随地手机跟帖
woai32lala|  楼主 | 2024-2-28 09:06 | 显示全部楼层 |阅读模式
本帖最后由 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来说是可以容忍接受的,可以正常识别。
9481465ddc0fba5989.png
三、读取的设备器件DLC-L10D-D4 电平特性
我们读取的器件为一个差压传感器,电平特性如下图所示。
601665ddc108164d9.png
我们可以看到,器件视为输入高电平的最小电压为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 感应。
8244565df2f11efeff.png
2、禁止B器件的 Vbus感应功能
当将OTG_FS 通用模块配置寄存器 (OTG_FS_GCCFG)位 19 VBUSBSEN置为0时,则禁止“B”器件的 VBUS 感应功能。
899765ddc110cc89d.png

六、对应软件操作
1、 首先要关闭NOVBUSSENS
即   gccfg.b.disablevbussensing = 1;
635865ddc11aa1892.png
2、如果OTG_FS_GCCFG(offset_0x038) = 0xXX2DXXXX,使能VBUSBSEN 。
3900365ddc120e528b.png
PA9 输出为2.6V方波波形,如下图所示。
4492865de871c6c5b8.png
3、如果OTG_FS_GCCFG(offset_0x038)= 0xXX25XXXX,即禁止VBUSBSEN,如下图所示。
262265ddc12c760fa.png
PA9输出为3V3方波波形,如下图所示。
5171865ddc132b49d8.png
此时通过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也行)。

  

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 50.00 元 2024-03-19
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
21小跑堂 2024-3-19 16:56 回复TA
细心排查问题,根据手册查找原因,解决PA9默认作为OTG_FS_VBUS功能导致不能作为正常IO使用的问题。二姨贴心tips:https://bbs.21ic.com/icview-1849724-1-1.html (香水城大佬在论坛发表过该问题的决绝方法哦!以后遇到问题可以在论坛查找一下哦) 
狄克爱老虎油| | 2024-2-29 19:12 | 显示全部楼层
为什么要关闭这个地方啊

使用特权

评论回复
woai32lala|  楼主 | 2024-2-29 21:32 | 显示全部楼层
狄克爱老虎油 发表于 2024-2-29 19:12
为什么要关闭这个地方啊

对引脚输出有影响

使用特权

评论回复
yangjiaxu| | 2024-2-29 21:38 | 显示全部楼层
PA9感觉正常是用在串口上的,如果不用,就当个IO用就行了,好像需要开启一下复用时钟即可

使用特权

评论回复
woai32lala|  楼主 | 2024-3-1 08:51 | 显示全部楼层
yangjiaxu 发表于 2024-2-29 21:38
PA9感觉正常是用在串口上的,如果不用,就当个IO用就行了,好像需要开启一下复用时钟即可 ...

但初始化了USB不行

使用特权

评论回复
呐咯密密| | 2024-3-5 13:42 | 显示全部楼层
这就是引脚使用冲突了

使用特权

评论回复
trucyw| | 2024-3-20 08:42 | 显示全部楼层
IO冲突

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

103

主题

509

帖子

5

粉丝