一、先决知识

            (1)模电基础知识(用以理解IIC如何通信)

二、IIC概览

              I2C是80年代飞利浦(Philips->NXP->高通)研发的双线串行总线。目前,I2C广泛应用与单微处理器,EEPROM,数模转换,压力传感器等芯片的接口。

三、IIC结构,协议和时序

1、总线结构

            
            由图中可知
               SDA:data line (数据传输线) 
               SCL:clock line (时钟线)
            (1)IIC采用了双线总线
           (2)由1,2箭头指示可知 IIC器件内部采用了开漏的方法,总线被上拉,即总线状态只能是被下拉为0(当MOS管输入0的时候)
            (3)只要有一方下拉了总线,总线状态必定为0

2、IIC协议

(1)模式

标准IIC 速度
Standard-mode (Sm)普通模式  100 kbit/s
Fast-mode (Fm)快速模式
400 kbit/s
High-speed mode (Hs-mode)高速模式
3.4 Mbit/s
变种IIC
Fast-mode Plus (Fm+)快速+模式
1 Mbit/s
Low-speed mode(Ls-mode)低速模式

10kb/s

(2)具体通信时序

                ①IIC协议上不区分主从设备,谁发起谁是主设备
                ②IIC通信时序的组成元素
            
               易见:IIC时序主由以上四个元素组成
            如何理解这四个时序?
            由于IIC只有两根线,其中一根被用于时钟信号(SCL),且如我们一般所知的,CLK在高电平时传输的是数据是稳定的,那么就传输的内容可以分为两种情况:在CLK高时不变的是数据位,在CLK高时跳变的是控制位。并且跳变有两个方向:1-0和0-1(又知SDA总线闲事是1,且只有下拉操作)故1-0是开始信号,0-1是结束信号(释放总线信号)
           由于,SDA传输完一个bit之后,主机会释放SDA线(最后一位是0时即取消下拉或者最后一位本来就是1),这时SDA处于高电平的状态,从机就可以控制SDA线了,若从机下拉了SDA线并且主机从SDA读到了这一个低电平,则表示从机发送了一个确认信号(0)。若从机不对SDA下拉,则主机读到SDA依然位高电平,故表示一个非应答信号(1)。
        
            ③如何发起通信
            
         流程如上图,可以总结位:设备发出开始信号(当总线没有被占用时)通知其他设备总线被‘我’占用了我要开始操作了,成为主机-->主机占用SDA发出地址和读/写操作-->主设备放SDA-->地址对应的设备占用SDA,发出回应(其他设备忽略,并且记下总线被占用了)-->主设备收到回复重新占用SDA发送数据-->主设备释放SDA等待回应-->从设备占用SDA发出ack信号-->主设备发出停止信号,告知从设备和其他设备通信结束,总线被释放 。
            ④常见读写时序
                Ⅰ:单字节写(如上图)(数据只能在SCLK为低的时候变换,高的时候要保持稳定)

⑤关于IIC设备地址问题

               Ⅰ:通常 设备地址的高7位为地址,最低位  读写操作位 0位读 1为写
              Ⅱ:设备地址数的问题:理论上7位由128位地址,然而除去保留几个保留地址如广播地址0x00等,数量少于128个,且标准协议里遇见了地址的局限性,扩充了10位地址的概念(此处不进行论述)
            Ⅲ:对于IIC可以挂多少个设备的问题:对于同一个地址的设备来说,在不进行地址扩充(片选)的情况下只能挂一个,对于不同的设备来说,标准协议里面没由限制具体的个数的多少,这个由线路布线情况,软件情况以及工作模式确定。对于标准模式,只要总线上的负载电容不超过400pf,不超过芯片的负载能力既可以。

四、如何模拟IIC通信协议

(1)由上可见,我们只要模拟4个1位的基本信号+2个8位传输信号就可以完成所有的模式。

具体要实现的函数

Ⅰ:I2C_START()  //开始信号

Ⅱ:I2C_STOP()    //结束信号

III: I2C_ACK()        //发送响应信号

Ⅳ:I2C_NACK()    //发送非响应信号

Ⅵ:I2C_SEND(unsinged char data) //数据发送信号

Ⅶ:I2C_READ(unsigned char * data)//数据读取信号

显现时需要注意的细节:结束后总是释放SDA,即输出1。时序的延时问题要小心,参看具体器件的datasheet。

            


嵌入式常用技术概览之IIC(I2C)的更多相关文章

  1. 嵌入式常用技术概览之SPI

    一.先决知识             (1)理解并知道移位寄存器如何工作 二.SPI概述             SPI(serial Peripheral Interface 串行片上(外围)设备接 ...

  2. Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)

    完整的开发一个android移动App需要经过从分解需求.架构设计到开发调试.测试.上线发布等多个阶段,在发布后还会有产品功能上的迭代演进,此外还会面对性能.安全.无线网络质量等多方面的问题. 移动A ...

  3. 【转】Intel RealSense(实感技术)概览

    Intel RealSense(实感技术)概览 1 Reply 版权声明:本文系本站作者自己翻译整理,欢迎转载,但转载请以超链接形式注明文章来源(planckscale.info).作者信息和本声明, ...

  4. 必知干货:Web前端应用十种常用技术你全都知道吗?

    Web前端应用十种常用技术,随着JS与XHTML的应用普及,越来越多的web界面应用技术出现在网站上,比如我们常见的日历控件,搜索下拉框等,这些web界面应用技术大大的丰富了网站的表现形式,本文将为您 ...

  5. Windows Phone 8.1 开发技术概览 (Universal APP)

    前一阵真的比较懒 WP8.1 已经出来这么长时间了现在才更新BLOG让大家久等了,今天我先为大家介绍下 WP 8.1的开发框架,什么是微软所推崇的 Universal APP,以及我们要开发 Univ ...

  6. React.js 常用技术要点

    最近在公司的一个移动端WEB产品中使用了React这个框架(并不是React-Native),记录一下在开发过程中遇到的各种问题以及对应的解决方法,希望能对读者有所帮助. React原则 React不 ...

  7. BizTalk 开发系列(三十九) BizTalk Server 2009技术概览

    BizTalk Server 2009已经发布一段时间了,之前Beta版发布的时候也写过一篇文章<BizTalk Server 2009 Beta初体验>, 当时比较了2006 R2与20 ...

  8. Java SE技术概览 - Jave SE Platform at a Glance

    从学习到工作,使用Java有几年时间,一直没有好好端详一下她的“内涵”.无意中看到一个关于Java SE的概览图,发现Java中提供的API还挺系统全面,把她放到博客中,相信对于想系统了解Java技术 ...

  9. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

随机推荐

  1. 【PMP】项目生命周期和开发生命周期

    一.定义 项目生命周期:指项目从启动到完成所经历的一系列阶段. 开发生命周期:项目生命周期内通常有一个或多个阶段与产品.服务或成果的开发相关,这些阶段称为开发生命周期. 二.生命周期 预测型生命周期( ...

  2. iOS实现图片裁剪功能,基于TKImageView完善与讲解

    1.功能需求:需要实现图片区域裁剪功能. 2.效果图:     3.实现原理:本来想自己实现的,刚好看到一个比较好的库:TKImageView,下载好研究了下,发现基本都能满足我的需求,而且封装的也比 ...

  3. MATLAB 画柱状图(/直方图)修改横坐标名称并使其横着显示

    使用MATLAB 画柱状图 ,即bar (x,y),其横坐标是默认 1.2.3.4.……的 % --v1 y1=[asum1,asum2,asum3,asum4,asum5,asum6,asum7,a ...

  4. go-ehtereum编译:

    git clone https://github.com/ethereum/go-ethereum.git cd go-ethereum && git checkout make ge ...

  5. SQL DDL 数据定义语句

    前言 DDL(Data Definition Language)语句:数据定义语句,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象.常用的语句关键字主要包括 create.drop.al ...

  6. c#异常重试机制

    有时候我们碰到程序异常了,想让程序继续重新执行,进行重试,这时候就需要有一个合适的方法来进行操作: 自己写代码控制太麻烦了,也容易出错.这时候当然是站在巨人的肩膀上, https://github.c ...

  7. Atitit 数据库排除某一列 字段 显示

    Atitit  数据库排除某一列 字段  显示 GROUP_CONCAT  行列转换 mysql利用group_concat()合并多行数据到一行_Mysql_脚本之家 sELECT GROUP_CO ...

  8. ubuntu 18.04 配置 rc.local

    ubuntu 18.04 配置 rc.local:https://blog.csdn.net/a912952381/article/details/81205095 Ubuntu /etc/rc.lo ...

  9. vim粘贴和保存

  10. gsoap使用总结

    WebService.soap.gsoap基本概念 WebService服务基本概念:就是一个应用程序,它向外界暴露出一个可以通过web进行调用的API,是分布式的服务组件.本质上就是要以标准的形式实 ...