当前位置: 首页 > article >正文

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


http://www.kler.cn/news/324498.html

相关文章:

  • 英伟达Blackwell系列显卡揭秘:RTX 5090与RTX 5080引领性能新高度
  • [SAP ABAP] SELECTION-SCREEN
  • LeetCode - #124 二叉树中的最大路径和(Top 100)
  • 如何使用tcpdump android手机抓包
  • AI大模型的基本流程
  • 2025第四届深圳国际数据中心液冷散热展会
  • Certbot自动申请并续期https证书
  • 01_OpenCV图片读取与展示
  • numpy数组与矩阵运算
  • 自动化运维的利器:Ansible、Puppet和Chef详解
  • OpenAPI鉴权(二)jwt鉴权
  • 关于 SQL 的 JOIN 操作
  • 【接口测试】测试试题
  • 工作中使用人工智能的政策和程序的重要性
  • 【YOLO目标检测反光衣数据集】共2388张、已标注txt格式、有训练好的yolov5的模型
  • 服务器感染了.lcrypt勒索病毒,如何确保数据文件完整恢复?
  • 【VUE】vue-router
  • [uni-app]小兔鲜-04推荐+分类+详情
  • CSS 中的overscroll-behavior属性
  • 国产化低功耗低延时广覆盖物联网无线通讯方案_LAKI芯片
  • [数据集][目标检测]辣椒缺陷检测数据集VOC+YOLO格式695张5类别
  • C/C++语言基础--C++面向对象、类、对象概念讲解
  • Qt开发技巧(九)去掉切换按钮,直接传样式文件,字体设置,QImage超强,巧用Qt的全局对象,信号槽断连,低量数据就用sqlite
  • Visual Studio 2022
  • 大功率蓝外光激光模组能使用多长时间?
  • STM32+PWM+DMA驱动WS2812 —— 2024年9月24日
  • 信息安全工程师(23)网络安全体系相关模型
  • H.264编解码介绍
  • 什么是托管安全信息和事件管理 SIEM?
  • STM32嵌入式编程学习到提高:【4】UART串口打印