者简介:嵌入式入坑者,与大家一起加油,希望文章能够帮助各位!!!!
个人主页:@rivencode的个人主页
系列专栏:玩转STM32
推荐一款模拟面试、刷题神器,从基础到大厂面试题点击跳转刷题 站进行注册学习
目录
- 一.I2C协议简介
- 二.I2C物理层
- 三.I2C协议层
-
- I2C 基本读写过程
- 1.空闲状态
- 2.起始信 与停止信
- 3.数据有效性
- 4.地址及数据方向
- 5.应答与非应答信
- 四.硬件I2C
-
- I2C外设功能框图(重点)
- 1.通信引脚
- 2.时钟控制逻辑
- 3.数据控制逻辑
- 4.整体控制逻辑
- 5.STM32的I2C外设通信过程(超级重要)
-
- 主发送器
- 主接收器
- 6.I2C初始化结构体
- 五.EEPROM简介
-
- 1.STM32向从机EEPROM写入一个字节
- 2.STM32向从机EEPROM写入多个字节(页写入)
- 3.STM32随机读取EEPROM内部任何地址的数据
- 4.STM32随机顺序读取EEPROM内部任何地址的数据
- 六.硬件I2C读写EEPROM实验
-
- 实验目的
- 实验原理
- 源码
- 实验效果
- 七.软件模式I2C协议
-
- 实验目的
- 实验原理
- 源码
- 八.总结
一.I2C协议简介
I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备(那些电平转化芯片),现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
I2C只有一跟数据总线 SDA(Serial Data Line),串行数据总线,只能一位一位的发送数据,属于串行通信,采用
- 半双工通信:可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替进行,其实也可以理解成一种可以切换方向的单工通信,同一时刻必须只能一个方向传输,只需一根数据线.
对于I2C通讯协议把它分为物理层和协议层物理层规定通讯系统中具有机械、电子功能部分的特性(硬件部分),确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准(软件层面)。
二.I2C物理层
I2C 通讯设备之间的常用连接方式
开漏输出PMOS不工作
1.当输出寄存器输出高电平,引脚输出高阻态相当于(),假设该引脚接到I2C的SDA总线上,则总线被默认拉成高电平。
2.当输出寄存器输出低电平,引脚输出低电平。
复用功能模式中,输出使能,输出速度可配置,可工作在开漏模式, 但是输出信 源于其它外设(来自I2C外设),输出数据寄存器 GPIOx_ODR 无效;输入可用,,但一般直接用外设的寄存器来获取该数据信
这里SMT32,I2C外设的两个引脚SDA,SCL就要配置成复用功能的开漏输出模式,输出信 源于I2C外设。
为什么引脚要设置成开漏模式
以及为什么两根总线要上拉电阻接高电平,总线默认情况是高电平,详情看下图。
根据 I2C 协议,这个从机地址可以是 7 位或 10 位,从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信 ,只有接收到应答信 后,主机才能继续发送或接收数据。
在地址位之后,是传输方向的选择位,表示后面的数据传输方向
该位为 0 时:主机向从机写数据。
该位为 1 时:主机由从机读数据。
- 2.主机向从机读取数据
I2C总线的SDA和SCL两条信 线同时处于高电时,则为总线空闲状态,所有挂载在总线上的设备都输出高阻态(相当于断开与总线的连接),两条总线被上拉电阻的把电平拉高。
2.起始信 与停止信
4.地址及数据方向
I2C 总线上的每个设备都有自己的独立地址,主机发起通讯时,通过 SDA 信 线发送设备地址(SLAVE_ADDRESS)来查找从机。I2C 协议规定设备地址可以是 7 位或 10 位,实际中。紧跟设备地址的一个数据位用来表示数据传输方向,第 8 位或第 11 位。
- 数据方向位为“1”:表示主机由从机读数据
-
-
SDA 为高电平:表示非应答信 (NACK)
-
SDA为低电平:表示应答信 (ACK)
为什么数据发送端要释放 SDA 的控制权(将SDA总线置为高电平)
1.通信引脚
STM32中有两个I2C外设,硬件I2C必须要使用这些引脚,因为这些引脚才连接到I2C引脚,就比如说PB6与PB7引脚就连接到芯片内部的I2C1外设。
这里只是演示一下这么计算寄存器写入的值,用库函数我们只要配置好相应寄存器的参数,库函数会帮我计算自动写入的,不要慌。
3.数据控制逻辑
4.整体控制逻辑
这里挑一些重点的寄存器位,我们只需配置好寄存器就可以让I2C外设硬件逻辑自动控制SDA,SCL总线去产生I2C协议的时序如:起始信 、应答信 、停止信 等等
- 总线错误(BERR)
在一个地址或数据字节传输期间,当I2C接口检测到一个外部的停止或起始条件则产生总线错误。此时:
● BERR位被置位为’1’;如果设置了ITERREN位,则产生一个中断;
● 在从模式情况下,数据被丢弃,硬件释放总线:
─ 如果是,从设备认为是一个重启动,并等待地址或停止条件。
─ 如果是,从设备按正常的停止条件操作,同时硬件释放总线。
● 在主模式情况下,硬件不释放总线,同时不影响当前的传输状态。此时由软件决定是否要中止当前的传输
- 应答错误(AF)
当STM32检测到一个无应答位时,产生应答错误。此时:
● AF位被置位,如果设置了ITERREN位,则产生一个中断;
● 当发送器接收到一个NACK时,必须复位通讯:
─ 如果是处于从模式,硬件释放总线。
─ 如果是处于。
5.STM32的I2C外设通信过程(超级重要)
I2C模式选择:
接口可以下述4种模式中的一种运行:
● 从发送器模式
● 从接收器模式
● 主发送器模式
● 主接收器模式
该模块默认地工作于从模式。接口在;当仲裁丢失或产生停止信 时,则从主模式切换到从模式。允许多主机功能。- 主模式:STM32作为主机通信(发送器与接收器)
- 从模式:STM32作为从机通信(发送器与接收器)
I2C主模式:
默认情况下,I2C接口总是工作在从模式。从从模式切换到主模式,需要产生一个起始条件。在主模式时,I2C接口。串行数据传输总是以起始条件开始并以停止条件结束。当。
主发送器
-
起始条件当BUSY=0时,设置START=1,I2C接口将产生一个开始条件并切换至主模式(M/SL位置位)
-
EV8事件
-
-
EV7_1事件
关闭通信
。接收到NACK后,从设备释放对SCL和SDA线的控制;主设备就可以发送一个停止/重起始条件。
● 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
● 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
● 只接收一个字节时,刚好在EV6之后(EV6_1时,清除ADDR之后)要关闭应答和停止条件的产生位。在产生了停止条件后,I2C接口自动回到从模式(M/SL位被清除)
这里产生一个NACK其实就是清除ACK位,将ACK位置0,后面接收的一个字节不在产生应答就是非应答咯
硬件I2C写代码必须熟练掌握和理解主发送器和主接收器的过程,只要你理解了写代码还不是信手拈来,简简单单,然后写代码你会发送就是上面的过程一模一样
6.I2C初始化结构体
- I2C_DutyCycle
设置I 2 C的SCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间为2:1 ( I2C_DutyCycle_2)和16:9(I2C_DutyCycle_16_9)。
这个模式随便选反正区别不大。
- I2C_Ack_Enable
配置I 2 C应答是否使能,设置为使能则可以发送响应信 。一般配置为允许应答(I2C_Ack_Enable)若STM32接收一个字节数据自动产生应答,必须要使能
记得使能I2C外设
五.EEPROM简介
EEPROM全称: electrically-erasable, and programmable read-only memory –》可电擦除的可编程的只读存储器,这里的只读并不是只能读,是以前ROM不能写只能读,现在的EEPROM已经是可读写的啦,为什么还叫可读:只不过是保留下来的名字而已。
EEPROM的设备地址(作为从机)
1.STM32向从机EEPROM写入一个字节
总结:
- 进行页写入时,写入的存储器地址要对齐到8,也就是说只能写入地址为 0 8 16 32… 能整除8
- 页写如只能一次写入8个字节
规定就是规定我也没有办法,不然就会出错
- 确认EEPROM是否写入完成:
六.硬件I2C读写EEPROM实验
实验目的
STM32作为主机向从机EEPROM存储器写入256个字节的数据
STM32作为主机向从机EEPROM存储器读取写入的256个字节的数据读写成功亮绿灯,读写失败亮红灯
实验原理
编程要点
(1) 配置通讯使用的目标引脚为开漏模式;
(2) 编写模拟 I2C 时序的控制函数;
(3) 编写基本 I2C 按字节收发的函数;
(4) 编写读写 EEPROM 存储内容的函数;
(5) 编写测试程序,对读写数据进行校验。两个引脚PB6,PB7都要配置成复用的开漏输出
这里有一个注意的点,你配置成输出模式,并不会影响引脚的输入功能
详情请看——>GPIO端口的八种工作模式
源码
i2c_ee.h
前面理论已经讲得已经很详细了,直接上代码叭!!声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!
-
EV7_1事件