【STM32CubeMX学习教程】——9.IIC(硬件IIC外设)


一、I2C 简介

I2C(Inter-Integrated Circuit)是由飞利浦公司开发的一种简单的两线制串行通信总线。它只需要两根线:

  • SDA(Serial Data Line): 串行数据线,用于双向数据传输。
  • SCL(Serial Clock Line): 串行时钟线,由主机产生,用于同步数据传输。

二、核心特性

  • 半双工通信: 同一时间只能进行发送或接收。
  • 多主多从: 总线上可以连接多个主机和多个从机。
  • 地址寻址: 每个从设备都有一个唯一的7位或10位地址,主机通过地址选择通信对象。
  • 低速通信: 标准模式速度为100kbps,快速模式为400kbps,高速模式可达3.4Mbps。
  • 线与逻辑: 总线采用开漏输出结构,必须通过上拉电阻接到正电源。这意味着任何设备都可以将总线拉低(输出0),但释放后总线由电阻拉高(输出1)。这种结构便于实现时钟同步和仲裁。

三、通信过程解析

一次完整的I2C通信包含以下几个阶段:

1. 起始条件
  • 主机在SCL为高电平时,将SDA线从高电平拉低。
  • 这个下降沿通知总线上所有设备,一次传输开始了。
  • 函数:
HAL_I2C_Master_Transmit(&hi2c1, devAddr, pData, Size, Timeout)
2. 地址帧
  • 主机发送一个7位或10位的从机地址,后面跟一个读写位。
    • 读写位(R/W#): 0表示主机要向从机写入数据,1表示主机要向从机读取数据。
  • 从机收到地址后,如果与自身地址匹配,会回复一个应答位。
3. 应答(ACK)与非应答(NACK)
  • 每传输完一个字节(8位数据)后,接收方(无论是主机还是从机)需要在第9个时钟脉冲期间发送一个应答信号。
  • 应答(ACK): 接收方将SDA拉低,表示成功收到字节,并希望继续传输。
  • 非应答(NACK): 接收方不拉低SDA(保持高电平),表示不希望继续传输,通常用于终止通信。
4. 数据帧
  • 在地址帧之后,开始传输数据。每个数据字节也是8位,同样后跟一个ACK/NACK位。
  • 数据的方向由地址帧中的R/W位决定。
5. 停止条件
  • 主机在SCL为高电平时,将SDA线从低电平拉高。
  • 这个上升沿通知总线上所有设备,本次传输结束。
  • 函数:
HAL_I2C_Master_Transmit(&hi2c1, devAddr, pData, Size, Timeout)
6. 读写序列流程图
6.1主机向从机写数据
是(ACK)
是(ACK)
否(NACK)
地址错误或无设备
否(NACK)
从机无法接收
主机发起传输
产生起始条件
SCL高电平时SDA由高变低
发送地址帧
7位从机地址+W位 ( 0 )
从机是否应答(ACK)?
发送第1个数据字节
从机是否应答(ACK)?
还有更多数据要发送?
发送最后1个数据字节
主机发送NACK
告知从机停止发送
产生停止条件
SCL高电平时SDA由低变高
传输结束
产生停止条件
传输错误结束

流程图解读:
1.起始: 主机通过产生Start条件宣告通信开始。
2.寻址: 主机发送目标从机的地址和写方向位(0)。
3.应答检查: 从机如果地址匹配且准备就绪,会回复ACK。如果无应答(NACK),说明地址错误或从机不存在,主机直接终止传输。
4.数据循环:

  • 主机发送一个数据字节。
  • 从机每收到一个字节,回复ACK确认。
  • 主机继续发送下一个字节,直到所有数据发送完毕。
  • 如果从机在过程中回复NACK,表示它无法继续接收,主机会提前终止传输。

5.结束: 所有数据发送完毕后,主机产生Stop条件,释放总线。

6.2主机从从机读数据:
开始读取
发送START条件
发送从机地址+写位
从机是否应答?
发送要读取的寄存器地址
错误处理
从机是否应答?
发送重复START条件
发送从机地址+读位
从机是否应答?
读取数据字节
发送非应答NACK
发送STOP条件
读取完成
发送STOP条件
读取失败

流程图解读:
1.起始: 主机产生Start条件,开始本次通信。

2.寻址(写模式):
主机发送目标从机的7位地址和写方向位(0)
这告诉从机:“我要向你写入信息”。

3.发送寄存器地址:
主机发送要读取的寄存器地址。
这明确告诉从机:“我要读取的是你这个位置的数据”。

4.重复起始:
主机产生重复Start条件。
关键点: 在不释放总线的情况下,准备切换通信方向。

5.重新寻址(读模式):
主机再次发送从机地址,但改为读方向位(1)。
这告诉从机:“现在请把数据发给我”。

6.数据读取与终止:
从机开始发送数据字节。
主机接收数据后,回复NACK。
关键点:
NACK明确告知从机“这是我要的最后一个字节”。
主机产生Stop条件,结束通信。

  • 核心要点:
  • 先通过写模式指定要读取的寄存器地址
  • 通过重复起始条件切换通信方向
  • 最后必须用NACK明确终止数据传输
  • 适用于需要指定内部地址的复杂I2C设备

四、STM32CubeMX 配置 I2C(硬件I2C)

注:如果你不使用STM32的硬件I2C外设,而是用两个普通的GPIO口,通过软件控制其高低电平来模拟I2C的时序,那么就不需要在CubeMX中配置硬件I2C。你只需要配置那两个GPIO口为输出模式即可,相关代码可查看下一篇文章“【STM32CubeMX学习教程】——10.软件模拟IIC”。

1.新建工程

1.双击打开桌面下载好的STM32CubeMX,点击File–>New Project,或直接点击ACCEE TO MCU SELECTOR

Alt
2.在左边搜索栏里输入使用的芯片型号,右边选中并开始创建

Alt

2.设置RCC时钟源

设置高/低速时钟源都由外部晶振产生。

Alt

3.设置IIC参数

Alt

1.I2C Speed Mode(I2C速度模式):是STM32CubeMX中配置I2C通信速率的关键参数。选择建议: 1)不确定时,或与常见传感器/存储器通信:选择 Fast Mode (400 kHz)。2)与老旧设备通信或长线传输:选择 Standard Mode (100 kHz)。
2.I2C Clock Speed (Hz)(I2C时钟速度):用于设置I2C总线通信时SCL(串行时钟线)的实际频率。它直接决定了数据传输的快慢。
3.Clock No Stretch Mode(时钟无延展模式):禁用(Disabled):允许时钟延展。这是标准且推荐的模式。启用(Enabled):禁止时钟延展。这是一种特殊模式,用于特定场景。
4.Primary Address Length selection(主地址长度选择):用于设置STM32作为I2C从机时,它自身的I2C地址是7位还是10位通俗来讲: 当另一个I2C主机(比如另一个MCU)在总线上发送寻址帧时,STM32会根据这里设置的长度来判断“主机呼叫的是不是我?”
5.Dual Address Acknowledged(双地址应答):允许STM32在作为I2C从机时,同时响应两个不同的I2C从机地址。 当这个功能使能后,STM32的I2C外设会监听总线上的寻址帧。如果主机发送的地址与两个预设地址中的任意一个匹配,STM32都会产生应答(ACK),表示“我收到了,是我!”,并准备进行后续通信。
6.Primary slave address(主从设备地址):用于设置当STM32微控制器工作在I2C从机模式(Slave Mode) 时,它在I2C总线上的唯一标识地址。当总线上的I2C主机想要与这个STM32从机通信时,主机必须在发送的数据帧中包含这个地址。STM32的I2C硬件会持续监听总线,一旦检测到与自己“主从设备地址”匹配的呼叫,就会做出响应。
7.General Call address detection(通用呼叫地址检测):决定STM32的I2C从机是否响应一个特殊的广播地址(0x00)。当这个功能使能后,如果I2C主机向地址0x00发送数据,总线上所有使能了该功能的从机都会同时接收这些数据。

4.时钟配置

1.时钟源设置
默认时钟源是由内部RC振荡器产生,可通过图中按钮进行修改,外部晶振数值取决于实际电路板上的晶振大小.

Alt
提示:

  • 这里用到的芯片的最大时钟频率是100MHz,有的芯片最大只有72MHz,实际最大频率可通过查看芯片数据手册确定。

2.时钟频率设置

Alt
①PLLM—PLL输入时钟分频系数,根据自己需要的系统时钟频率来进行修改
②PLLN—主PLL倍频系数(自动计算)
③PLLP—主PLL分频系数(自动计算)
④SYSCLK—系统时钟
⑤HCLK—AHB总线时钟,由系统时钟SYSCLK 分频得到,一般不分频,等于系统时钟
⑥APB1/APB2 Prescaler—APB1/APB2总线的预分频系数,可根据需要修改

5.工程文件设置

1.工程设置
注:工程路径中不能有中文,否则会输出错误。
库文件要提前下载好,具体方法在 “【STM32CubeMX学习教程】——1.软件安装” 这一篇文章中有提到。

Alt
2.代码生成设置

Alt
3.点击右上角按钮生成代码,之后会出现下面的窗口,再点击打开工程即可在用keil查看工程代码。

Alt

6.编译成功,0错误0警告

Alt


以上就是本章的全部内容,如果对你有帮助,欢迎点赞支持,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玥山山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值