STM32 I2C不工作

总结

本常见问题解答介绍了一些与STM32设备上的I2C外围设备相关的提示。
 

1.I2C硬件

1.1信号完整性

这个I2C IO引脚必须配置为开放式排水管模式逻辑高电平由外部驱动上拉电阻器。


I2C上拉电阻器的典型值(来自实践)为2.2千欧姆至10千欧姆之间而客户在观察错误的I2C总线时序时实现了100kOhm。内部上拉电阻器的典型值为40kOhm,因此必须填充外部
I2C的时序必须符合I2C规范。你应该测量并检查总线上的信号完整性。
 

(图1:I2C总线上的上拉)

1.2过滤器

如果您在I2C总线上看到不必要的故障(来自糟糕的PCB设计、电机控制应用程序等),您可以使用GPIO逻辑和I2C寄存器之间可用的数字和模拟噪声滤波器。
  • 模拟滤波器符合I2C规范,该规范要求抑制脉冲宽度高达50ns的尖峰。
  • 数字滤波器允许抑制可编程长度为1至15 I2CCLK周期的尖峰。
 

(图2:I2C滤波器)

但是注意过滤器设置。必须正确设置,否则过滤器可能会抑制公共通信。


1.3时间安排:

一些STM32设备具有I2C定时寄存器(I2C_TIMINGR),这可能会影响I2C通信。必须正确设置。以下是I2C时序规范的应用说明,以及如何配置寄存器的提示:
https://www.st.com/resource/en/application_note/dm00074956-i2c-timing-configuration-tool-for-stm32f3...
CubeMX工具可以自动进行计算,如果你填写所有需要的参数。
提示如何在公式中填充上升和下降时间:由于总线的容量不同,每个PCB可能有不同的上升和下降时刻。您应该在实际硬件上测量这些值,并将其用于计算。
 


2.I2C软件

2.1 HAL库

I2C HAL库允许在不深入了解寄存器的情况下使用I2C外围设备。每个CubeMX固件包(例如:STM32Cube_FW_F4_V1.25.0)包括以下文件:
stm32f4x_hal_i2c.c/h
stm32f4x_hal_i2c_ex.c/h
在这里您可以找到方便使用I2C的功能。甚至在ST评估板下的固件包中也有可用的例子。示例显示了如何将库的功能用于轮询、中断或DMA传输。
例如:
STM32Cube_FW_F4_V1.25.2\Projects\STM32F4发现\示例\I2C
  • 必须启用NVIC I2C中断才能使用中断和DMA模式
(图3:CubeMX中的I2C NVIC设置)
 

2.2寄存器的访问

如果您基于寄存器访问编写自己的I2C驱动程序必须始终遵循参考手册STM32设备。每种通信类型(主接收机、主发射机、从接收机、从发射机)都有带事件描述(EV)的“传输序列”图。每辆电动汽车都必须由驾驶员操作。以下是STM32F407中的一个示例-参考手册:
 

(图4:传输序列示例)
 

3.勘误表

如果您在STM32上遇到一些不稳定的行为,请不要忘记检查勘误表设备的。与I2C接口相关的要点很少。无论如何,每个设备的勘误表都是单独的。
 

4.STM32设备上的I2C引导加载程序

STM32引导加载程序中使用的I2C协议在应用说明AN4221中进行了描述:
https://www.st.com/resource/en/application_note/dm00072315-i2c-protocol-used-in-the-stm32-bootloader...