什么是I2C,IIC怎么用,从实例波形分析I2C读写
前言
今天分享的主题是I2C通信。接下来从I2C是什么,怎么用,以及以时钟外设读写作为实例进行分析。
I2C简介
I2C(Inter-Integrated Circuit),也可以叫IIC、I2C,译作集成电路总线,是两线式串行通信总线,用于设备间的通讯等,标准情况下最高传送速率达100Kbps。顾名思义,I2C通讯只需要两根线,一根是数据线SDA(Serial Data Line),一根是时钟线SCL(Serial Clock Line)。主设备控制时钟线决定I2C的波特率,配合数据线进行数据的传输,这两根线分别通过上拉电阻连接到电源。
硬件层面
I2C是多主从架构,每个设备都有唯一的地址,一个主设备理论上可以接127个从设备,设备的SDA并接在一起,SCl并接在一起。
I2C总线内部都是采用漏极开路驱动,示意图如图,栅极给电压时mos导通,输出低电平,栅极给0时mos关断输出呈高阻态,那么这里就无法输出高电平。
加上上拉电阻后可以实现高低电平的输出:开关断开时电阻趋于无穷,电流为0,电源电压为输出电压,即输出高电平;开关闭合,输出低电平。只要有一个设备拉低总线电平,总线的电平就会被拉低,这就是线与功能,便于数据的传输和仲裁。
数据传输
数据传输帧格式
I2C数据的传输也遵循一定的格式。它有开始和停止条件,中间进行8bit的数据传输,没有奇偶校验,并且在一个开始条件和停止条件可之间可以传要多少数据有多少数据。提醒一下,我们的总线默认保持高电平。
开始条件:在时钟线保持高电平时,数据线从高电平转为低电平,即检测到一个下降沿,会形成一个开始条件;
停止条件:时钟保持高电平时,数据线从低电平转为高电平形成一个停止条件。
进行数据传输前也就是紧跟开始条件后,我们要传送地址字节,前7位是从设备地址(这也是为什么一个主机理论上最多能接127个从机,2^7-1),第八位是读/写标志位。每8bit传输完成,第九位是应答位。如果是主设备发送数据,就是从设备应答,如果是主设备读取数据,就是主设备应答。
寄存器
控制寄存器控制开始停止条件,每传输完一个字节会进入内部中断,状态寄存器记录单片机的工作状态。作为主机时,分频器寄存器配合内部时钟设置I2C的波特率;地址寄存器是从机地址编址;最后是数据寄存器。
时钟外设读写
写入与读取格式
参照数据手册,时钟外设的写入格式如图所示,需要两个字节后开始写入。
开始条件之后紧跟地址字节,时钟外设的地址是1101 111,读写位是0,得到外设应答后,发送子地址的首地址,我们可以把时钟内部看作有很多片区,我们要在写数据之前把我们要先找到片区区号,再开始写数据,每传完一个字节数据,区号会自动加一,把下一个数据写入下一个片区,直到主设备停止发送。
主设备要读取数据时,开始条件后紧跟地址字节,得到外设应答后,发送要读片区的区号地址,得到外设应答后,发送重复开始信号,再发送外设地址且第8位为读模式,就可以从选定的片区开始读取数据,外设每传送一个字节,区号会自动加一,传送下一个区号的数据,直到主设备不应答后产生停止条件,停止读取。
注意,如果主机不发送不应答信号就发送停止条件,设备容易挂死,可能原因:外设没有释放总线准备继续传输数据给主设备,将SDA拉为低电平,SDA线上的数据只有当SCL为低时才能改变状态;此时SCL释放为高电平等待SDA的变化,互相等待导致挂死(绿色线为SDA,黄色线为SCL):
实测波形分析
下面是写入的波形,两字节后开始写入数据,前两个字节是地址,第一个是时钟外设地址,第二个是我选择在00处开始写入数据。第一个数据0x19写进外设的00,片区,第二个数据0x09写进外设的01片区。
读取的波形,三字节后开始读取数据,第一个是时钟外设地址,第二个是我选择在00处开始读取数据。一个重复开始信号后发送时钟地址和读标志,第一个数据0x19是时钟发送的00片区数据,第二个数据0x09是时钟发送的01片区数据,接收后主机不应答后产生停止条件,停止读取。
总结
本文主要从整体上介绍了I2C的入门知识,作者能力有限,存在错误和纰漏,请大佬们不吝赐教(抱拳.jpg)。
标签:字节,高电平,读写,地址,IIC,I2C,外设,时钟 From: https://www.cnblogs.com/bujidao1128/p/18289812