为I2C配置STM32输出端口

问题描述 投票:5回答:1

我目前正在尝试使用一对stm32l152(发现工具包)通过I2C进行通信。 (我没有使用STM提供的标准外设库,因为我想尝试自己实现i2c ..)

我的配置如下:

  • 7位寻址模式(无双地址,仅OAR1)
  • 100khz的速度
  • 启用ACK(在从站上)
  • ACK被禁用(在主设备上,因为在任何时候主设备/从设备之间只传输1个字节)
  • 在主/从上,使用GPIOB(PB10)作为SCL,GPIOB(PB11)作为SDA

这是奇怪的部分:当我将2个GPIOB引脚配置为推挽式(无上拉/下拉)时,我能够看到我的主机在示波器上发送起始位,地址字节..

但我的奴隶并没有发回确认。我肯定知道这一点,因为主机没有在SR1中断言ADDR位,我看到示波器上没有确认,并且从机没有进入中断(我在从机上启用了I2C事件中断)。

仔细观察示波器上的波形,我意识到信号(SCL,SDA)没有完全达到0Volts的逻辑低电平,而是处于1伏特。我猜这可能是为什么奴隶无法从主机读取地址字节,因此没有发回ack。

所以我将2个GPIO引脚配置为漏极开路(无上拉/下拉)..但现在我的主机无法发出起始位..我单步执行代码,看到SR1中主机的SB位置1时设置START位..但我没有看到示波器上的SDA和SCL信号有任何响应(两者都高达3V)。

(我在每条线上使用10kohms将SCL和SDA拉到3v)。

stm32 i2c stm32l152
1个回答
5
投票

好吧,我想我找到了答案..我查找了STM提供的标准外设库,并按照其配置顺序进行了操作。在此之前,我使用了错误的配置GPIO端口的顺序......

测试的序列是:

  1. 启用i2c和GPIO时钟。
  2. 配置所需的端口AF。 (对于stm32中的i2c,AF4)。
  3. 配置GPIO: 3A。将GPIO设置为AF。 3B。设置端口速度。 3C。设置端口类型(开漏)。 3D。设置为无上拉/下拉。
  4. 配置i2c。 (注册CR2,CCR,CR1,OAR1,......)。

以前,我在第2步之前做了第3步,当我生成START位时,端口没有输出。

希望这可以帮助那些有同样问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.