(3)数据传输
发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制。每个字节后必须跟一个响应位(即一帧9位)。首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接受或发送下一个完整的数据字节,可以使时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好接受下一个字节数据并释放时钟线SCL后,数据传输继续。
数据传输必须带响应。相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间,发送释放SDA线(高);在响应的时钟脉冲期间,接受器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。当然必须考虑建立和保持时间。
由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),从机必须将SDA线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。或者产生重复起始条件开始新的传输。
如果从机-接收器对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。
当主机-接收器接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机-发送器释放SDA线,以允许主机产生终止信号。
单片机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_();
}
注:应答与非应答函数用于当主机作为接收器的情况。主机向从机发送数据时,从机会在接受到一个字节后自动发出应答信号。而主机在接收数据后需软件告知其发送应答。
文章评论(0条评论)
登录后参与讨论