【电子基础】IIC总线工作原理

IIC总线工作原理

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

 

起始和终止信号SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。

数据传送格式1)字节传送与应答

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。

 

    AT24C02的芯片地址如下图,1010为固定,A0A1A2正好与芯片的123引角对应,为当前电路中的地址选择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,TX-1B实验板上三根地址线都为0。最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。

 

AT24C02的芯片地址(0xa0为写,0xa1为读)

 

任一地址写入数据格式

 

 

       任一地址读取数据格式




  1. void init()     //初始化

  2. {

  3. SCL=1;

  4.    delay();

  5. SDA=1;

  6.    delay();

  7. }

  8. void start()        //启动信号

  9. {

  10. SDA=1;

  11.    delay();

  12. SCL=1;

  13.    delay();

  14. SDA=0;

  15.    delay();

  16. }

  17. void stop()     //停止信号

  18. {

  19. SDA=0;

  20.    delay();

  21. SCL=1;

  22.    delay();

  23. SDA=1;

  24.    delay();

  25. }

  1. void respons()      //回应信号

  2. {

  3.    uchar i=0;SCL=1;delay();

  4. while((SDA==1)&&(i<255))i++;

  5. SCL=0;delay();}

  6. void writebyte(uchar date)//    写一个字节

  7. {

  8.    uchar i,temp;

  9. temp=date;

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

  11.    {

  12. temptemp=temp<<1;

  13. SCL=0;

  14.        delay();

  15. SDA=CY;

  16.        delay();

  17. SCL=1;

  18.        delay();    

  19.    }

  20. SCL=0;

  21.    delay();

  22. SDA=1;

  23.    delay();

  24. }

  1. uchar readbyte()

  2. //读一个字节

  3. {

  4.    uchar i,j,k;

  5. SCL=0;

  6.    delay();

  7. SDA=1;

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

  9.    {

  10. SCL=1;

  11.        delay();

  12.        if(SDA==1)

  13. j=1;

  14.        else

  15. j=0;

  16. k=(k<<1)|j;

  17. SCL=0;

  18.        delay();

  19.    }

  20.    delay();

  21.    return k;

  22. }

  1. Void write_add(uchar address,

  2. uchar info)

  3. //指定地址写一个字节数据

  4. {

  5.    start();

  6.    writebyte(0xa0);

  7.    respons();

  8.    writebyte(address);

  9.    respons();

  10.    writebyte(info);

  11.    respons();

  12.    stop();

  13. }

  1. uchar read_add(uchar address)

  2. //指定地址读一个字节数据

  3. {

  4.    uchar dd;

  5.    start();

  6.    writebyte(0xa0);

  7.    respons();

  8.    writebyte(address);

  9.    respons();

  10.    start();

  11.    writebyte(0xa1);

  12.    respons();

  13. dd=readbyte();

  14.    stop();

  15.    return dd;

  16. }


原文地址:https://www.cnblogs.com/lcw/p/3159465.html