详解IIC原理

IIC总线概述

  1. IIC是同步通信的一种特殊形式,具有接口少、控制简单、器件封装形式小、通信速率较高等优点;
  2. IIC总线由数据线SDA时钟线SCL两条线构成通信线路,既可以发送数据,也可以接受数据;在CPU与被控制IC之间、IC与IC之间都可进行双向传送,最高传送速率为400kbps;
  3. IIC总线支持多主主从两种工作方式,通常为主从工作方式;在主从工作方式中,主器件启动数据的发送(发送启动信号),产生时钟信号,发出停止信号;
  4. IIC总线进行数据传送时,时钟信号为高电平期间,数据线的数据必须保持稳定,只有在时钟信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

IIC信号

     1.信号时序图

void init()
{
    SCL = 1;
    delay();
    SDA = 1;
    delay();
}

 

    2.起始信号

          主机发出启动信号,启动IIC总线;在SCL为高电平期间。SDA出现下降沿则为启动信号

void start()
{
    SDA = 1;
    delay();
    SCL = 1;
    delay();
    SDA = 0;
    delay();
}

    3.寻址信号

          主机发送启动信号后,再发出寻址信号。器件地址有7位和10位两种,这里介绍7位地址寻址;寻址信号由一个字节构成,高7位位地址位,最低位为方向位,用以表明主机与器件的数据传送方向方向位0表明主机对器件进行写操作;方向位1,表明主机对器件进行读操作。

寻址字节的位定义
76543210
                        从机地址R/W

          主机发送地址时,总线上的每个从机都将这7位地址与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/W为将确定为发送器或接受器;

  4.应答信号

         IIC总线协议规定,每传送一个字节数据(含地址及命令)后,都要有一个应答信号,以确定数据传送是否被对方收到。应答信号由接受设备产生,在SCL信号为高电平期间,接受设备将SDA拉为低电平,表示数据传送正确,产生应答。

void respons()
{
    uchar i = 0;
    SCL = 1;
    delay();
    while((SDA==1)&&(i<255))  //表示若在一段时间内没有收到从器件的应答
                              //则主器件默认从器件已经收到数据而不再等待应答信号
        i++;
    SDA = 0;
    delay();
}

  5.非应答信号

         当主机为接受设备时,主机对最后一个字节不应答,以向发送设备表示数据传送结束

  6.数据传输

       主机发送寻址信号并得到从器件应答后,便可进行数据传输,每次一个字节,但每次传输都应在得到应答信号后再进行下一个字节传送。

写一个字节代码:

void writebyte(uchar date)
{
    uchar i,temp;
    temp = date;
    for(i=0;i<8;i++)
    {                       //串行发送一个字节时,需要把这个字节中的8位一位一位的发出去;
        temp = temp<<1;     //表示将temp左移一位,最高为将移入PSW寄存器的CY位中,然后将CY
                            //赋值给SDA进而在SCL的控制下发送出去
        SCL = 0;
        delay();
        SDA = CY;
        delay();
        SCL = 1;
        delay();
    }
    SCL = 0;
    delay();
    SDA = 1;
    delay();
}

读一个字节代码:

uchar readbyte()
{
    uchar i,k;
    SCL = 0;
    delay();
    SDA = 1;
    for(i=0;i<8;i++)
    {
        SCL = 1;
        delay();
        k = (k<<1)|SDA;     //串行接受一个字节时,需要把这个字节中的8位一位一位的接受;
                            //然后再合成一个字节
        SCL = 0;
        delay();
    }
    delay();
    return k;
}

 

  7.停止信号

      在全部数据传送完毕后,主机发送停止信号,即在SCL为高电平期间,SDA上产生一上升沿信号。

void stop()
{
    SDA = 0;
    delay();
    SCL = 1;
    delay();
    SDA = 1;
    delay();
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值