简介

IIC的全称是Inter-Integrated Circuit,串行总线的缩写,由duPhilips公司推出,是近年来在微电子通信控制制领域广泛采用的一种新型总线标准。具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。它是同步通信的一种特殊形式,仅需两根线(SLC、SDA)即可完成信息传输,并且通信速率较高。在主从通信中,可以有多个IIC设备同时接到IIC总线上,通过地址来识别通信对象。

I2C总线时序详解

1.1 总线数据有效性
  I2C总线是单工,因此同一时刻数据只有一个流向,因此采样有效时钟也是单一的,是在SCL时钟的高电平采样数据。
  I2C总线上SDA数据在SCL时钟低电平是可以发生变化,但是在时钟高电平时必须稳定,以便主从设备根据时钟采样数据,如下图:

1.2 总线空闲条件
SDA、SCL都是高电平
IIC总线的两根线必须上拉,要么CPU内部上拉,要么外置上拉电阻上拉!一般而言,CPU通过两种方式连接IIC总线,分别为:
1)通过CPU引出的普通IO引脚连接IIC总线,如C51单片机的IO引脚,通过IO模拟IIC时序完成信息传输,这种方法称为软件IIC。日常所接触到的CPU均可实现这种传输方式,当然前提是时序无误。
2)通过IIC控制器来连接IIC总线,如STM32单片机中的IIC控制器连接IIC设备,CPU设置好IIC控制器后,便只要将数据放入发送寄存器即可,这种方法称为硬件IIC。目前大多数CPU都内部集成了IIC控制器(可能好几个),因此这种方式是最常遇到的。
  1.3 总线数据传输起始和结束条件
开始位:时钟线SCL高电平,SDA由高变低;
停止位:时钟线SCL高电平,SDA由低变高;

1.4 总线数据传输顺序以及ACK应答
I2C总线上数据传输室MSB在前,LSB在后,从示波器上看,从左向右依次读出数据即可。
SCL是单向的只能主机控制,SDA是双向的,主、从机都能控制
ACK应答:
在第9个时钟的低电平期间,主机将SDA拉高后释放SDA总线并拉低SCL总线,从机需要在SCL拉低的短暂时间内将SDA总线拉低并保持住,主机在一个确定的时间后再次拉高SCL去读取SDA线的状态,若为低电平,则认为收到了从机的响应,即为ACK信号,此时主机会拉低SCL,以此告诉从机释放SDA。
无ACK应答:
在第9个时钟的低电平期间,主机将SDA拉低,即告诉从机无ACK应答。
ACK应答完成后,主机可以直接进入下一个字节的发送循环阶段,也可以发送一个stop信号,使总线处于空闲状态,具体如下:
首先此时SCL处于低电平状态时拉低SDA,然后再拉高SCL,然后在SCL为高的期间拉高SDA释放,stop位已产生,此时SDA和SCL都为高,即总线空闲状态。
I2C总线传输的数据不收限制,但是每次发到SDA上的必须是8位,并且主机发送8位后释放总线,从机收到数据后必须拉低SDA一个时钟,回应ACK表示数据接收成功,我们如果示波器上看到的波形就是每次9位数据,8bit+1bit ack。如下:


  从机收到一字节数据后,如果需要一些时间处理,则会拉低SCL,让传输进入等待状态,处理完成,释放SCL,继续传输,如下:

  1.5 总线读写时序
  数据的传输在起始条件之后,发送一个7位的从机地址,紧接着第8位是数据方向(R/ W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。
数据读取:一般而言,数据在SCL时钟的上升沿读取,因此在时钟上升沿期间数据应保持稳定。
数据变化:一般而言,数据在SCL时钟低电平时候变化,并且变化之后要等待tSUDATA时间才能将SCL时钟拉高
  I2C总线主设备读写从设备,一般都是与从设备的寄存器打交道,这个可以通过阅读从设备的datasheet获取。总线写时序如下:
  master start + master addr|w + slave ack + master reg|w + slave ack + master data + slave ack + master restart。。master data + slave nack + master stop
  总线读时序如下:
  master start + master addr|w + slave ack + master reg|w + slave ack + master restart + master addr|r + slave ack + slave data + master nack + master stop
  总线读时序与写的不同之处在于读需要2次传输才能完成一次读取,首先要写寄存器地址到从设备,其实是写到了从设备的控制寄存器或者命令寄存器,从设备内部会根据这个地址来寻址所要操作的寄存器。
  我在读我们的bios和内核时发现,两者在总线读时序上的实现不太一样,在于第一次寄存器地址写入后,一个发的是restart,一个发的是stop,然后再start开始读取数据,示波器抓波形发现读取数据都正确,说明这2种时序都是正确的。
  I2C总线的读写时序比较固定,设备通信严格遵循协议,因此I2C总线设备驱动程序的编写也就相对简单一些。

I2C总线内容总结分享相关推荐

  1. 初学24CXX系列EEPROM使用详解STM32库函数I2C总线

    24CXX系列芯片属于EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存 ...

  2. [I2C]I2C总线协议图解

    转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构       I2C 总线在物理连接上非常简单,分别由 ...

  3. 使用GPIO模拟I2C总线进行通信

    I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...

  4. 干货总结:I2C总线详细要点

    [导读] 前文总结了单片机串口个人认为值得注意的一些要点,本文来梳理一下 I2C 总线的一些要点.这个题目有点大,本文对于 I2C 其实很多地方也没整清楚,只为了与前文形成系列,如果大家有补充欢迎留言 ...

  5. linux内核的I2C子系统详解3——i2c-core.c初步分析、I2C总线的匹配机制

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 5.i2c-core.c初步分析 (1)smbus代码略过:smbus是基于I2C总线发展出来的. (2)模块加载和卸 ...

  6. linux内核的I2C子系统详解1——I2C总线概览、驱动框架概览

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 1.I2C总线汇总概览 (1)三根通信线:SCL.SDA.GND: (2)同步.串行.电平.低速(几百k).近距离: ...

  7. 基于I2C总线的MPU6050学习笔记

    MPU6050学习笔记 1. 简述 一直想自己做个四轴飞行器,却无从下手,终于狠下决心,拿出尘封已久的MPU6050模块,开始摸索着数据手册分析,一步一步地实现了MPU6050模块的功能,从MPU60 ...

  8. I2C总线时序模拟(二)-加深理解总线协议

    /******************************************************************** 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序, ...

  9. I2C总线信号时序总结

    I2C总线信号时序总结 总线空闲状态  I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态.此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电 ...

最新文章

  1. 【数据结构与算法】之深入解析“单词接龙”的求解思路与算法示例
  2. 机器人彩铅画_彩铅画嗔
  3. shocked的歌曲 类似shell_Shell Shocked歌词
  4. 【转】Windows消息传递机制详解
  5. python决策树id3算法_python实现决策树ID3算法
  6. C#LeetCode刷题-链表
  7. 神州数码笔试题C语言,神州数码程序类笔试题分享
  8. Java 1.1.5 空串与 Null 串
  9. dbentry mysql_DbEntry.Net(Lephone Framework) Access ORM:安装和简单使用
  10. 记一次axios源码排查
  11. nginx1.21下载安装详细教程(win10)
  12. impalahive大数据平台数据血缘与数据地图(四)-impala血缘架构图及功能介绍
  13. JS事件之事件绑定与事件监听
  14. c语言stl用法,C STL快速入门!学习使我快乐
  15. Mysql面试题总结(1)
  16. 视频编辑器-MovieMator 简洁使用-在时间线上拆分,修剪,连接剪辑
  17. 2021年的谷歌排名优化怎么做,69个重点告诉你
  18. 利用python进行数据分析_从删库到跑路
  19. linux下c/c++读取txt文件,多行文件,且每行都用逗号隔开
  20. NAT ALG DNS — DNS在内部,外网通过域名访问内部服务器

热门文章

  1. 3DMAX与MAYA在Unity与UE中的旋转、轴向关系梳理
  2. matlab画二维电场强度分布图,Matlab如何画出点电荷的电场线和等势面分布
  3. U盘删除的文件能恢复吗,删除文件怎么恢复
  4. 如何管理和维护算法族?只需知道策略模式
  5. apqp过程流程图及编写规则_APQP流程图及详解.pdf
  6. teleop_twist_keyboard安装
  7. RTB matlab工具箱(1)——demo与常用函数
  8. superset 最新版 地图数据展示问题
  9. 在线教育APP带来的价值
  10. SAP S4 FI后台详细配置教程- PART3 (财务凭证相关配置篇)