简单的IC协议理解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
简单的I2C协议理解
I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
是微电子通信控制领域广泛采用的一种总线标准。
它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。
I2C 总线支持任何IC 生产过程(CMOS、双极性)。
通过串行数据(SDA)线和串行时钟(SCL)线在连接到总线的器件间传递信息。
每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。
LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。
除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。
主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。
此时,任何被寻址的器件都被认为是从机。
一. 技术性能:
工作速率有100K和400K两种;
支持多机通讯;
支持多主控模块,但同一时刻只允许有一个主控;
由数据线SDA和时钟SCL构成的串行总线;
每个电路和模块都有唯一的地址;
每个器件可以使用独立电源
i2C接口的SCL和SDA均为漏极开路,需要加上拉电阻,不同器件的供电电压可以不同,如3.3V和5V,但是低电压供电的芯片相应引脚需要5V耐受。
漏极开路输出和集电极开路一样,顾名思义,开漏电路就是指从MOSFET的漏极输出的电路。
典型的用法是在漏极外部的电路添加上拉电阻到电源如图所示。
完整的开漏电路应由开漏器件和开漏上拉电阻组成。
这里的上拉电阻R的阻值决定了逻辑电平转换的上升/下降
沿的速度。
阻值越大,速度越低,功耗越小。
因此在选择上拉电阻时要兼顾功耗和速度。
标准的开漏脚一般只有输出的能力。
添加其它的判断电路,才能具备双向输入、输出的能力。
很多单片机等器件的I/O就是漏极开路形式,或者可以配置成漏极开路输出形式,如51单片机的P0口就为漏极开路输出。
在实际应用中可以将多个开漏输出的引脚连接到一条线上,这样就形成“线与逻辑”关系。
注意这个公共点必须接一个上拉电阻。
当这些引脚的任一路变为逻辑0后,开漏线上的逻辑就为0了。
在I2C等接口总线中就用此法判断总线占用状态。
同集电极开路一样,利用外部电路的驱动能力,减少IC内部的驱动。
当IC内部MOSFET 导通时,驱动电流是从外部的VCC流经上拉电阻,再经MOSFET到GND。
IC内部仅需很下的栅极驱动电流,因此漏极开路也常用于驱动电路中。
I2C 总线术语的定义
二. 基本工作原理:
a)以启动信号START来掌管总线,以停止信号STOP来释放总线;
b)每次通讯以START开始,以STOP结束;
c)启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,一位
为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主
控向被控器件读数据;
d)当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信
号;
e)每个数据字节在传送时都是高位(MSB)(Most Significant Bit)在前;
三. 写通讯过程:
1. 主控在检测到总线空闲的状况下,首先发送一个START信号掌管总线;
2. 发送一个地址字节(包括7位地址码和一位R/W);
3. 当被控器件检测到主控发送的地址与自己的地址相同时发送一个应答信号(ACK)(Acknowledgement即确认
字符);
4. 主控收到ACK后开始发送第一个数据字节;
5. 被控器收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束;
6. 主控发送完全部数据后,发送一个停止位STOP,结束整个通讯并且释放总线;
四. 读通讯过程:
五. 总线信号时序分析
1. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
I2C位传输数据有效性
2. 启动信号START
时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。
启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;
3. 停止信号STOP
时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号。
起始和停止条件
4. 数据传送
SCL线呈现高电平期间,SDA线上的电平必须保持稳定,低电平表示0(此时的线电压为地电压),高电平表示1(此时的电压由元器件的VDD决定)。
只有在SCL线为低电平期间,SDA上的电平允许变化。
I2C总线数据传输和应答
5. 应答信号ACK
I2C总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在时钟的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
6. 无应答信号NACK
在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途:
a. 一般表示接收器未成功接收数据字节;
b. 当接收器是主控器时,它收到最后一个字节后,应发送一个NACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。
六. 寻址约定
地址的分配方法有两种:
1. 含CPU的智能器件,地址由软件初始化时定义,但不能与其它的器件有冲突;
2. 不含CPU的非智能器件,由厂家在器件内部固化,不可改变。
高7位为地址码,其分为两部分:
1. 高4位属于固定地址不可改变,由厂家固化的统一地址;
2. 低三位为引脚设定地址,可以由外部引脚来设定(并非所有器件都可以设定);
普通的和带重复开始条件的7位地址格式
I2C总线10位地址格式
七. 实例:用示波器对单片机I2C时序进行图形波形分析的试验
在示波器上区分SCL和SDA波形,双通道的示波器看,SCL是周期信号即稳定整齐的脉冲,SDA只有在传送数据时才会有波形出现,否则会保持高电平。
I2C的概念原理网上都有就不说了,这里只把我把两个开发板通过I2C通讯的调试经验记录分享一下。
I2C要求要有一个主设备,负责发起请求和控制时钟;其它为从设备,通过设备ID地址来识别并响应主设备请求。
主从设备要轮流控制SDA。
一开始我没搞明白这一点,直接加了写I2C数据代码,然后用示波器在SDA和SCL脚测量,却只能找到些凌乱的波形,没有预期的效果。
后来把从设备接上,两边写好代码,互相有了响应,这才在示波器上看到波形。
这里我找了一个主设备往从设备写数据的例子,代码如下:
char buf[128];
int len;
strcpy(buf,"..huz_hello_i2c/n");
len=strlen(buf);
//deviceid: 0x3c
write_i2c(0x3c, buf , len);
接收端的代码比较简单,就不贴了。
将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:
从图中可知时序如下:
1.由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
2.接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
3.接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
4.接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
5.还有其它数据和最后的停止位,图中被截掉了。
另外,对于读从设备内容,基本流程是主设备先往从设备写一个命令,然后再输出读取命令,然后才由从设备发送数据。
过程类似,不再具体分析了。
下图示例中,主机先向从机写了一个地址命令,然后重新开始并进入读取周期。
分析波形可检测出I2C通信工作是否正常,是否符合预期,对我们编程调试诊断有辅助作用。
. .。