本文旨在用最通俗易懂的方式。让大家明确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. [原创]FreeSWITCH命令:uuid_dual_transfer

    该篇文章主要介绍FreeSWITCH的API命令uuid_dual_transfer的用法. 命令介绍 该命令用于同时将两条腿进行转移,并且是可以转移到不同的方向. -USAGE: <A-des ...

  2. 简体字冯|docker-安装docker私有库

    原创文章,转载请注明出处. 作者:简体字丶冯; QQ:564372931 安装docker 各终端安装docker 教程 菜鸟docker教程 就挺好,本着不重复造轮子的原则就不深入了,自己学习. 如 ...

  3. Asp.net 数据库依赖那些事

    声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/8904022.html 问题背景: 最近做一个非常简单的功能,就是使用ajax ...

  4. gitlab 把或名改成IP

    [root@GitLab assets]# cat /etc/gitlab/gitlab.rb # Change the external_url to the address your users ...

  5. AutoLayout详解+手把手实战(转载)

    首先说一下这篇博客虽然是标记为原创,但是事实并非本人亲自写出来的,知识点和例子本人花了一天各处查 找和整理最终决定写一个汇总的详解,解去各位朋友到处盲目查找的必要,因为不是转载某一个人的内容,故此不标 ...

  6. php 使用curl 将文件上传

    <?php /**   *  curl文件上传   *  @var  struing  $r_file  上传文件的路劲和文件名     */ function upload_file($r_f ...

  7. 四个 jQuery 方法:

    append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容

  8. python 反射机制 ( 广泛应用于URL参数)

    web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...

  9. python学习---简介

    http://www.cnblogs.com/wuguanglei/p/3866583.html http://www.cnblogs.com/wuguanglei/p/3866583.html ok ...

  10. Java基础 - 强引用、弱引用、软引用、虚引用

    1.强引用(StrongReference) 强引用是使用最普遍的引用. 假设一个对象具有强引用.那垃圾回收器绝不会回收它.例如以下: [java] view plaincopyprint" ...