原创 学习笔记:I2c总线原理及应用(1)

2012-3-28 20:36 1559 12 12 分类: MCU/ 嵌入式

 

  I2c总线支持任何IC生产过程(NMOS\CMOS\双极性)。两线----串行数据线(SDA)和串行时钟线(SCL)在连接到总线的器件间传递信息。每个器件都有唯一的地址识别,而且都可以作为一个发送器或接收器(由器件功能决定)。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。在51单片机应用系统中一般一单片机为主机,其它接口器件为从机。对于不带I2c接口的单片机可用IO口模拟I2c时序。

   I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C总线通过上拉电阻接正电源(一般取10k)。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

1.gif

 

(1)数据的有效性

    SDA线上的数据必须通过在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。

2.gif

 

(2)起始和停止条件

    起始条件:在SCL为高电平时,SDA从高电平向低电平切换

    停止条件:在SCL为高电平时,SDA由低电平向高电平切换

3.gif

 

起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙碌状态。在停止条件的某段时间后总线被认为再次处于空闲状态。

单片机IO口模拟I2C起始与停止条件范例

 

/****************************************************************

函数名称:Start_I2c

函数功能:向I2c总线发出起始信号

入口参数:无

出口参数:

备 注:

*****************************************************************/

void Start_I2c()

{

sda=1;   

_nop_();

scl=1;

_nop_();    

_nop_();

_nop_();

_nop_();

_nop_();    

sda=0;    

_nop_();    

_nop_();

_nop_();

_nop_();

_nop_();       

scl=0;   

_nop_();

_nop_();

}

 

 

/****************************************************************

函数名称:Stop_I2c

函数功能:向I2c总线发出终止信号

入口参数:无

出口参数:

备 注:

*****************************************************************/

void Stop_I2c()

{

sda=0;    

_nop_();  

scl=1;   

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

sda=1;   

_nop_();

_nop_();

_nop_();

_nop_();

}

:模拟I2C总线方式需严格按照规定的时序编写,本例按照I2C标准模式下的操作时序,即传输速率100K。SCL低电平周期需保持4.7us,SDA高电平周期需保持4us,起始条件保持时间4us,停止条件建立时间4us。

 

 

 

 

i2c
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /3 下一条