I2C总线介绍
I2C(Inter-Integrated Circuit)总线是由Philips公司开发的一种双向二线制同步串行总线,它只需要两条线(SDA,SCL)即可在连接于总线上的器件之间传送信息。I2C总线的工作速率有100k、400k和4M三种,支持多机通讯,支持多主控模块但同一时刻只允许有一个主控端。
SCL(Serial Clock):边沿触发方式,上升沿将数据输入到EEPROM,下降沿驱动EEPROM输出数据。
SDA(Serial Data Line):双向数据线,OD门,每次传输8bit。
成都英创ETA202 I2C矩阵键盘扩展模块
I2C总线中主要定义如下:
发送机(Transmitter):向总线传输数据的设备。
接收机(Receiver):从总线接收数据的设备。
主机(Master):产生时钟、启动发送、发送I2C命令、停止发送的设备。
从机(Slave):监听总线并且被主机寻址的设备。
多主控(Multi-master):总线上可以有多个主机,每一个都可以发送命令。
仲裁(Arbitration):在有多个主机同时尝试控制总线时,只允许其中一个控制总线并使报文不被破坏的过程。
同步():两个或多个设备同步时钟信号的过程。
SCL和SDA信号都是双向的,他们通过电阻连接到电源上,总线空闲时两条线都处于高电平状态。I2C总线上的设备都必须有集电极开路或者漏极开路管脚,激活总线意味着拉低其电平。单个总线上的设备数量几乎是无限的,唯一的要求是总线电容不超过400pF。由于逻辑1取决于电源电压的大小,因此没有标准的总线电压。
I2C总线挂载设备示意图
I2C时序分析
总线空闲
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线的上拉电阻把电平拉高。
启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低。启动信号必须是跳变信号,而且在建立该信号前必须保证总线处于空闲状态。
停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使SDA返回高电平,停止信号也必须是跳变信号。
I2C启动信号START与停止信号STOP
应答信号ACK
发送器每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个应答信号ACK(将SDA的电平拉低)来表示数据成功接收。
无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,而接收器不拉SDA电平,则表示一个无应答信号NACK,NACK有两种用途:
(1)一般表示接收器未成功接收数据字节。
(2)当接收器是主机时,它收到最后一个字节后,应发送一个NACK信号,以通知从机结束数据发送,并释放总线,以便主机发送停止信号STOP。
数据传输
每个时钟脉冲传输1比特数据。SDA信号只在SCL处于低电平时变化,SCL处于高电平期间,SDA电平必须保持稳定。
I2C数据传输时SDA与SCL电平变化情况
I2C数据传输流程
I2C总线协议
基本工作原理
主设备以启动信号START来掌管总线,以停止信号STOP来释放总线。主设备启动的每一个I2C命令均以START开始,以STOP结束。
启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位为读/写控制位R/W。R/W为0表示主机向从机写数据,R/W为1表示主机从从机读取数据。当从机检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号。每个数据字节在传送时都是高位(MSB)在前。
I2C基本工作流程
写数据过程
1、主机检测到总线空闲之后,发送启动信号START信号掌管总线。
2、主机发送一个地址字节(包括7位地址码和1位R/W)。
3、当从机检测到主机发送的地址与自己的地址相同以后,发送应答信号(ACK)。
4、主机收到应答信号ACK后,开始发送第一个数据字节。
5、从机收到数据字节后,发送应答信号ACK表示继续传送数据,发送NACK表示数据传送结束。
6、主机发送完全部数据后,发送停止信号STOP,结束通讯并释放总线。
读通讯过程
1、主机检测到总线空闲之后,发送启动START信号掌管总线。
2、主机发送一个地址字节(包括7位地址码和1位R/W)。
3、当从机检测到主机发送的地址与自己的地址相同以后,发送应答信号ACK。
4、主机收到应答信号ACK后释放数据总线,开始接收第一个数据字节。
5、主机收到数据字节后,发送应答信号ACK表示继续传送数据,发送NACK表示数据传送结束。
6、主机完成接收以后,发送停止信号STOP,结束通讯并释放总线。
同步
每个主机必须生成自己的时钟信号,只有当时钟信号电平为低时,数据才能改变。执行总线仲裁必须有同步时钟。当某个主机拉低时钟电平时,时钟会并保持低电平,直到所有主机均将时钟拉至高电平。同样,时钟会处于高电平状态,直到第一个主机将其拉低。这样,通过观察SCL信号,主设备可以同步它们的时钟。
仲裁
对于I2C总线上的正常数据传输过程而言,只允许一个主机进行控制。如果出于某种原因,两个主机同时启动I2C命令,则仲裁过程决定哪个主机获得控制权并且可以继续执行命令。仲裁是通过SDA信号执行的,此时SCL信号处于高电平。每个主机检查总线上的SDA信号是否对应于自己生成的SDA信号。如果总线上的SDA信号应该是高电平但它却处于低电平,那么这个主机就在仲裁过程中失败。仲裁失败的I2C主设备可以产生SCL脉冲直到字节结束,然后必须释放总线并进入从设备模式。仲裁过程可以持续到所有数据传输完毕以后。这意味着在多主机系统中,每个I2C主机必须监控I2C总线并执行相关操作。
I2C总线典型电路
现在的ARM CPU芯片普遍直接支持I2C总线,直接从CPU中将相应管脚引出,即可以外接I2C功能模块或者芯片,然后通过软件进行控制操作。
下图为一个典型的I2C应用扩展(成都英创ETA202 I2C矩阵键盘扩展模块部分电路),使用TCA8418芯片扩展出8x8矩阵键盘。直接将SDA、SCL、键盘中断信号KEY_INT#和复位信号RST#接入芯片,并接上电源和地,即可以控制8x8矩阵键盘。
I2C总线在英创主板平台上的应用
支持I2C接口的芯片都可以直接和英创主板连接,并执行相应的功能。历年来,大量用户使用英创主板进行I2C应用和数据处理,英创也累积了丰富的工程经验。下面整理出了英创网站发表的相关技术文档供用户参考。虽然有一些方案文档中提到的英创主板是较老的型号,用户在新产品开发的时候未必会使用这些老主板产品,但是文中的软硬件使用技巧、编程技巧和方法等技术细节,是值得用户参考或者直接使用的。
使用方法与技巧
英创工业主板EM9160的GPIO应用于I2C通讯嵌入式Linux工控板EM9160的I2C功能及其应用
EM9170工控主板I2C总线使用方法JAVA操作英创主板I2C接口简介
-
Linux
+关注
关注
87文章
11354浏览量
210657 -
嵌入式主板
+关注
关注
7文章
6087浏览量
35672
发布评论请先 登录
相关推荐
评论