IIC 通讯协议

      IIC总线:
      一般串行数据通讯都有时钟和数据之分,有异步和同步之别。有单线,双线和三线等.

      I2C肯定是2线的(不算地线).

      I2C协议确实很科学,比3/4线的SPI要好,当然线多通讯速率相对就快了.

      I2C的原则是:

            在SCL=1(高电平)时,SDA千万别忽悠!!!否则,SDA下跳则"判罚"为"起始信号S",SDA上跳则"判罚"为"停止信号P".

在SCL=0(低电平)时,SDA随便忽悠!!!(可别忽悠过火到SCL跳高),每个字节后应该由对方回送一个应答信号ACK做为

对方在线的标志。非应答信号一般在所有字节的最后一个字节后.一般要由双方协议签定.SCL必须由主机发送,否则天

下大乱.首字节是"片选信号",即7位从机地址加1位方向(读写)控制.从机收到(听到)自己的地址才能发送应答信号(必须应

答!!!)表示自己在线.其他地址的从机不允许忽悠!!!(当然群呼可以忽悠但只能听不许说话)读写是站在主机的立场上定义

的."读"是主机接收从机数据,"写"是主机发送数据给从机.重复位主要用于主机从发送模式到接收模式的转换"信号",由于

只有2线,所以收发转换肯定要比SPI复杂,因为SPI可用不同的边沿来收发数据,而I2C不行。

           在硬件I2C模块,特别是MCU/ARM/DSP等每个阶段都会得到一个准确的状态码,根据这个状态码可以很容易知道

现在在什么状态和什么出错信息.7位I2C总线可以挂接127个不同地址的I2C设备,0号"设备"作为群呼地址.10位I2C总线

可以挂接更多的10位I2C设备.总之,只要掌握I2C的忽悠记,一般很容易掌控...  第一个字节(为slave address)由7位地址

和一位R/W读写位组成的,这字节是个器件地址。


          首先,你要知道:常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位。
如格式如下: 

          D7 D6 D5 D4 D3 D2 D1 D0
         1-器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。

         2-用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3

个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。所以为什么同一IIC总线上同一型号的IC只

能最多共挂8片同种类芯片的原因了。

        3-最低一位就是R/W位。这位不用我多说了。

        在现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了提供硬件的效率和简化电路的设

计,PHILIPS开发了一种用于内部IC控制的简单的双向两线串行总线I2C。I2C总线支持任何一种IC制造工艺,并且

PHILIPS和其他厂商提供了种类非常丰富的I2C兼容芯片。作为一个专利的控制总线,I2C已经成为世界性的工业标

准。

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

 

图片一

               

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

数据传送格式

      (1)字节传送与应答

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应

答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。

     AT24C02的芯片地址如下图,1010为固定,A0,A1,A2正好与芯片的1,2,3引角对应,为当前电路中的地址选

择线,三根线可选择8个芯片同时连接在电路中,当要与哪个芯片通信时传送相应的地址即可与该芯片建立连接,TX-

1B实验板上三根地址线都为0。最后一位R/W为告诉从机下一字节数据是要读还是写,0为写入,1为读出。

 

 

 


           任一地址读取数据格式:

void init()              //初始化
{
       SCL=1;
       delay();
       SDA=1;
       delay();
}

void start()         //启动信号
{
       SDA=1;
       delay();
       SCL=1;
       delay();
       SDA=0;
       delay();
}

void stop()            //停止信号
{
       SDA=0;
       delay();
       SCL=1;
       delay();
       SDA=1;
       delay();
}
 
void respons()             //回应信号
{
       uchar i=0;SCL=1;delay();
while((SDA==1)&&(i<255))
i++;
       SCL=0;
delay();
}

void writebyte(uchar date)//       写一个字节
{
       uchar i,temp;
       temp=date;
       for(i=0;i<8;i++)
       {
              temp=temp<<1;
              SCL=0;
              delay();
              SDA=CY;
              delay();
              SCL=1;
              delay();  
       }
       SCL=0;
       delay();
       SDA=1;
       delay();
}


      任一地址写入数据格式:

uchar readbyte()
//读一个字节
{
       uchar i,j,k;
       SCL=0;
       delay();
       SDA=1;
       for(i=0;i<8;i++)
       {
              SCL=1;
              delay();
              if(SDA==1)
                j=1;
              else
                j=0;
              k=(k<<1)|j;
              SCL=0;
              delay();
       }
       delay();
       return k;
}

Void write_add(uchar address,
uchar info)
//指定地址写一个字节数据
{
       start();
       writebyte(0xa0);
       respons();
       writebyte(address);
       respons();
       writebyte(info);
       respons();
       stop();
}

uchar read_add(uchar address)
//指定地址读一个字节数据
{
       uchar dd;
       start();
       writebyte(0xa0);
       respons();
       writebyte(address);
       respons();
       start();
       writebyte(0xa1);
       respons();
       dd=readbyte();
       stop();
       return dd;
}

 

参考:http://blog.csdn.net/zmq5411/article/details/6085740


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值