本文旨在用最通俗易懂的方式。让大家明确I2C通信的过程到底是怎么回事。
I2C起源于飞利浦公司的电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C
总的来说,I2C能够简单归纳为,两根线,一个时钟线,一个数据线;一个总线上,一个主控。多个从设备。I2C的作用当然是用来数据传输,它的最大特点就是仅仅用了2根线,能够完毕对总线上多个从设备的有序通信,这就依赖于其通信协议了。
主控相当于I2C的大脑,每一次读写操作都必须是主控发起的。这样就保证了多个从属设备间是无法直接通信的,这样就防止了仅有的2根线上数据传输发生混乱。

我们还是简单回想一下《I2C 简单介绍》中的I2C 总线的几种信号状态
1. 空暇状态:SDA 和 SCL 都为高电平。

2. 開始条件(S):SCL 为高电平时,SDA 由高电平向低电平跳变。開始传送数据。

3. 结束条件(P):SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

4. 数据有效:在 SCL 的高电平期间,SDA 保持稳定,数据有效。

SDA 的改变仅仅能发生在 SCL 的低电平期间。

5. ACK 信号:数据传输的过程中,接收器件每接收一个字节数据要产生一个 ACK 信号,向发送器件发出特定的低电平脉冲。表示已经收到数据。

  • 空暇状态

当没有数据须要读写时,大家风平浪静,时钟和数据线都是出于高电平状态,可是当数据传输时,就必须有一个规则产生,那就是

  • 開始条件(S)
Start: 在clk为高的情况下,data由高变低为start。
  • 结束条件(P)
Stop:在clk为高的情况下。data由低变高是stop。
        
  • 数据有效
仅仅有在clk为高的时候。数据才有效。

Clk为低。数据无效。

  • ACK 信号
每个字节完毕。都会有一个ack,不管由master还是slave发出。ack位是低电平,表示有应答,假设是高电平,表示无应答。

  • 读写协议
读数据须要有offset。所以offset须要先用写协议告诉slave,然后再读。
所以一个完整的写协议就是: S 7_BIT_ADD W A OFFSET A RS 7_BIT_ADD R A DATA A P
ST: 起始位
SAD: 设备地址
SAK: 从设备应答位
MAK: 主控应答位
SUB: offset
DATA: 详细数据
SP: 结束位 
  • 实例分析
二进制串为S 001111000 000010000 {RS} 001111010 110111101 P
翻译就是3C 08 3D DE
另外能够看出,RS restart 和start波形非常类似,并且P之前slave没有ack,就说明slave不准备再提供数据了,说明是byte读。

假设要读多byte,由于这个是st的sensor。所以在offset位最高位写1即可了。这是st的private规定。

数据位是S 001100000 001000000 001001110 P
翻译一下就是30 20 27。slave address 18 (30/2) offset 20, data 27.
从图中能够看出。第九位应答位为高。说明并没有master并没有收到应答
数据位是S 001111001 000000001(并非完整的波形)
翻译一下slave address 1e(3c/2) offset 0 .....
本文简单分析了I2C的读写的详细过程。以及依据几个波形图的实例,分析了详细发送的数据,供大家參考。

通过实例来分析I2C基本通信协议的更多相关文章

  1. php数组去重实例及分析

    php数组去重实例及分析.  一维数组的重复项: 使用array_unique函数即可,使用实例 <?php    $aa=array("apple","banan ...

  2. 示波器分析I2C时序波形图

    对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置.今天,我们就随便聊聊这个I2C协议. I2C协议中最重要的一点是I2C地址.这个地址有7位和 ...

  3. 有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断

    个人不是很喜欢在技术上跟人互喷,尤其是不在同一个岗位上的人.一方面本人的性格如此,另一方面,我自身的口水也确实是不行,人生经历了第一次的双11洗礼,在大促的环境下,总算知道了有些东西是否应该规避,这次 ...

  4. Backbone实例todos分析

    源码来自:http://todomvc.com/examples/backbone/ 这是一个用Backbone.js完成的待办事项实例,精简但完善,可以帮助很好的帮助理解Backbone的API,M ...

  5. Hello2实例的分析

    首先: java EE 上的hello2项目是一个部署在glass fish上的开发源码的java web项目,在终端通过命令行使用maven进行打包成.war文件,最后部署到相关的glass fis ...

  6. Netty入门实例及分析

    什么是netty?以下是官方文档的简单介绍: The Netty project  is an effort to provide an asynchronous event-driven netwo ...

  7. SQLServer数据库,表内存,实例名分析SQL语句

    --数据库内存分析 USE master go DECLARE @insSize TABLE(dbName sysname,checkTime VARCHAR(19),dbSize VARCHAR(5 ...

  8. ORACLE AWR报告生成过程出现多个实例记录分析

    在一次生成AWR报告中,发现在"Instances in this Workload Repository schema"部分,出现了多个实例记录信息(host敏感信息被用host ...

  9. 【pyQuery分析实例】分析体育网冠军联盟比赛成绩

    目标地址:http://www.espncricinfo.com/champions-league-twenty20-2012/engine/match/574265.html liz@nb-liz: ...

随机推荐

  1. 如何下载PDF?

    IIS MIME类型配置: application/octet-stream

  2. kafka快速开始教程

    此教程假设你刚刚开始没有任何 Kafka 或 ZooKeeper 数据.Kafka的控制台脚本在类Unix和Windows平台不同,Windows平台使用bin\windows\\代替bin/,脚本的 ...

  3. TensorFlow学习笔记3——Placeholders and feed_dict

    1. Placeholders placeholders,顾名思义,就是占位的意思,举个例子:我们定义了一个关于x,y的函数 f(x,y)=2x+y,但是我们并不知道x,y的值,那么x,y就是等待确定 ...

  4. Blocking & Nonblocking module

    /*************************************************** /  Blocking and Nonblocking circuit and Simulat ...

  5. c++ 宏 #val 在unicode下的使用。

    #define CHECK(condition) cout<<check failed:<<#condition<<endl; 上面这句宏,当你 CHECK(myf ...

  6. Harmonic Number 求Hn; Hn = 1 + 1/2 + 1/3 + ... + 1/n; (n<=1e8) T<=1e4; 精确到1e-8; 打表或者调和级数

    /** 题目:Harmonic Number 链接:https://vjudge.net/contest/154246#problem/I 题意:求Hn: Hn = 1 + 1/2 + 1/3 + . ...

  7. HTML5之本地存储localstorage

    Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多,cookie大小被限制在4KB,Web Sto ...

  8. Spring 3 MVC and JSR303 @Valid example

    http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/ ———————————————————————————— ...

  9. php 设置地区时间

    date_default_timezone_set('Asia/ShangHai');

  10. 第一百六十四节,jQuery,常规选择器

    jQuery,常规选择器 学习要点: 1.简单选择器 2.进阶选择器 3.高级选择器 jQuery 最核心的组成部分就是:选择器引擎.它继承了 CSS 的语法,可以对 DOM 元 素的标签名.属性名. ...