单片机 > 单片机程序设计 > 详情

I2C总线学习与EEPROM

发布时间:2024-11-07 发布时间:
|

一。I2C总线简介

I2C总线学习与EEPROM

二。 I2C总线的初步认识

I2C总线学习与EEPROM

三。I2C总线时序

I2C总线学习与EEPROM
I2C通信分为起始信号Start,数据传输部分(可以是多个字节),停止信号Stop

I2C总线数据传输一次为9位,8个数据位和一位应答位ACK。数据从高位到低位传输。

起始信号:SCL 为高电平期间,SDA 由高电平向低电平变化产生一个下降沿,表示起始信号。

数据传输:I2C 通信是高位在前,低位在后。

                 要求当 SCL 在低电平的时候,SDA 允许变化,也就是说,发送方必须先保持 SCL 是低电平,才可以                    改变数据线 SDA。8 位数据位后边跟着的是一位应答位。

停止信号:SCL 为高电平期间,SDA 由低电平向高电平变化产生一个上升沿,表示结束信号。

四。I2C总线的寻址模式

I2C总线学习与EEPROM
7位地址+1位读写

0为写,1为读。

以24C02为例,24C02的地址为:

I2C总线学习与EEPROM

可以看到A2,A1,A0可以编程,因此一条I2C总线上可以挂8个24C02。

接收方收到7位地址+1位读写位后会回应一个应答位ACK,这个ACK是一个低电平。

五。程序详解

void Start_I2C()    //启动信号程序

{

    SDA=1;                  //发送起始条件的数据信号

    delayus(1);

    SCL=1;

    delayus(5);             //起始条件建立时间大于4.7us,延时

   

    SDA=0;                  //发送起始信号

    delayus(5);             // 起始条件锁定时间大于4μs

       

    SCL=0;                  //钳住I2C总线,准备发送或接收数据

    delayus(2);

}

 

void Stop_I2C()        //停止信号程序

{

    SDA=0;                  //发送结束条件的数据信号

    delayus(1);             //发送结束条件的时钟信号

    SCL=1;                  //结束条件建立时间大于4us

    delayus(5);

   

    SDA=1;                  //发送I2C总线结束信号

    delayus(4);

}

void SendByte(uchar c)   //发送一个字节的数据

{

    uchar BitCnt;

   

    for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位

    {

        if((c<

          SDA=1;                          //判断发送位

        else 

          SDA=0;               

          delayus(1);

          SCL=1;                            //置时钟线为高,通知被控器开始接收数据位

          delayus(5);                       //保证时钟高电平周期大于4μs   

          SCL=0;

    }

   

    delayus(2);

    SDA=1;                                  //8位发送完后释放数据线,准备接收应答位

    delayus(2);  

    SCL=1;

    delayus(3);

    if(SDA==1)

        ack=0;    

    else

        ack=1;                              //判断是否接收到应答信号

    SCL=0;

    delayus(2);

}

uchar RcvByte()          //读一个字节的数据

{

   uchar retc;

   uchar BitCnt;

 

   retc=0;

   SDA=1;                           //置数据线为输入方式

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

   {

        delayus(1);  

        SCL=0;                      //置时钟线为低,准备接收数据位

       

        delayus(5);                 //时钟低电平周期大于4.7μs

      

        SCL=1;                      //置时钟线为高使数据线上数据有效

        delayus(3);

        retc=retc<<1;

        if(SDA==1)

            retc=retc+1;            //读数据位,接收的数据位放入retc中

        delayus(2);

   }

   SCL=0;

   delayus(2);

   return(retc);

}

六。EEPROM学习

I2C总线学习与EEPROM

七。EEPROM写数据流程

I2C总线学习与EEPROM

八。EEPROM读数据流程

I2C总线学习与EEPROM


关键字:I2C总线  EEPROM 


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

热门文章 更多
STC89C52RC单片机的NRF24L01无线通信程序.收发一体