一、Linux嵌入式的I2C驱动开发

I2C协议如何通过两条线来传输数据?

I2C控制器的驱动程序

I2C设备本身的驱动程序

应用程序(自己写和好用的I2Ctools)

一、硬件框架

二、软件架构

三、LInux下的

I2C传输流程:

1、写操作

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

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

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

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

数据发送完以后,主芯片发送下一个数据

2、读操作

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

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

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

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

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

对方设备是在SCL脉冲的高电平时刻读取SCL得到一位数据

3、I2C信号

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

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

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

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

在SCL处于高电平期间,SDA处于稳定状态;SCL处于低电平期间,SDA变成要保持的状态等SCL拉高以后读/写。

问题1:为什么I2C通讯时候,如果双方都是高电平但是不会烧坏?

通过三极管来驱动

①当A输出OUT等于1的时候,SDA等于0

输出OUT等于0的时候,SDA由外部电路决定

①当B输出OUT等于1的时候,SDA等于0

输出OUT等于0的时候,SDA由外部电路决定

相关推荐
薛定谔的悦2 小时前
储能 EMS 的功率策略:从一块电表到一次逆流的 200 毫秒
大数据·linux·能源·储能·bms
Chester_19994 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
新时代牛马5 小时前
Linux 内核入门地图:架构、源码目录与五大子系统
linux·运维·架构
Julien20045 小时前
控制 SELinux 文件上下文
linux·运维·服务器
sulikey6 小时前
Linux Core Dump 完全指南:从原理到实战的崩溃调试手册。什么是core dump?程序报错core dumped怎么办?
linux·服务器·操作系统·调试·coredump
会周易的程序员6 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子6 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化6 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
学习星球8 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
MayZork8 小时前
Windows 与 Linux 下 vcpkg 的安装部署指南
linux·运维·windows