通过示波器解析IIC通讯

可以通过示波器捕获IIC SDA数据线,SCL时钟线波形,结合协议规则,加深我对IIC协议的学习和理解

文章目录

  • 通过示波器解析IIC通讯
  • 一、IIC数据协议简要介绍
  • 二、IIC硬件准备
  • 三、IIC代码实现
  • 四、示波器捕获IIC波形
  • 五、总结

一、IIC数据协议简要介绍

IIC主要用于SOC与其外围设备的通信, 属于串行通信,并且其通信速率较低,可在软件中设置外围设备的最高速率,不过一般就几百KHZ,一般用到IIC的设备有TP、Sensor、EEPROM等。
SCL:时钟信号,主设备向从设备提供时钟的通道;
SDA:数据信号,所有的数据以位为单位在SDA上传输。
1、通信的两方分主设备和从设备,整个通信由主设备发起并主导,从设备只是根据主设备的通信数据进行响应;
2、多个从设备可以挂在一个主设备上,主设备通过调动总线来决定某一时间与哪一个从设备通信,并且当与某一个从设备出于通信状态,其他从设备即保持沉默状态,每个从设备都有自己的专有属性的地址,主设备与从设备就是通过这个地址进行“碰头”。所谓“碰头”即:主设备在每个通信周期会先发8位的从设备地址(但其实8位中只有7位是从设备地址,还有1位表示主设备“读”或“写”)到总线(主设备是以广播的形式发送的,只要是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否一致。如果一致则说明主设备本次通信就是给我说话,如果不一致说明这次通信与我无关,不是需要的通信对象;发送方发送一段数据后,接收方需要回应一个ACK。这个响应本身只有1个bit位,不能携带有效信息,只能表示2个意思(要么表示收到数据,即有效响应;要么表示未收到数据,即无效响应);在某一个通信时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另一个在收(从总线读)。不能在某个时间主设备和从设备都试图向总线写。
3.为什么开漏输出
1、防止短路,主从GPIO链接在一起,如果设置为推挽输出一个输出1一个输出0,那么直接就短路了。
2、线与
数电的知识,两个输出端直接互连就可以实现"AND"的逻辑功能。如果输入都是高电平,那么输出的就是高电平,否则输出就是低电平。
3、线与的作用:多主设备抢占总线的仲裁。
IIC支持多主机多从机通讯,当多个主机需要开始启动总线通讯的时候,线与就起到作用了
主机 SCL 高电平,SDA
IIC总线工作原理
(1)主机首先发出开始信号,接着发送1字节的数据,其中高7位的地址码和最低1位的方向位组成,方向位表示主机和从机间的传输方向 0 表示主机向从机写数据,1表示主机向从机读数据。
(2)系统中的所有从机将自己的地址和主机发送到总线的地址进行比较,如果从机地址与总线地址相同,那从机与主机进行数据交互。
(3)根据方向位,主机从从机接收数据或向从机发送数据。
(4)当数据发送完成后,主机发送一个停止信号,释放IIC总线。
(5)所有的从机等待下一次的开始信号。

二、IIC硬件准备

硬件选用arduino UNO 两块开发板,一个做主机,一个做从机,实现主从通讯。因为IIC SDA SCK是开漏输出没有高电平输出能力,在SCK和SDA加上3.3K上拉电阻。

三、IIC代码实现

主机代码是IIC发送变量x,x++。
从机代码是IIC接收数据,并printf。

#include <Arduino.h>
#include <Wire.h>#define enable 1  //1表示选择编译主机代码  0表示选择编译从机代码#if(enable)void setup() {Wire.begin();       // Wire初始化,作为主机加入到IIC总线
}byte x = 0;                   // 定义一个byte变量以便串口调试
void loop() {Wire.beginTransmission(8);         // 向地址为8的从机传送数据Wire.write(x);                   // 发送变量X数据Wire.endTransmission();           // 结束传送x++;delay(500);
}#else// 直接在Arduino IDE选择“文件”→“示例”→Wire→slave_receiver,可以打开该文件// 当主机发送的数据被收到时,将触发 receiveEvent() 事件
void receiveEvent(int howMany) {// 循环读取收到的数据,最后一个数据单独读取while (1 < Wire.available()) { char c = Wire.read();          // 以字符形式接收数据Serial.print(c);                // 串口输出该字符串}int x = Wire.read();               // 以整型形式接收数据Serial.print(x);                // 串口输出该整型变量
}void setup() {Wire.begin(8);                // Wire初始化, 并以从设备地址8的身份加入IIc总线Wire.onReceive(receiveEvent); // 注册一个IIC事件,用于响应主机的数据发送Serial.begin(9600);           // 初始化串口并设置波特率为9600
}void loop() {delay(100);
}#endif

四、示波器捕获IIC波形

使用示波器选择IIC协议解析,清晰呈现波形和解析数据可以得到关键数据
地址:0x08
R/W: 主机写
Data: 发送数据0xAB

下面通过辨别比较SDA和SCL 波形状态读出关键数据内容

五、总结

通过示波器观察IIC数据协议,加深了对IIC的理解。

示波器解析IIC通讯相关推荐

  1. 示波器观察IIC通讯协议-STM32F4读写24C08EEPROM时序图-新人首更

    示波器观察时序不是因为好奇,是因为遇到了问题 STM32F4探索者开发板板载24C02EEPROM,自制了一块开发板,需要存储容量更大的24C08A芯片,焊接后发现开发板上能成功运行的程序,在自己的板 ...

  2. 树莓派IIC通讯获取BMI08x IMU数据进行姿态解算,并通过UART/TCP在rviz上显示

    截至2021年,树莓派出的最新款应该是Raspberry Pi 400,设计得跟键盘一样,很难想象到这是个树莓派,尤其是它的标语写的很好"你的下一个电脑,何必是电脑",不言而喻.反 ...

  3. ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议

    IIC通讯协议 协议简介 IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换,它是由 ...

  4. LPC1768的iic通讯

    LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...

  5. 嵌入式工程师必备技能--如何使用示波器查看IIC波形

    以下文章来源于:公_众_号开源电子网 读取更多技术文章,请扫码关注 嵌入式工程师必备技能–如何使用示波器查看IIC波形 前言 这篇文章着重点是让大家学会使用示波器查看IIC波形,并且说明在搞IIC驱动 ...

  6. STM32之IIC通讯-SHT30温湿度采集

    一.实验目的:通过单片机普通IO口,模拟IIC时序,掌握IIC通讯协议. 二.实验用到的主控芯片:STM32F103RCT6,IIC通讯引脚IIC_SDA:PC11,IIC_SCL:PC12 三.SH ...

  7. 8、RH850 F1 IIC通讯功能和配置

    前言: 续上章节UART后,此章讲解的IIC也是最常见的串行通讯,广泛应用于单片机和单片机之间通讯.同样这里IIC的具体原理讲解就不做介绍,不清楚的朋友可移步up主的个人专栏 ---- "串 ...

  8. Bq769XX IIC 通讯 ALERT引脚

    Bq769X 初入BMS,很可能会选用到TI的这颗料,扩展性和可用性都还不错.但是在调试过程中,会有几个点让初入的人摸不着点. IIC通讯 TI的这个通讯准确说叫Mbus,但是实际与IIC通讯差异不大 ...

  9. #C51 IIC通讯(底层配置时序)

    系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如: 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一.场景 二.I ...

最新文章

  1. [NOI2005]聪聪与可可(期望dp)
  2. KVM虚拟机内无agent情况下的监控方法
  3. mac电脑循环次数多少算新_ARM架构电脑之路,苹果需要从微软Surface ProX中吸取哪些教训?...
  4. 矩阵计算的理论与方法_钢筋焊接网片实际重量与理论重量相差多少以及计算方法...
  5. WCF发布到IIS 7.0,并以https访问
  6. 本地yum源安装teamviewer
  7. 1.74HC138控制LED发光
  8. Hibernate学习笔记(三) — Hibernate 的一级缓存意义
  9. Windows11右键桌面没新建
  10. 谈谈反向代理Nginx
  11. 关于 Alpine Docker 镜像漏洞 CVE-2019-5021
  12. leaflet 画扇形
  13. 初学者笔记(三):利用python列表做一个最简单的垃圾分类
  14. CoreData里的增删改查
  15. 2014年放假安排时间表
  16. linux下的通配符与特殊符号
  17. linux7安装网卡驱动,CentOS 7 安装无线网卡驱动
  18. ts中的interface与type的区别
  19. VMware Cloud Foundry –见解
  20. K60系列学习(一)

热门文章

  1. 使用JEECG框架项目在linux 系统下启动及运行缓慢的问题追踪和解决办法
  2. 市级数字政府电子政务大数据中心项目建设和运营方案
  3. 白英彩 计算机组成原理,东南大学计算机教学实验中心(国家级)
  4. 关于AGI与ChatGPT,Stuart Russell与朱松纯这么看
  5. 深入浅出谈谈IP协议
  6. flume伪分布模式实践
  7. AMS1117 输入12V 输出3.3V 电流800mA 文波75db (FM富满电子)
  8. AI志愿填报软件靠不靠谱?
  9. 详情页动态html代码,好友动态详情页.html
  10. 波卡的验证人节点_轻松节点身份验证:设置和本地