提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:I2C是发展嵌入式,单片机等必不可少的通讯协议之一,为此,记以文章后续巩固,也希望我的文章能帮助正在学习I2C通讯的你有所帮助。
I2C 是什么?
一. I2C 总线通信协议
1. I2C总线系统结构
他是一个支持多设备的总线,“总线”指多个设备共用的信号线,在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL),数据线即表示数据,书中用于收发数据同步。
每个连接到总线的设别都有独立的地址,主机可以利用这个地址进行不同设备直接访问。
2.I2C总线物理层特点
总线通过上拉电阻到电源,当I2C设备空闲时,会输出高阻态(断路),而当所有设别都空闲,都输出高阻态,由上拉电阻把总线拉成高电平。
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定哪个设备占用总线。
具有三种传输模式:标准模式传输速率位100kbit/s,快速模式为400kbit/s。
3.I2C总线协议层
I2C的协议定义通讯的起始和停止信号,数据有效性,响应,仲裁,时钟同步和地址广播等环节。
二. I2C基本读写过程
1.主机写数据到从机
///:主机发送 空白:从机发送
S:传输开始信号
SLAVE_ADDRESS:从机地址
R/W :传输方向选择位,1为读,0为写
A/A:应答(ACK)或非应答信号(NACK)
P:停止传输信号
起始信号产生后,所有从机就开始等待主机广播下来的从机地址信号,在I2C总线上,每个设备地址是唯一的,当主机广播的地址和某个设备地址相同时,这个设备就被选中了,没被选中的设备会自动忽略之后的数据信号,根据I2C协议,这个地址可以是7或者10位的
在地址位之后,是传输方向的选择位,为0:表示后面的数据传输方向是由主机传输至从机,为1则相反
从机接受到匹配的地址后,主机或从机会返回一个ACK 或NACK,只有接受到ACK后,主机才能继续发送或接受数据
当数据传输结束,主机向从机发送一个停止传输信号(P),表示不再传输数据
、
2.主机读从机数据到主机
///:主机发送 空白:从机发送
S:传输开始信号
SLAVE_ADDRESS:从机地址
R/W :传输方向选择位,1为读,0为写
A/A:应答(ACK)或非应答信号(NACK)
P:停止传输信号
广播完地址后,接受到ACK,从机开始向主机传输数据(DATA),数据包也为8位,从机每发送完一个数据后,都会等待主机发送应答信号,当主机希望停止接受数据,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输
3.通讯复合模式
///:主机发送 空白:从机发送
S:传输开始信号
SLAVE_ADDRESS:从机地址
R/W :传输方向选择位,1为读,0为写
A/A:应答(ACK)或非应答信号(NACK)
P:停止传输信号
复合模式,该传输过程1有两次起始信号(S),在第一次传输过程中,主机通过SLAVE_ADDRESS寻到从机地址后,发送一次数据,这段数据通常用于表示从设备内部的寄存器或者存储器地址;第二次传输中,对该地址的内容进行读或写,也就是说第一次通讯是告诉从机读写地址,第二次则是读写实际内容
三. I2C通讯过程各个状态详解
1.空闲状态
I2C总线的SDA和SCL两条信号线都处于高电平,规定位总线的空闲状态。
2.开始信号/停止信号
起始信号:当SCL为高电平期间,SDA有从高到低的跳变;启动信号是一种电平跳变时序,而不是一个电平信号
停止信号:当SCL为高电平期间,SDA有从低到高的跳变;停止信号是一种电平跳变时序,而不是一个电平信号
起始信号和停止信号一般由主机产生
3.应答信号
发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK)表示接收器已经成功接受该字节;应答信号位高电平时,规定为非应答信号(NACK),一般表示接收器接收该字符没有成功。
对于反馈有效ACK的要求是,接收器在第九个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为有效的低电平。
如果接收器为主控器,则在它接收到最后一个字节后,发送NACK信号前期,以通知被控器数据数据发送,并释放SDA线,以便主控接收器发送一个停止位p
4.数据的有效性
I2C总线进行数据传输时,时钟信号的高电平期间,数据线上的数据必须保持稳定,只有在时钟线上信号为低电平期间,数据线上的高电平或者低电平状态才允许变换。SDA数据线在SCL的每个时钟周期传输一位数据。每次传输的字节数不受限制
即:数据在SCL的上升沿到来之间数据就需准备好,并在下降沿到来之前必须稳定
5.数据传输
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据地传输时边沿触发
四. I2C特性及架构
1.协议
软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑
硬件实现协议:由STM32 I2C片上外设专门负责实现I2C通讯协议,只要配置好改外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,并使软件设计更加简单。
STM32的I2C外设可作用以通讯的主机及从机,支持100kbit/s和400kbit/s的速率,支持7位,10位的设备地址,支持DMA数据传输,并具有数据校验功能。
2.时钟控制逻辑
SCL线的时钟信号,由I2C接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。
可选择I2C通讯模式:标准(100kbit/s)/快速(400kbit/s)
在快速模式下可选择SCL时钟占空比,可选T(LOW)/T(HIGH)=2 或者 选T(LOW)/T(HIGH)=16/9模式
CCR寄存器中12位的配置因子CCR,它与I2C外设的输入时钟源共用作用,产生SCL之中。STM32的I2C外设输入时钟源于PCLK1.
3.数据控制寄存器
I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是 数据寄存器(DR),地址寄存器(OAR),PEC寄存器以及SDA数据线
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去。
当从外部接收数据时,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中
五. STM32的通讯过程
控制产生起始信号(S),当发生起始信号后,它产生事件EV5,并会对SR1寄存器的SB位置置1,表示起始信号已经发生。
发生设备地址并等待应答信号,若有从机应答,则产生事件EV6及EV8,这时SR1寄存器的ADDR位及TXE位被置1,ADDR位1表示地址已经发送,TXE表示数据寄存器为空。
往I2C的数据寄存器DR写入要发送的数据,这是TXE位会被置0,表示数据寄存器非空,I2C外设通过SDA信号线一位位把数据发送出去后,又会产生EV8事件,即TXE被置1,重复这个过程,可以发送多个字节。
发送数据完成后,控制I2C设备产生一个停止信号P,这个时候产生EV8_2事件,SR1的TEX位及BTF位被置1,表示通讯结束。
总结
以上便是对 I2C通讯的理论理解,希望我的文章能对您进步有所帮助。