HAL库I2C通用驱动程序(HAL I2C Generic Driver)
本文重点叙述 HAL 库的 I2C 驱动程序。也就是说,用 HAL 库提供的库函数来驱动芯片的 I2C 外设。本文重点关注函数本身的功能和作用,了解各函数的功能和作用后才能调用这些函数,并通过文章《如何使用IIC外设(硬件IIC)-CSDN博客》来使用 I2C 外设。(本文内容来自芯片 STM32F407xx 的用户手册)
库函数中各形参的功能和作用与 I2C 的通信协议联系十分紧密,因此,了解 I2C 的通信协议对全面理解库函数的功能和作用十分有必要,文章《IIC通信基础_cpu的iic通信-CSDN博客》介绍了I2C的通信协议,同学们可以回顾。
1、I2C Firmware driver registers structures
1.1、I2C_HandleTypeDef
I2C_TypeDef * Instance
“Instance”代表I2C寄存器基地址。每个I2C外设都有一个基地址,通过基地址来区分具体使用了哪个I2C外设。比如STM32F407芯片有两个I2C外设,分别是I2C1和I2C2,如果指定“Instance”的值为I2C1,则使用外设I2C1。
2C_InitTypeDef Init
“Init”代表I2C通信的相关参数,在后文中详细介绍。
uint8_t * pBuffPtr
“pBuffPtr”指向I2C的数据传输缓冲区。
uint16_t XferSize
“XferSize”代表I2C传输数据的大小。
__IO uint16_t XferCount
“XferCount”代表传输计数器。
DMA_HandleTypeDef * hdmatx
“hdmatx”代表I2C使用DMA发送数据时的DMA句柄参数。
DMA_HandleTypeDef * hdmarx
“hdmarx”代表代表I2C使用DMA接收数据时的DMA句柄参数。
HAL_LockTypeDef Lock
“Lock”代表I2C外设的锁定。即同一时刻只有一个设备能够使用I2C外设,防止设备互斥抢占。
__IO HAL_I2C_StateTypeDef State
“State”代表I2C的通信状态。
__IO HAL_I2C_ErrorTypeDef ErrorCode
“ErrorCode”代表I2C的错误代码,用于快速定位传输异常。
1.2、I2C_InitTypeDef
uint32_t ClockSpeed
指定时钟频率。这个参数必须小于400kHz。
uint32_t DutyCycle
指定I2C快速模式的占空比。可选:I2C_DUTYCYCLE_2 或 I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY,即 2:1 或 16:9。
uint32_t OwnAddress1
指定首个设备自己的地址。这个地址可以是7位的或10位的。这个地址是I2C外设的自身设备地址,当STM32配置为从设备时,这个地址就是它的设备地址,主设备可以通过这个地址与STM32发起通信。
uint32_t AddressingMode
指定寻址模式。可选 I2C_ADDRESSINGMODE_7BIT 或 I2C_ADDRESSINGMODE_10BIT,即,7位模式或10位模式。
uint32_t DualAddressMode
指定是否启用双地址模式,即使用两个设备地址。
uint32_t OwnAddress2
指定第二个设备自己的地址。当双设备模式启用时,该参数需要指定。
uint32_t GeneralCallMode
指定是否启用通用呼叫模式。即主设备向所有I2C总线上的从设备进行广播通信,这在需要对所有从设备执行某些操作时非常有用,例如擦除在I2C总线上的所有从设备中的数据。参数可选I2C_GENERALCALL_DISABLED 或 I2C_GENERALCALL_ENABLED 。
uint32_t NoStretchMode
指定是否启用 NoStretchMode(禁止时钟拉伸)。时钟拉伸,允许从设备在需要额外时间处理数据时通过拉低SDA(数据线)。可选 I2C_NOSTRETCH_DISABLED 或 I2C_NOSTRETCH_ENABLED。
#注意:如果选择“ENABLED”则禁用时钟拉伸,则从设备不能拉低SCL线;如果选择“DISABLED”则启用时钟拉伸,则从设备可以拉低SCL线。
(这个参数比较重要,当出现“SCL线的电平被从从设备拉低”的现象时,可以选择调整此参数)
1.3、I2C_TypeDef
“I2C_TypeDef”这个结构体类型,代表了I2C外设的寄存器映射,也就是寄存器的地址值。我们可以通用该结构体直接操作寄存器。我们使用HAL库编程时,主要是使用结构体“I2C_HandleTypeDef”和“I2C_InitTypeDef”。
__IO uint32_t CR1
I2C控制寄存器1,地址偏移:0x00
__IO uint32_t CR2
I2C控制寄存器2,地址偏移:0x04
__IO uint32_t OAR1
I2C 自身地址寄存器1,地址偏移:0x08
__IO uint32_t OAR2
I2C 自身地址寄存器2,地址偏移:0x0C
__IO uint32_t DR
I2C 数据寄存器,地址偏移:0x10
__IO uint32_t SR1
I2C 状态寄存器1,地址偏移:0x14
__IO uint32_t SR2
I2C 状态寄存器2,地址偏移:0x18
__IO uint32_t CCR
I2C 锁定控制寄存器,地址偏移:0x1C
__IO uint32_t TRISE
I2C 上升沿寄存器,地址偏移:0x20
(TRISE寄存器用于设置I2C时钟信号(SCL线)上升沿的最大时间,在实际应用中,开发者需要根据具体的硬件设计和I2C总线上的电气特性来配置TRISE寄存器的值。)
__IO uint32_t FLTR
I2C 数字滤波器寄存器,地址偏移:0x20