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

单片机模拟I2C总线通信的几个关键程序

发布时间:2020-06-06 发布时间:
|

I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序: 

1、总线初始化


void main()

{

    SCl=1;

    delay();

    SDA=1;

    delay();

}

//将总线都拉高以释放总线


2、启动信号


void start()

{

    SDA=1;

    delay();

    SCL=1;

    delay();

    SDA=0;

    delay();

}

//SCL在高电平期间,SDA一个下降沿启动信号


3、应答信号


void respons()

{

    uchar i=0;

    SCL=1;

    delay();

    while(SDA==1)&&(i<255))//若在一段时间内没有收到从器件的应答则

        i++;         //主器件默认从器件已经收到数据而不在等待应答信号

    SCL=0;

    delay();

}

//SCL在高电平期间,SDA被从设备拉为低电平表示应答


4、停止信号


void stop()

{

    SDA=0;

    delay();

    SCL=1;

    delay();

    SDA=1;

    delay();

}

//SCL在高电平期间,SDA一个上升沿停止信号


5、写一个字节


void writebyte(uchar date)

{

    uchar i,temp;

    temp=date;

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

    {

        temp=temp<<1;//temp左移一位,最高位将移入PSW寄存器的CY位中

        SCL=0;       //然后将CY赋给SDA进而在SCL的控制下发送出去

        delay();

        SDA=CY;

        delay();

        SCL=1;

        delay();

    }

    SCL=0;

    delay();

    SDA=1;

    delay();

}

//串行发送一个字节时,需要把这个字节中的8位一位一位地发出去


6、读一个字节


uchar readbyte()

{

    uchar i,k;

    SCL=0;

    delay();

    SDA=1;

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

    {

        SCL=1;

        delay();

        k=(k<<1)|SDA;//将k左移一位与SDA进行“或”运算,

        SCL=0;      //依次把8个独立的位放入一个字节中来完成接收

        delay();

    }

    delay();

    return k;

}

同样的,接收一个字节时需将8位一位一位地接收

 

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

热门文章 更多
Semtech的LoRa技术携手Chipsafer将牧场连接至云端