单片机:iic总线通信-64体育

×
嵌入式 > 技术百科 > 详情

单片机:iic总线通信

发布时间:2024-08-23 发布时间:
|

一、iic总线通信

1、简介:

 iic 即inter-integrated circuit(集成电路总线),i2c总线是phlips公司推出的一种串行总线, i2c总线只有两根双向信号线。一根是数据线sda,另一根是时钟线scl。

 每个接到i2c总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。

2、常用的串行扩展总线有:

(1)、i2c (inter ic bus)总线
(2)、单总线(1-wire bus)
(3)、spi(serial peripheral interface)总线等。

3、iic总线电路接法

 i2c总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。

        

4、iic总线通信协议

(1)起始和终止信号

 scl线为高电平期间,sda线由高电平向低电平的变化表示起始信号;

 scl线为高电平期间,sda线由低电平向高电平的变化表示终止信号。


(2)应答和非应答

 iic 总线协议规定,每传送一个字节数据后,都要有一个应答信号以确定数据传送是否被对方收到。应答信号由接受设备产生,在scl为高电平期间,接受设备将sda拉低为低电平,表示数据传输正确,产生应答。



(3)数据传送

数据位的有效性规定

 i2c总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。


5、iic通信基本函数

(1)起止信号


i2c_start()

 

 {

 

    sda = 1;   //scl为高电平时,sda 出现一个下跳沿表示i2c总线启动

    scl = 1;

    i2c_delay();

    sda = 0;

    i2c_delay();

 

    scl = 0;  // 启动后将scl点平拉低

    i2c_delay();

 }


(2)终止信号


void i2c_stop()

{

    sda = 0;  //当sc高电平时,sda出现一个上升沿表示i2c总线停止

    scl = 1;

    i2c_delay();

    sda = 1;

    i2c_delay(); 

}

(3)发送数据


void i2c_sendbyte(unsigned char byte)

{

    unsigned char i = 0;   

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

    {

        if(byte & 0x80)    //iic规定下发送高位数据

        {

             sda = 1;  

        }

        else   

             sda = 0;  

        scl = 1;          //在scl为高电平期间写入数据

        i2c_delay();   

        scl = 0;  

        byte <<= 1;

        if (i == 7)

            sda = 1;      //在发送完数据后将sda拉高

        i2c_delay();

    }

}

(4)接收数据


unsigned char i2c_readbyte()

{

    unsigned char i = 0;

    unsigned char value = 0;

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

    {

         value <<= 1;      //先读取高位

         scl = 1;          //scl 为高电平时读取数据

         i2c_delay(); 

         if(sda)

         {

             value ;

         }

         scl = 0;

         i2c_delay();

    }

    return value;

}

(5)发送应答信号


void char i2c_ack()

{

    sda = 0;      //scl为高电平时间sda拉低表示应答

    i2c_delay();

    scl = 1;

    i2c_delay();

    scl = 0;

    i2c_delay();

    sda = 1;

    i2c_delay();

}

(6)发送非应答信号


void i2c_nack()

{

    sda = 1;    //scl高电平期间sda拉高表示非应答

    i2c_delay();

    scl  = 1;

    i2c_delay();

    scl = 0;

    i2c_delay();

}


(7)等待应答


unsigned  char i2c_waitack()

{

    unsigned char ret;

    sda = 1;      

    i2c_delay();

    scl = 1;       //把scl拉高读取sda的点平高低,低电平表示应答

    i2c_delay();

    if(sda == 1)

    {

        ret = 1;

    }

    else

        ret = 0;

    scl = 0;

    i2c_delay();

    return ret;

}

(8)检查iic设备总线


unsigned char i2c_checkdevice(unsigned char _address)

{

    unsigned char ucack;

    if (sda == 1 &&  scl == 1)

    {

        i2c_start();

        i2c_sendbyte(_address|i2c_wr); //发送地址

        ucack = i2c_waitack();         //等待接收应答    

        i2c_stop();                    //停止信号

        return ucack;                  

    }

    return 1;

}




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

热门文章 更多
鼠标控制芯片mouse warrior及其应用
网站地图