I2C通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示: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通讯的理论理解,希望我的文章能对您进步有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值