STM32 HAL 硬件I2C使用记录
以前听说硬件I2C有BUG,一直用的都是IO模拟,现在试了下硬件I2C没问题了,在此分享下
I2C配置
查看生成的代码
在此之前,网上最多问题是使用I2C时,程序一直返回BUSY,导致该问题的原因是程序没有复位I2C。
使用1.5版本的STM32Cube IDE生成的代码已经调用复位了I2C
使用I2C读取TMP103温度传感器
直接使用库函数
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
值得注意的是,从设备的地址(DevAddress)的7位地址是左对齐的
问题排查
如果看到代码已经执行过复位了
/Reset I2C/
hi2c->Instance->CR1 |= I2C_CR1_SWRST;
hi2c->Instance->CR1 &= ~I2C_CR1_SWRST;
但还是一直返回BUSY的话,那可能是SCL和SDA上拉电阻虚焊。两个地方都要加4.7K的上拉电阻