×
接口总线驱动 > 总线 > 详情

I2C总线注意要点

发布时间:2020-05-27 发布时间:
|
1、只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL。


 

2、每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器。

3、在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变。


 

4、SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件。

5、SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。


 

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

 


7、第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的方向。第一个字节的最低位是“0”,表示主机会写信息到被选中的从机;“1”表示主机会向从机读信息,当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定的。

void I2C_delay(void) 

u8 i=200;  

while(i)  

 

 i--;  

 

 

void I2C_Start(void) 

SDA_H;           

I2C_delay();

SCL_H;     //SCL 线是高电平时,SDA 线从高电平向低电平切换,总线开始        

I2C_delay();

SDA_L;             

I2C_delay();

SCL_L;            

I2C_delay();

}

 

void I2C_Stop(void) 

 

SDA_L; 

I2C_delay(); 

SCL_H;   //SCL 线是高电平时,SDA 线由低电平向高电平切换,总线结束。

I2C_delay(); 

SDA_H; 

I2C_delay(); 

//等待ACK应答

void WaitACK1(void) 

u8 errtime 225; 

 

SDA_IN();    //设置SDA端口为输入模式

I2C_delay(); 

SCL_H; 

I2C_delay(); 

while(SDA_read)  //SCL拉高后,等待SDA被拉低(ACK)  

{

errtime--;

if(errtime==0)

{

    I2C_Stop();

    SDA_OUT();

    break;

}

}

SCL_L;

SDA_OUT();

I2C_delay(); 

}

//写入单字节数据

void Writebyte(unsigned char Data)

  

    unsigned char i;

    for(i=0;i<8;i++)

    {

if((Data<

{

SDA_H;

}

else 

{

SDA_L;

}

I2C_delay();

SCL_H; 

I2C_delay(); 

SCL_L;

    }

SDA_L;

I2C_delay();

    WaitACK1();

I2C_delay();


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
串口通信属性及事件解析