Bootstrap

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

 \bullet I2C_TypeDef * Instance

Instance”代表I2C寄存器基地址。每个I2C外设都有一个基地址,通过基地址来区分具体使用了哪个I2C外设。比如STM32F407芯片有两个I2C外设,分别是I2C1和I2C2,如果指定“Instance”的值为I2C1,则使用外设I2C1。

 \bullet 2C_InitTypeDef Init

Init”代表I2C通信的相关参数,在后文中详细介绍。

 \bullet uint8_t * pBuffPtr

pBuffPtr”指向I2C的数据传输缓冲区。

 \bullet uint16_t XferSize

XferSize”代表I2C传输数据的大小。

 \bullet __IO uint16_t XferCount

XferCount”代表传输计数器。

 \bullet DMA_HandleTypeDef * hdmatx

hdmatx”代表I2C使用DMA发送数据时的DMA句柄参数。

 \bullet DMA_HandleTypeDef * hdmarx

hdmarx”代表代表I2C使用DMA接收数据时的DMA句柄参数。

 \bullet  HAL_LockTypeDef Lock

Lock”代表I2C外设的锁定。即同一时刻只有一个设备能够使用I2C外设,防止设备互斥抢占。

 \bullet  __IO HAL_I2C_StateTypeDef State

State”代表I2C的通信状态。

 \bullet __IO HAL_I2C_ErrorTypeDef ErrorCode

ErrorCode”代表I2C的错误代码,用于快速定位传输异常。

1.2、I2C_InitTypeDef

 \bullet uint32_t ClockSpeed

指定时钟频率。这个参数必须小于400kHz。

 \bullet uint32_t DutyCycle

指定I2C快速模式的占空比。可选:I2C_DUTYCYCLE_2 或 I2C_DUTYCYCLE_16_9 I2C_CCR_DUTY,即 2:1 或 16:9。

 \bullet uint32_t OwnAddress1

指定首个设备自己的地址。这个地址可以是7位的或10位的。这个地址是I2C外设的自身设备地址,当STM32配置为从设备时,这个地址就是它的设备地址,主设备可以通过这个地址与STM32发起通信。

 \bullet uint32_t AddressingMode

指定寻址模式。可选 I2C_ADDRESSINGMODE_7BIT 或 I2C_ADDRESSINGMODE_10BIT,即,7位模式或10位模式。

 \bullet uint32_t DualAddressMode

指定是否启用双地址模式,即使用两个设备地址。

 \bullet uint32_t OwnAddress2

指定第二个设备自己的地址。当双设备模式启用时,该参数需要指定。

 \bullet uint32_t GeneralCallMode

指定是否启用通用呼叫模式。即主设备向所有I2C总线上的从设备进行广播通信,这在需要对所有从设备执行某些操作时非常有用,例如擦除在I2C总线上的所有从设备中的数据。参数可选I2C_GENERALCALL_DISABLED 或 I2C_GENERALCALL_ENABLED 。

 \bullet  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”。

 \bullet  __IO uint32_t CR1

I2C控制寄存器1,地址偏移:0x00

 \bullet  __IO uint32_t CR2

I2C控制寄存器2,地址偏移:0x04

 \bullet  __IO uint32_t OAR1

I2C 自身地址寄存器1,地址偏移:0x08

 \bullet  __IO uint32_t OAR2

I2C 自身地址寄存器2,地址偏移:0x0C

 \bullet  __IO uint32_t DR

I2C 数据寄存器,地址偏移:0x10

 \bullet  __IO uint32_t SR1

I2C 状态寄存器1,地址偏移:0x14

 \bullet  __IO uint32_t SR2

I2C 状态寄存器2,地址偏移:0x18

 \bullet  __IO uint32_t CCR

I2C 锁定控制寄存器,地址偏移:0x1C

 \bullet  __IO uint32_t TRISE

I2C 上升沿寄存器,地址偏移:0x20

(TRISE寄存器用于设置I2C时钟信号(SCL线)上升沿的最大时间,在实际应用中,开发者需要根据具体的硬件设计和I2C总线上的电气特性来配置TRISE寄存器的值。)

 \bullet  __IO uint32_t FLTR

I2C 数字滤波器寄存器,地址偏移:0x20

;