嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十九)I2C应用编程(上)

简介: 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十九)I2C应用编程

1.I2C应用编程


1.1 I2C视频介绍


参考资料:

请点击


1.1.1 I2C硬件框架

1670914870031.jpg

在一个芯片(SoC)内部,有一个或多个I2C控制器

在一个I2C控制器上,可以连接一个或多个I2C设备

I2C总线只需要2条线:时钟线SCL、数据线SDA

在I2C总线的SCL、SDA线上,都有上拉电阻


1.1.2 I2C软件框架


以I2C接口的存储设备AT24C02为例:

APP:

1670914882010.jpg

 提出要求:把字符串"www.100ask.net"写入AT24C02地址16开始的地方

 它是大爷,不关心底层实现的细节

 它只需要调用设备驱动程序提供的接口

AT24C02驱动:


 它知道AT24C02要求的地址、数据格式

 它知道发出什么信号才能让AT24C02执行擦除、烧写工作

 它知道怎么判断数据是否烧写成功

 它构造好一系列的数据,发给I2C控制器

I2C控制器驱动


 它根据I2C协议发出各类信号:I2C设备地址、I2C存储地址、数据

 它根据I2C协议判断


1.1.3 我们讲什么


1 对于Linux

1670914896240.jpg

从上到下:

 先讲I2C协议

 APP可以通过两类驱动程序访问设备


 I2C Device Driver

I2C设备自己的驱动程序,内核自带的i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)


 I2C Controller Driver

芯片I2C控制器的驱动程序(称为adapter),使用GPIO模拟的I2C控制器驱动程序(i2c-gpio.c)


2 对于单片机/裸机

1670914911029.jpg

从上到下:

 先讲I2C协议

 APP

 I2C Device Driver

 I2C Controller Driver(也被称为adapter)


1.2 I2C协议


参考资料:

i2c_spec.pdf


1.2.1 硬件连接


I2C在硬件上的接法如下所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。

1670914928520.jpg


1.2.2 传输数据类比


怎么通过I2C传输数据,我们需要把数据从主设备发送到从设备上去,也需要把数据从从设备传送到主设备上去,数据涉及到双向传输。举个例子:


1670914940628.jpg

体育老师:可以把球发给学生,也可以把球从学生中接过来。


发球:

老师:开始了(start)

老师:A!我要发球给你!(地址/方向)

学生A:到!(回应)

老师把球发出去(传输)

A收到球之后,应该告诉老师一声(回应)

老师:结束(停止)


接球:

老师:开始了(start)

老师:B!把球发给我!(地址/方向)

学生B:到!

B把球发给老师(传输)

老师收到球之后,给B说一声,表示收到球了(回应)

老师:结束(停止)


我们就使用这个简单的例子,来解释一下IIC的传输协议:

老师说开始了,表示开始信号(start)

老师提醒某个学生要发球,表示发送地址和方向(address/read/write)

老师发球/接球,表示数据的传输

收到球要回应:回应信号(ACK)

老师说结束,表示IIC传输结束§


1.2.3 IIC传输数据的格式


1 写操作

流程如下:

主芯片要发出一个start信号

然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

从设备回应(用来确定这个设备是否存在),然后就可以传输数据

主设备发送一个字节数据给从设备,并等待回应

每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

1670914956642.jpg

2 读操作

流程如下:

主芯片要发出一个start信号

然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)

从设备回应(用来确定这个设备是否存在),然后就可以传输数据

从设备发送一个字节数据给主设备,并等待回应

每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。

数据发送完之后,主芯片就会发送一个停止信号。

下图:白色背景表示"主→从",灰色背景表示"从→主"

1670914965233.jpg

3.I2C信号

I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。

结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

I2C协议信号如下:

1670914993158.jpg

1670915003391.jpg

1670915014164.jpg


4.协议细节

如何在SDA上实现双向传输?

主芯片通过一根SDA线既可以把数据发给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚(发送引脚/接受引脚)。

主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间?

在9个时钟里,

前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据;

前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。

双方设备中,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?

设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样),如下图:

1670915025276.jpg

真值表如下:

1670915033880.jpg

从真值表和电路图我们可以知道:

当某一个芯片不想影响SDA线时,那就不驱动这个三极管

想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平)

想让SDA输出低电平,就驱动三极管

1670915041742.jpg

从下面的例子可以看看数据是怎么传的(实现双向传输)。

举例:主设备发送(8bit)给从设备

前8个clk

从设备不要影响SDA,从设备不驱动三极管

主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管

第9个clk,由从设备决定数据

主设备不驱动三极管

从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0

从这里也可以知道ACK信号是低电平


从上面的例子,就可以知道怎样在一条线上实现双向传输,这就是SDA上要使用上拉电阻的原因。

为何SCL也要使用上拉电阻?

在第9个时钟之后,如果有某一方需要更多的时间来处理数据,它可以一直驱动三极管把SCL拉低。

当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。

当它就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用I2C总线了。


对于IIC协议它只能规定怎么传输数据,数据是什么含义由从设备决定。


1.3 SMBus协议


参考资料:

Linux内核文档:Documentation\i2c\smbus-protocol.rst

SMBus协议:http://www.smbus.org/specs/

SMBus_3_0_20141220.pdf

I2CTools: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/


1.3.1 SMBus是I2C协议的一个子集


SMBus: System Management Bus,系统管理总线。

SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。

SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。

SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。

SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。

1670915076796.jpg

SMBus有哪些更严格的要求?跟一般的I2C协议有哪些差别?

1.VDD的极限值不一样

I2C协议:范围很广,甚至讨论了高达12V的情况
SMBus:1.8V~5V


2.最小时钟频率、最大的Clock Stretching

Clock Stretching含义:某个设备需要更多时间进行内部的处理时,它可以把SCL拉低占住I2C总线
I2C协议:时钟频率最小值无限制,Clock Stretching时长也没有限制
SMBus:时钟频率最小值是10KHz,Clock Stretching的最大时间值也有限制


3.地址回应(Address Acknowledge)

一个I2C设备接收到它的设备地址后,是否必须发出回应信号?
I2C协议:没有强制要求必须发出回应信号
SMBus:强制要求必须发出回应信号,这样对方才知道该设备的状态:busy,failed,或是被移除了

4.SMBus协议明确了数据的传输格式

I2C协议:它只定义了怎么传输数据,但是并没有定义数据的格式,这完全由设备来定义
SMBus:定义了几种数据格式(后面分析)

5.REPEATED START Condition(重复发出S信号)

比如读EEPROM时,涉及2个操作:
把存储地址发给设备
读数据
在写、读之间,可以不发出P信号,而是直接发出S信号:这个S信号就是REPEATED START


如下图所示

1670915116517.jpg

SMBus Low Power Version

SMBus也有低功耗的版本

相关文章
|
5月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
863 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
731 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
942 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
278 0
|
6月前
|
传感器 监控 安全
HarmonyOS NEXT 5.0 的星闪(NearLink)开发应用案例
V哥分享HarmonyOS NEXT 5.0星闪开发实战,涵盖智能车钥匙无感解锁与工业传感器监控。低延迟、高可靠,代码完整,速来学习!
913 0
|
6月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
730 1
二、Linux文本处理与文件操作核心命令
|
6月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
435 137
|
6月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1130 58
|
5月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1019 2
|
6月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
554 0
Linux内存问题排查命令详解