示波器分析I2C时序波形图
对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置。今天,我们就随便聊聊这个I2C协议。
I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。
I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它是啥都不干的,更不会自动发送数据;而主设备,则是起到控制作用,一切都是从它开始。
除了GND以外,I2C有两根线,分别是SDA和SCL,所有的设备都是接到这两根线上。那么,这些设备如何知道数据是发送给它们呢?这就得依靠前面所说到的地址了。设备I2C的地址是固定的,比如0x50,0x60等等。因为只能有127个地址,地址冲突是很常见的,所以一般设备都会有一个地址选择PIN,比如拉高时候为0x50,接地为0x60。如果无论拉高还是接地,都和别的芯片有冲突,那该怎么办呢?答案是:凉拌,没办法。遇到这种情况,只能换芯片了。
一、概要
I2C总线只需要两条线,一条SDA数据线,一条SCL时钟线;根据这两条线的高低电平、上升沿、下降沿就可以实现主机与I2C设备的通讯;其中有:
(1)I2C总线相关
传输开始条件:SCL处于高电平,SDA下降沿时;
传输接收条件:SCL处于高电平,SDA上升沿时;
传输数据:开始传输后,SCL处于高电平时,SDA的数据为所传输的数据;
回应:当传输完一个字节后,I2C设备需要回应一个ACK,这样主机才继续发送;因此回应信号是在传输完8bit后的下一个数据位(SDA值),当SDA为0表示有回应,为1表示没回应;
正常I2C总线的数据是:Start + I2C devece id + R/W + ACK + Data(first byte)+ ACK + ... + Data(n)+ ACK + Stop
(2)I2C设备相关
设备地址:有7位和10位两种,具体见I2C设备芯片的DataSheet,由于目前用到的是7位,因此下面主要针对7位讲述;在讲I2C设备地址是有可能有两种说法,主要是用8位表示还是用7为表示,比如对于我的OLED来说,当用8位表示时则为0x78地址,当用7位时则为0x3c(即0x78右移1为),在驱动中用0x78还是用0x3c要看具体平台的I2C总线驱动,我在AMLOGIC平台上用的是0x78,而在MV平台上用的是0x3c;
寄存器reg:一般的I2C设备芯片都有带reg,一般在传输正式的数据之前需要先传输reg地址,比如我的OLED来说,在传控制命令时需要先发送0x00的reg地址,在传输数据时需要发送0x40的reg地址;
二、调试及波形分析
一般当我们拿到一个I2C设备时,就必须涉及到驱动的编写,就比如对于OLED来说,就要用编写OLED驱动,这样我们才能控制它,对于OLED屏来说,第一步也是最重要的一步就是点亮它;当我们做完这一步,那后面剩下的就只是细节问题了;”万事开头难“,这句话真的不假,对于OLED来说,如何才能点亮,我们该怎么调试呢?当我们写完OLED驱动,但OLED屏还是不亮,可能问题会出现在哪?是硬件问题还是软件问题?;若为软件问题,那会是I2C总线驱动问题,还是我们I2C设备驱动有问题?那么我们该如何判断问题出现位置呢?这就需要我们对I2C总线上的数据进行分析;那么下面我将详细讲述如何获取和分析I2C总线上的数据;
(1)示波器
对于I2C总线的数据,我们要用到示波器,这样我们才能抓取到信号,而且必须同时采集SDA和SCL的数据;该如何抓取呢?我这边的方式是将示波器调成边下降沿触发模式(因为开始信号是SDA下降沿),并且设置成单次模式(这样抓取完一次就会stop,便于我们数据分析);
(2)波形
我们来看I2C协议中的数据传输时序图:
SCL是时钟,SDA承载的是数据。当SDA从1变动到0,而SCL还是1时,表示开始数据传输。接下来的7位,就是设备的地址。紧接着的是读写标志,其为1时是读取,为0则是写。如果I2C总线上存在着和请求的地址相对应的设备,则从设备会发送一个ACK信号通知主设备,可以发送数据了。接到ACK信号后,主设备则发送一个8位的数据。当传输完毕之后,SCL保持为1,SDA从0变换到1时,标明传输结束。
从这个时序图中可以看到,SCL很重要,并且哪个时钟沿是干嘛的,都是确定好的。比如,前面7个必定是地址,第8个是读写标志,数据传输必须是8位,必须接个ACK信号等等。
前面的时序图并没有标明数据传输的方向,我们现在看看写操作的数据流向:
网格的是主设备发送的,白色格子是从设备发送的。从图示中可以看到,对于写操作,从设备都只是发送ACK进行确认而已。
而读操作的数据流向,就有所不同,如图:
这时候,从设备除了发送ACK以外,紧跟着的还有数据。
我们用示波器来查看波形图,以便于理解。
将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:
I2C要求要有一个主设备,负责发起请求和控制时钟;其它为从设备,通过设备ID地址来识别并响应主设备请求。主从设备要轮流控制SDA。一开始我没搞明白这一点,直接加了写I2C数据代码,然后用示波器在SDA和SCL脚测量,却只能找到些凌乱的波形,没有预期的效果。后来把从设备接上,两边写好代码,互相有了响应,这才在示波器上看到波形。
这里我找了一个主设备往从设备写数据的例子,代码如下:
接收端的代码比较简单,就不贴了。
将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:
从图中可知时序如下:
- 由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
- 接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
- 接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
- 接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
- 还有其它数据和最后的停止位,图中被截掉了。
从图中可知,纵向一格是200mV,则SDA和SCL的电平大概就是350mV;由于信号笔上设置了信号x10,因此实际电平应该大概是3.5V(理论上应该是3.3V)。横向一格是25us,10个时钟周期大概用了4格,即4x25us=100us,平均每个时钟周期是10us,可算出传输频率为1/10us=100,000/s,即100k bps。
另外,对于读从设备内容,基本流程是主设备先往从设备写一个命令,然后再输出读取命令,然后才由从设备发送数据。过程类似,不再具体分析了。
下图示例中,主机先向从机写了一个地址命令,然后重新开始并进入读取周期。
分析波形可检测出I2C通信工作是否正常,是否符合预期,对我们编程调试诊断有辅助作用。
摘自:https://blog.csdn.net/liushi558/article/details/70184788
示波器分析I2C时序波形图的更多相关文章
- S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动
目录:一. 说明 二. 驱动程序说明及问题 三. 案例一 四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...
- 通过实例来分析I2C基本通信协议
本文旨在用最通俗易懂的方式.让大家明确I2C通信的过程到底是怎么回事. I2C起源于飞利浦公司的电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C 总的来说,I2C能够简单归纳为,两根线, ...
- 通过示波器分析TypeB卡通讯数据
这几天,使用NFC芯片模拟了一张TypeB的cpu卡,在调试过程中,因为要检查射频性能,所以用示波器抓取了RFID读卡器和TypeB CPU卡之间的通讯数据.READER发送的数据位106K ASK调 ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- Linux I2C设备驱动编写(三)-实例分析AM3359
TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1版本规格 支持标准模式(100K bits/s)和快速模式(400K bits/s) 多路接收.发送模式 ...
- 【转】Linux I2C设备驱动编写(三)-实例分析AM3359
原文网址:http://www.cnblogs.com/biglucky/p/4059586.html TI-AM3359 I2C适配器实例分析 I2C Spec简述 特性: 兼容飞利浦I2C 2.1 ...
- 重度使用示波器进行优化分析——一个DSDA项目回顾
这是若干年前一个项目,最近有时间整理一下.回忆起来,印象最深刻的就是重度使用示波器辅助分析,进行优化. 项目背景是在原有项目3G+项目基础上,增加一颗2G+ Modem,使支持DSDA功能. 在介绍D ...
- am335x i2c分析
/***************************************************************************** * am335x i2c分析 * i2c驱 ...
- I2C控制器的Verilog建模之三(完结版)
前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...
随机推荐
- 最新版微软视窗(Windows)作业系统下载(2020-08-19)
为了更好的使用WSL(Windows Subsystem For Linux),不得不用最新的windows 10 2004版了,这个版本的WSL已经是第二版了,即WSL2.下面给出下载地址 系统发布 ...
- Shell系列(10)- bash环境变量(3)
环境变量与用户自定义变量的区别 环境变量是全局变量,用户自定义变量是局部变量. 用户自定义变量只在当前的 shell 中生效,环境变量在当前 shell 和这个 shell 的所有子 shell 中生 ...
- HTML在网页上不能显示图片问题
我遇到的问题是写了一个HTML程序,结果在网页上面不能显示,原因是图片路径放置错了. 修改前代码: <!DOCTYPE html> <html> <head> &l ...
- nginx 配置文件(支持thnkphp3.2~5)
server { listen 8080 ; server_name localhost; set $root /var/www/myweb; #listen 443 ssl; #ssl_certif ...
- 测试开发【提测平台】分享11-Python实现邮件发送的两种方法实践
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 按照开发安排,本篇本应该是关于提测页面的搜索和显示实现,怕相似内容疲劳,这期改下内容顺序,将邮件服务的相关的提前,在之前的产品需求和原型中 ...
- AT2161-[ARC065D]シャッフル/Shuffling【dp】
正题 题目链接:https://www.luogu.com.cn/problem/AT2161 题目大意 长度为\(n\)的\(0/1\)串,\(m\)个区间,你可以按照顺序任意排列区间中的数字,求最 ...
- P3309-[SDOI2014]向量集【线段树,凸壳】
正题 题目链接:https://www.luogu.com.cn/problem/P3309 题目大意 \(n\)个操作 在序列末尾加入一个向量\((x,y)\) 询问加入的第\(l\sim r\)个 ...
- P5782-[POI2001]和平委员会【2-SAT】
正题 题目链接:https://www.luogu.com.cn/problem/P5782 题目大意 \(n\)对人,每对之间恰好有一个人出席.\(m\)对仇恨关系表示两个人不能同时出席. 求是否有 ...
- Linux命令行:监视系统IO、内存、CPU、GPU
[监视IO] Linux18.04自带工具sysstat,其中的iostat可以用于观察IO情况.Linux16.04系统没有默认安装,需要手动安装,安装sysstat时需要下载新的内核(我的原本是1 ...
- Jetpack Compose学习(6)——关于Modifier的妙用
原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...