IIC总线协议.docx
《IIC总线协议.docx》由会员分享,可在线阅读,更多相关《IIC总线协议.docx(15页珍藏版)》请在冰豆网上搜索。
![IIC总线协议.docx](https://file1.bdocx.com/fileroot1/2023-1/4/e33bf460-0053-4014-a095-89cf6ecb0220/e33bf460-0053-4014-a095-89cf6ecb02201.gif)
IIC总线协议
iic总线协议
I2C协议是单片机与其它芯片常用的通讯协议,由于只需要两根线,所以很好使用。
1.I2C总线的特点
(1)只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL
(2) 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址;主机可以作为主发送器或主机接收器
(3)它是一个真正的多主机总线,如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
(4)串行的8位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达400kbit/s高速模式下可达.4Mbit/s
(5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
(6) 连接到相同总线的IC数量只受到总线的最大电容400pF限制
I2C协议总线信号时序分析
1.数据的有效性:
SDA线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。
如图3.1I2C总线的位传输所示。
图1.I2C总线的位传输
2.起始和停止条件
当SCL线是高电平时,SDA线从高电平向低电平切换,这个情况表示起始条件。
当SCL线是高电平时,SDA线由低电平向高电平切换表示停止条件。
如图3.2I2C起始和停止条件所示。
图3.2起始和停止条件
3. 总线空闲状态
SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高;
4.数据传输与应答信号ACK
发送到SDA线上的数据必须是8位的。
每次传输可以发送的数据不受限制。
每个字节后必须在时钟的第9个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。
如图3.3I2C总线响应。
图3.3I2C总线响应
首先传输的是数据的最高位(MSB)。
如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL保持低电平迫使主机进入等待状态。
当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
如图3.4I2C总线数据传输所示。
图3.4I2C总线数据传输
4.地址格式
数据的传输遵循如图4.1完整的数据传送所示,在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/—W),0-表示发送数据(写),1-表示接收数据(读)。
数据传输一般由主机产生的停止位(P)终止。
但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。
在这种传输中,可能有不同的读/写格式结合。
如图3.5I2C总线完整的数据传输。
图3.5I2C总线完整的数据传输
C程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitSDA=P2^4;
sbitSCL=P2^5;
ucharNackFlag;
//***********************************************************
voiddelay() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//************************************************************
voidstartIIC() //启动IIC总线
{
SDA=1;
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
}
//*************************************************************
voidstopIIC() //停止IIC总线
{
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
}
//*************************************************************
voidAck_IIC() //主器件为发送方,主控器发送完数据后,主控器件等待从器件的应答
{
ucharerrtime=200;
SDA=1;
SCL=1;
NackFlag=0;
while(SDA)
{
errtime--;
if(errtime==0)
{
stopIIC();
NackFlag=1;
return;
}
}
SCL=0;
}
//*************************************************************
voidsendIIC(ucharnum)//主控器件发送数据到IIC总线
{
uchari;
for(i=0;i<8;i++)
{
SCL=0;
delay();
SDA=num&0x80;
SCL=1;
delay();
num<<=1;
delay();
}
SCL=0;
}
//*************************************************************
ucharreceiveIIC(void) //主控器件接收IIC总线传来的数据
{
uchari,datax=0;
SDA=1;
for(i=0;i<8;i++)
{
datax<<=1;
SCL=0;
delay();
SCL=1;
delay();
datax|=SDA;
}
SCL=0;
returndatax;
}
//************************************************************
voidsendAckIIC(void)//主器件为接收方,从器件发送完数据后,从器件等待主器件的应答信号
{
SDA=0;
delay();
SCL=1;
delay();
SCL=0;
}
下一贴>>
IIC总线协议,AT24C08储存器
IIC总线(InterIntegratedCircuitBus):
是Philips公司推出的串行总线标准(为二线制)。
总线上扩展的外围器件及外设接口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能多主机总线。
I2C总线工作原理
串行数据线SDA和串行时钟线SCL构成的,可发送和接收数据。
⏹所有挂接在I2C总线上的器件和接口电路都应具有I2C总线接口,且所有的SDA/SCL同名端相连。
总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选线。
⏹特点:
组成系统结构简单,占用空间小,芯片管脚的数量少,无需片选信号,价格低。
允许若干兼容器件共享总线,应用比较广泛。
总线的长度可达7.6m,传送速度可达400kbps,标准速率为100kbps。
支持多个组件。
支持多主控器件(某时刻只能有一个主控器件)。
I2C总线上所有设备的SDA,SCL引脚必须外接上拉电阻。
典型的I2C总线系统结构,如图所示
I2C总线器件的寻址方式
由于所有器件都通过SCL和SDA连接在I2C总线上,因此,主器件在进行数据传输前需要通过寻址,选择需要通信的从器件。
I2C总线上所有外围器件都需要有唯一的7位地址,由器件地址和引脚地址两部分组成。
器件地址是I2C器件固有的地址编码,器件出厂时就已经给定,不可更改。
引脚地址是由I2C总线外围器件的地址引脚(A2,A1,A0)决定,根据其在电路中接电源正极、接地或悬空的不同,形成不同的地址代码。
I2C总线概述
• I2C总线采用两线制,由数据线SDA和时钟线SCL构成。
I2C总线对数据通信时序进行了严格的定义。
I2C总线数据操作
在I2C总线上,数据是伴随着时钟脉冲,一位一位地传送的,数据位由高到低传送,每位数据占一个时钟脉冲。
I2C总线上的在时钟线SCL高电平期间,数据线SDA的状态就表示要传送的数据,高电平为数据1,低电平为数据0。
在数据传送时,SDA上数据的改变在时钟线为低电平时完成,而SCL为高电平时,SDA必须保持稳定,否则SDA上的变化会被当作起始或终止信号而致使数据传输停止。
I2C总线在传送数据过程中共有三种类型信号:
开始信号、停止信号和应答信号。
开始信号:
SCL保持高电平的状态下,SDA出现下降沿。
出现开始信号以后,总线被认为“忙”。
停止信号:
SCL保持高电平的状态下,SDA出现上升沿。
停止信号过后,总线被认为“空闲”。
应答信号:
接收数据的器件在接收到8位数据后,向发送数据的器件发出特定的低电平脉冲,表示已收到数据。
总线空闲:
SCL和SDA都保持高电平。
总线忙:
在数据传送开始以后,SCL为高电平的时候,SDA的数据必须保持稳定,只有当SCL为低电平的时候才允许SDA上的数据改变。
∙I2C协议起始信号时序
起始信号用于开始I2C总线通信。
其中,起始信号是在时钟线SCL为高电平
期间,数据SDA上高电平向低电平变化的下降沿信号。
起始信号出现以后,
才可以进行后续的I2C总线寻址或数据传输等
∙I2C协议终止信号时序
终止信号用于终止I2C总线通信。
其中,终止信号是在时钟线SCL为高电平期间,数据线SDA上低电平到高电平变化的上升沿信号。
终止信号一出现,所有I2C总线操作都结束,并释放总线控制权。
终止信号的时序如下:
∙I2C协议应答信号时序
应答信号用于表明I2C总线数据传输的结束。
I2C总线数据传送时,一个字节数据传送完毕后都必须由主器件产生应答信号。
主器件在第9个时钟位上释放数据总线SDA,使其处于高电平状态,此时从器件输出低电平拉低数据总线SDA为应答信号。
应答信号的时序,如图所示。
I2C总线的传送格式
I2C总线的传送格式为主从式,对系统中的某一器件来说有四种工作方式:
主发送方式、从发送方式、主接收方式、从接收方式。
只讲主发送从接收(单片机发送24C08接收)主器件产生开始信号以后,发送的第一个字节为控制字节。
前七位为从器件的地址片选信号。
最低位为数据传送方向位(高电平表示读从器件,低电平表示写从器件),然后发送一个选择从器件片内地址的字节,来决定开始读写数据的起始地址。
接着再发送数据字节,可以是单字节数据,也可以是一组数据,由主器件来决定。
从器件每接收到一个字节以后,都要返回一个应答信号(ASK=0)。
主器件在应答时钟周期高电平期间释放SDA线,转由从器件控制,从器件在这个时钟周期的高电平期间必须拉低SDA线,并使之为稳定的低电平,作为有效的应答信号。
∙控制字节
在起始条件之后,必须是器件的控制字节,其中,高四位为器件类型识别符(不同的芯片类型有不同的定义,E2PROM为1010),接着三位为片选,最低位为读写控制位,为“1”时为读操作,为“0”时为写操作。
如下图所示。
∙写操作
写操作分为字节写和页面写两种操作,对于页面写,根据芯片的一次装载的字节不同有所不同。
页面写的地址、应答和数据传送的时序如下图所示。
∙读操作
读操作有三种基本操作:
当前地址读、随机读和顺序读。
下图给出的是顺序读的时序图。
应当注意的是,为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平,然后发出停止条件。
C语言的相关程序
为了您的安全,请只打开来源可靠的网址
打开网站 取消
窗体底端