为I2C配置STM32输出端口

时间:2014-06-06 09:38:30

标签: stm32 i2c stm32l152

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

我的配置如下:

  • 7位寻址模式(无双地址,仅OAR1)

  • 100khz speed

  • 启用ACK(在从站上)

  • ACK被禁用(在主设备上,因为任何时候主设备/从设备之间只传输1个字节)

  • 主机/从机上的
  • ,使用GPIOB(PB10)作为SCL,GPIOB(PB11)作为SDA

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

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

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

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

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

1 个答案:

答案 0 :(得分: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,......)。

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

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