嵌入式入门系列(二)结合数据抓取学习I2C协议

2023年 8月 16日 135.5k 0

前言

笔者刚学习i2c协议时,翻到了62页的官方文档,直接就被页数和满屏的英文劝退了;后来又翻到了ti上一篇讲解i2c的文章,也是洋洋洒洒写了8页,看似认真地看完,结果被问了一个基础的问题又答不上来,才发现自己什么都没记住。正所谓纸上得来终觉浅,绝知此事要躬行,将抓取的数据与协议相对照来理解,记忆才能更加深刻。

前置准备

工具安装

首先我们需要下载一个逻辑分析仪,它由MuseLab推出,对硬件软件以及上位机均开源,同时支持百余种协议解析。
github地址如下:github.com/wuxx/nanoDL…

将项目拉取到本地,software目录下有工具的安装向导,仓库的readme文档有具体操作方法,照着操作即可。

i2c连接

用三根线实现i2c通信,其中一根线接地,一根作为SCL(serial clock),一根作为SDA(serial data)。

串口连接到计算机设备方便查看

  • 用usb转串口连接线,如未安装相关驱动,应先安装,对应驱动版本可以从官网下载。
  • 通过电脑的设备管理器(windows下)确认串口com版本,然后用serial方式连接开发板设备,波特率设置为115200。

抓取数据并可视化

设置好采样数据大小和采样率,即可点击运行按钮开始采样。采样结束后,配置具体的解析协议,PlusView就会将数据以可视化的形式展现出来。

协议分析

  • D4那条线是SCL(时钟线),D6是SDA(数据线),开始标志就是在SCL高电平的情况下SDA的下降沿,结束标志就是它的上升沿;

正因为下降上升标志着开始和结束这两个控制命令的中断,所以在传输数据的过程中,SCL高电平时,SDA的电平应该保持稳定。

e9ad82c69044c55924950c04dbcb88d.png

  • ACK就是,当SCL低电平时,SDA也会被下拉成低电平,所以在之后SCL是高电平的时钟周期里SDA依然保持低电平。

dc60bc5f52ab934674a238bcdbba03a.png

  • 而NACK则是:在第9个时钟周期内,主机会释放总线,然后因为上拉电阻的缘故,总线会变成高,这个时候从机拉低总线表示应答,然后归还总线给主机总线,表现为SCL和SDA都是高电平。

9885c59713a87f9f7d41107944efd50.png

  • i2c支持双工通信的基础之一是:一个设备只能将总线的电平拉低或者释放总线,让上拉电阻来提高电压,而无法让总线保持高电平。
  • stop之后的SCL和SDA都是高电平表示处于空闲状态。

aad0b75eb28e99d0e9af741a16e943d.png

  • 有时候可能会出现这种一个start后面没有stop直接又是一个start的情况。

df00e73cc0d3d3bbc84c537a6bc272f.png
理论上这是为了防止在多主节点的环境下,主节点失去对总线的控制;实践中多用于连续读或者写。

补充小知识

  • i2c可同时挂载多少个设备?

i2c有8位,其中一位为读写位,所以理论上最大可挂载2^7-1=127个设备,但由于保留地址限制,实际最多可挂载112个设备。

  • i2c波特率问题

I2C标准波特率为100Kbit/s,最高传输速率可达400Kbit/s。

参考资料

  • Understanding the I2C Bus
  • PlusView演示结果

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论