IIC总线工作原理

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

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

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

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

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

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

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

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

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

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

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

任一地址写入数据格式

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

任一地址读取数据格式

  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. }

05-11 15:18