STM32 HAL 库中的 HAL_I2C_Master_Transmit 与 HAL_I2C_Mem_Write 区别详解
在使用 STM32 微控制器进行 I2C 通信时,STM32 HAL(硬件抽象层)库提供了丰富的函数来简化开发过程。本文将详细介绍两个常用的 I2C 数据传输函数:HAL_I2C_Master_Transmit
和 HAL_I2C_Mem_Write
,并解释它们之间的区别。
1. HAL_I2C_Master_Transmit
HAL_I2C_Master_Transmit
函数用于向一个 I2C 设备发送数据。它只负责将一个数据块发送到指定的从设备地址,而不管这些数据是否会被存储在一个特定的内存地址中。
函数原型
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c,
uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
参数说明
hi2c
:指向 I2C_HandleTypeDef
结构的指针,该结构包含了 I2C 外设的配置信息。DevAddress
:目标设备地址,通常是 7 位地址左移一位得到的 8 位地址。pData
:指向要发送的数据缓冲区的指针。Size
:要发送的数据字节数。Timeout
:超时时间(毫秒),如果在此时间内没有完成传输,则会返回超时错误。使用场景
HAL_I2C_Master_Transmit
适用于简单的数据块传输,比如发送一个命令序列或者一组数据给一个没有内部地址空间的设备。
2. HAL_I2C_Mem_Write
HAL_I2C_Mem_Write
函数则用于向一个具有内部地址空间的 I2C 设备写入数据。这个函数允许你指定数据将被写入设备的哪个内部地址,这对于那些具有多个寄存器或内存区域的设备是非常有用的。
函数原型
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,
uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData,
uint16_t Size, uint32_t Timeout)
参数说明
hi2c
:指向 I2C_HandleTypeDef
结构的指针。DevAddress
:目标设备地址。MemAddress
:设备内部的内存地址。MemAddSize
:内存地址的大小(字节数),通常为 1 或 2 字节。pData
:指向要写入的数据缓冲区的指针。Size
:要写入的数据字节数。Timeout
:超时时间(毫秒)。使用场景
HAL_I2C_Mem_Write
更加灵活,因为它允许你指定数据的目的地址,而不仅仅是设备地址。这使得你可以直接访问设备内部的寄存器或内存区域。
3. 总结
区别总结
- 用途:
HAL_I2C_Master_Transmit
适用于简单的数据块传输;HAL_I2C_Mem_Write
适用于需要写入具体内存地址的数据。 - 参数:
HAL_I2C_Mem_Write
比HAL_I2C_Master_Transmit
多了两个参数MemAddress
和MemAddSize
,用于指定内部地址和地址大小。 - 复杂度:
HAL_I2C_Mem_Write
更加灵活,因为它允许你指定数据的目的地址,而不仅仅是设备地址。
选择哪个函数取决于你的应用需求和目标设备的功能。如果你只是简单地发送一些数据给设备,那么 HAL_I2C_Master_Transmit
就足够了。但是,如果你需要与具有内部地址的设备进行通信,你应该使用 HAL_I2C_Mem_Write
。
作者:凉风yx