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

2012-3-28 20:38 1497 12 12 分类: MCU/ 嵌入式

 

(3)数据传输

    发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位(即一帧9位)。首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接受或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好接受下一个字节数据并释放时钟线SCL后,数据传输继续。

1.gif


    数据传输必须带响应。相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间,发送释放SDA线(高);在响应的时钟脉冲期间,接受器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。当然必须考虑建立和保持时间。

2.gif

 

    由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),从机必须将SDA线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。或者产生重复起始条件开始新的传输。

    如果从机-接收器对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。

    当主机-接收器接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机-发送器释放SDA线,以允许主机产生终止信号。

3.gif

 

单片机IO口模拟应答与非应答信号范例

 

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

函数名称:Ack_I2c

函数功能:向I2c总线发出应答信号

入口参数:无

出口参数:

备 注:

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

void Ack_I2c()

{

  

sda=0;     

_nop_();

_nop_();

_nop_();      

scl=1;

_nop_();

_nop_();             

_nop_();

_nop_();

_nop_();  

scl=0;               

_nop_();

_nop_();    

}

 

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

函数名称:NoAck_I2c

函数功能:向I2c总线发出非应答信号

入口参数:无

出口参数:

备 注:

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

void NoAck_I2c()

{

  

sda=1;

_nop_();

_nop_();

_nop_();      

scl=1;

_nop_();

_nop_();              

_nop_();

_nop_();

_nop_();  

scl=0;              

_nop_();

_nop_();    

}

:应答与非应答函数用于当主机作为接收器的情况。主机向从机发送数据时,从机会在接受到一个字节后自动发出应答信号。而主机在接收数据后需软件告知其发送应答。

 

 

 

i2c
PARTNER CONTENT

文章评论0条评论)

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