热门标签 | 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项目实践平台


推荐阅读
  • Python网络编程:深入探讨TCP粘包问题及解决方案
    本文详细探讨了TCP协议下的粘包现象及其产生的原因,并提供了通过自定义报头解决粘包问题的具体实现方案。同时,对比了TCP与UDP协议在数据传输上的不同特性。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 自动驾驶中的9种传感器融合算法
    来源丨AI修炼之路在自动驾驶汽车中,传感器融合是融合来自多个传感器数据的过程。该步骤在机器人技术中是强制性的,因为它提供了更高的可靠性、冗余性以及最终的 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 对抗电话推销:超级英雄的机器人解决方案
    尽管Roger Anderson看起来并不像是传统的超级英雄,但他通过发明一种能与电话推销员长时间对话的机器人,成为了许多人的英雄。白天,Anderson是一名电话系统的咨询顾问,而夜晚,他则致力于开发技术,以保护公众免受侵扰性电话的骚扰。 ... [详细]
  • 本文详细探讨了编程中的命名空间与作用域概念,包括其定义、类型以及在不同上下文中的应用。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 本文详细探讨了 Android Service 组件中 onStartCommand 方法的四种不同返回值及其应用场景。Service 可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 开发笔记:前端之前端初识
    开发笔记:前端之前端初识 ... [详细]
  • 软硬件结合:未来编程教育的新趋势
    随着人工智能技术的迅猛发展,无人机、智能穿戴设备和智能家居等智能硬件产品逐渐融入我们的日常生活。各行业对科技人才的需求日益增长,不仅要求他们掌握软件编程技术,还必须具备电子和机械等硬件领域的知识。软硬件结合的教育模式正逐渐成为未来的主流。 ... [详细]
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社区 版权所有