打印

【转】解析I2C通信协议

[复制链接]
681|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

一、I2C的概念

1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL


2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。


每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。

二、常用的串行扩展总线

  I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。

三、I2C的六个信号

1. 起始信号

定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。



[plain] view plain copy


  • void iic_start(void)  
  • {  
  •     SDA = 1;  
  •     SCL = 1;  
  •     delay_us(1);  
  •     SDA = 0;  
  •     delay_us(1);  
  •     SCL = 0;  
  • }  

2. 终止信号
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。



[plain] view plain copy


  • void iic_stop(void)  
  • {  
  •     SDA = 0;  
  •     SCL = 1;  
  •     delay_us(1);  
  •     SDA = 1;  
  •     delay_us(1);  
  •     SCL = 0;  
  • }  

3. 写数据信号

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


[plain] view plain copy


  • bit iic_send_byte(unsigned char byte)  
  • {  
  •     unsigned char i;  
  •       
  •     for(i = 0; i < 8; i++)  
  •     {  
  •         SDA = byte & 0x80;  
  •         SCL = 1;  
  •         delay_us(1);  
  •         SCL = 0;  
  •         byte <<= 1;  
  •     }  
  •       
  •     SCL = 1;  
  •     SDA = 1;  
  •     delay_us(1);  
  •     if(0 == SDA)  
  •     {  
  •         ack = 1;  
  •     }  
  •     else  
  •     {  
  •         ack = 0;  
  •     }  
  •       
  •     SCL = 0;  
  •     return ack;  
  • }  

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



[plain] view plain copy


  • unsigned char iic_rcv_byte(void)  
  • {  
  •     unsigned char i;  
  •     unsigned char temp = 0;  
  •     unsigned char a;  
  •       
  •     SDA = 1;  
  •     for(i = 0; i < 8; i++)  
  •     {  
  •         SCL = 0;  
  •         delay_us(1);  
  •         SCL = 1;  
  •         if(SDA)  
  •         {  
  •             a = 0x01;  
  •         }  
  •         else  
  •         {  
  •             a = 0;  
  •         }  
  •          
  •         temp |= (a << (7 - i));  
  •         delay_us(1);  
  •     }  
  •       
  •     SCL = 0;  
  •       
  •     return temp;  
  • }  

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



[plain] view plain copy


  • void iic_ack(void)  
  • {  
  •     SDA = 0;  
  •     SCL = 1;  
  •     delay_us(1);  
  •     SCL = 0;  
  • }  

6. 非应答信号



[plain] view plain copy


  • void iic_noack(void)  
  • {  
  •     SDA = 1;  
  •     SCL = 1;  
  •     delay_us(1);  
  •     SCL = 0;  
  • }  


相关帖子

沙发
l科科1987| | 2016-12-21 20:06 | 只看该作者
这只是软件I2C,硬件I2C比这简单多了,直接配置寄存器就好了。

使用特权

评论回复
板凳
娄敬轩| | 2019-12-17 23:20 | 只看该作者
l科科1987 发表于 2016-12-21 20:06
这只是软件I2C,硬件I2C比这简单多了,直接配置寄存器就好了。

哥,能教我一下硬件I2C吗,我最近测试了好久都不行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

81

帖子

1

粉丝