STM32的IIC库函数使用误区

发布时间: 2024-02-26
来源: 电子工程世界

HAL库里有很多的IIC的库函数,比如


HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)

HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);

HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size)等

这些函数参数需要使用发送的器件地址,数据地址和数据长度。具体的器件地址需要查询数据手册。很多原理图会标记出器件的地址(七位地址),如果不看手册,直接使用此地址进行读写的话往往是不行的。



这里的地址一般使用的是八位地址,IIC的器件手册给的一般是七位地址比如下两个图的A2A1A0如果全都为0,七位地址就是1110000=0x70;

图片

图片

但是根据读写要将此地址左移一位,然后最低位赋值0或者1。此例子中,读地址为11100001=0xE1;


写地址为11100000=0xE0。使用库函数的时候要使用这两个地址,不要直接使用0x70这个地址。


以此地址为例可以进行如下读写。


写:

HAL_I2C_Master_Transmit_IT(&hi2c1,0xE0, Pointer_Register,1);

while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)

{

  ;

}

读:

HAL_I2C_Master_Receive_IT(&hi2c1, 0xE1, pData,1);

while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)

{

  ;

}


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。