I2c总线支持任何IC生产过程(NMOS\CMOS\双极性)。两线----串行数据线(SDA)和串行时钟线(SCL)在连接到总线的器件间传递信息。每个器件都有唯一的地址识别,而且都可以作为一个发送器或接收器(由器件功能决定)。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。在51单片机应用系统中一般一单片机为主机,其它接口器件为从机。对于不带I2c接口的单片机可用IO口模拟I2c时序。
I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 I2C总线通过上拉电阻接正电源(一般取10k)。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。
(1)数据的有效性
SDA线上的数据必须通过在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。
(2)起始和停止条件
起始条件:在SCL为高电平时,SDA从高电平向低电平切换
停止条件:在SCL为高电平时,SDA由低电平向高电平切换
起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙碌状态。在停止条件的某段时间后总线被认为再次处于空闲状态。
单片机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。
文章评论(0条评论)
登录后参与讨论