热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iic协议

IIC简介IIC,Inter-IntegratedCircuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。I2C总线物理拓扑结构IIC通信原理: 通过对S

IIC简介

  • IIC,Inter-Integrated Circuit,集成电路总线,需要2根线连接拓扑,是半双工,适用于”字节型”设备。

I2C总线物理拓扑结构

《iic协议》

IIC通信原理:

 通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。

IIC总线特征

     IIC总线上的每一个设II备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,主从设备之间通过这个地址来确定与哪个器件进行通信。通常把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。
     IIC总线上可挂接的设备数量受总线的最大电容400pF限制,如果所挂接的是相同型号的器件,还受器件地址位的限制。
C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
  IIC总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输.

IIC总线协议

a.起始和结束信号

   IIC协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
   起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。

   
                 《iic协议》

b.数据传输

   数据传输以字节为单位。主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。

              《iic协议》

c.地址指定
   IIC总线上的每一个设备都对应一个唯一的地址,主从设备之间的数据传输是建立在地址基础上的。主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和数据传输的过程一样。大多数从设备的地址是7位的,协议规定再给地址添加一个最低位用来表示数据传输的方向,0表示主设备向从设备写数据,1表示主设备向从设备读数据。

                   《iic协议》

 

 

IIC的协议层才是掌握IIC的关键。现在简单概括如下:

a.数据的有效性

在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

b.起始和结束条件

起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,要注意起始和终止信号都是由主机发出的,连接到I2C总线上的器件,若具有I2C总线的硬件接口,则很容易检测到起始和终止信号。

c.应答

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答

 

IIC总线操作

大致可分为以下三种操作情况:

a.主设备往从设备中写数据

   数据传输格式如下:(数据包括从机寄存器地址和需要写入寄存器的数据data)

    《iic协议》

        (1)主机发起开始信号;
   (2)主机发送I2C地址(7位)和写操作0(1位),等待确认;
   (3)从机发送确认;
   (4)主机发送寄存器地址(8位),等待确认;
   (5)从机发送确认;
   (6)主机发送数据(8位),即要向寄存器中写入的数据,等待确认;从机发送确认;
   (7)主机发起停止。
b.主设备从从设备中读数据
   (1)主机发送I2C地址(7位)和写操作0(1位),等待确认;
   (2)从机发送确认;主机发送寄存器地址(8位),等待确认;
   (3)主机发送开始;主机发送I2C地址(7位)和读操作(1位),等待确认;
   (4)从机发送确认;从机发送数据(8位)。
   (5)主机发送确认。
 

c.主设备连续往从设备读写

   主设备往从设备中写数据,然后重启起始条件,紧接着从从设备中读取数据;或者是主设备从从设备中读数据,然后重启起始条件,紧接着主设备往从设备中写数据。这种操作在单个主设备系统中,重复的开启起始条件机制要比用STOP终止传输后又再次开启总线更有效率

     《iic协议》

常用代码

任一地址读取数据格式

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;

}

 

南昌理工学院人工智能学院特种机器人研发中心实验室workshop项目实践平台


推荐阅读
author-avatar
潇洒嘉新
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有