本文旨在用最通俗易懂的方式。让大家明确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. 在连接mysql数据库时出错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

    这个错误是时区导致的,所以需要在配置连接url后面加上时区: url=jdbc:mysql://localhost:3309/test?serverTimezone=UTC 其中UTC是统一标准世界时 ...

  2. 解决WSDL.EXE不能解析外部Import的XSD的问题

    今天碰到一个WSDL,比较奇怪,它是用Java生成的. <types>   <xsd:schema>     <xsd:import namespace="ht ...

  3. C++程序设计(第4版)读书笔记_C++概览:基础知识

    变量赋值 常用的变量赋值都是用“=”去赋值的 ; 但是如果把一个浮点数赋值给i的话,就会造成精度损失,在C++中最好使用初始化列表的方式“{}”给变量赋值,这样可以保证不会发生某些可能导致信息丢失的类 ...

  4. python模块学习之six模块

    Six:Python 2和3兼容性库 Six提供了简单的实用程序,用于覆盖Python 2和Python 3之间的差异.它旨在支持在Python 2和3中都可以进行修改的代码库. 六个只包含一个Pyt ...

  5. UVA 1363 Joseph's Problem 找规律+推导 给定n,k;求k%[1,n]的和。

    /** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想 ...

  6. Div+CSS布局入门教程

    http://www.blueidea.com/tech/site/2006/3574.asp ———————————————————————————————————————————————————— ...

  7. sha1加密算法

    public static void main(String[] args) throws UnsupportedEncodingException { /* * 获取jsapi_ticket * * ...

  8. TP中单字母快捷函数总结

    ThinkPHP中有许多使用简便的单字母函数,可以很方便开发者快速的调用,但是字母函数却不方便记忆,本文将所有的字母函数总结一下,以方便以后查找.1.U() URL组装 支持不同URL模式 U($ur ...

  9. php tp验证表单与自动填充函数

    <?php class FormModel extends Model { // 自动验证设置 /* * 一:自动验证 自动验证的定义是这样的:array(field,rule,message, ...

  10. jq serialize 系列化 乱码 解决办法

    query = form.find('input,select,textarea').serialize(); $.post(target,decodeURIComponent(query)).suc ...