当前位置: 首页 > article >正文

OneOS操作系统入门-驱动-03:I2C总线及驱动

一、I2C总线

1.1、I2C总线简介
IIC(Inter-Integrated Circuit) 总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器以及其外围设备。它是由数据线 SDA 和时钟线 SCL 构成的串行总线,可发送和接收数据,在 CPU 与被控 IC 之间、 IC IC 之间进行双向传送。
IIC 总线有如下特点:
(1)总线由数据线 SDA 和时钟线 SCL 构成的串行总线,数据线用来传输数据,时钟线用来
同步数据收发。
(2)总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时
序就可以实现微控制器与器件之间的通信。
(3)数据线 SDA 和时钟线 SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电
压,所以当总线空闲的时候,这两条线路都是高电平。
(4)总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s ,在高速
模式下可达 3.4Mbit/s
(5)总线支持设备连接。在使用 IIC 通信总线时,可以有多个具备 IIC 通信能力的设备挂载
在上面,同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容 400pF 的限制决
定。 IIC 总线挂载多个器件的示意图,如下图所示:
  
1.2、I2C总线协议详解

上图为I2C总线时序图,为了便于大家更好的了解 I2C 协议,从起始信号、停止信号、应答信号、数据有效性、 数据传输以及空闲状态等 6 个方面讲解,大家需要对应上图中的 标号来理解。

① 起始信号
SCL 为高电平期间, SDA 由高到低的跳变。起始信号是一种电平跳变时序信号,而不是 一个电平信号。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。
② 停止信号
SCL 为高电平期间, SDA 由低到高的跳变。停止信号也是一种电平跳变时序信号,而不是一个电平信号。该信号由主机发出,在停止信号发出后,总线就处于空闲状态。
③ 应答信号
发送器每发送一个字节,就在时钟脉冲 9 期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK ),一般表示接收器接收该字节没有成功。观察上图标号③就可以发现,有效应答的要求是从机在第 9 个时钟脉冲之前的低电平期间将 SDA 线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主机,则在它收到最后一个字节后,发送一个 NACK 信号,以通知被控发送器结束数据发送,并释放 SDA线,以便主机接收器发送一个停止信号。
④ 数据有效性
IIC 总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。数据在 SCL 的上升沿到来之前就需准备好。并在下降沿到来之前必须稳定。
⑤ 数据传输
I2C 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在 SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。
⑥ 空闲状态
IIC 总线的 SDA SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

了解前面的知识后,下面介绍一下 IIC 的基本的读写通讯过程,包括主机写数据到从机即写操作,主机到从机读取数据即读操作。下面先看一下“写”操作通讯过程图:

主机首先在 IIC 总线上发送起始信号,那么这时总线上的从机都会等待接收由主机发出的数据。主机接着发送从机地址+0(写操作)组成的 8bit 数据,所有从机接收到该 8bit 数据后,自行检验是否是自己的设备的地址,假如是自己的设备地址,那么从机就会发出应答信号。主机在总线上接收到有应答信号后,才能继续向从机发送数据。

注意:IIC 总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

下面讲解“读”操作:
  主机向从机读取数据的操作,一开始的操作与写操作有点相似,观察两个图也可以发现, 都是由主机发出起始信号,接着发送从机地址+1( 读操作 ) 组成的 8bit 数据,从机接收到数据验 证是否是自身的地址。 那么在验证是自己的设备地址后,从机就会发出应答信号,并向主机返回 8bit 数据,发送完之后从机就会等待主机的应答信号。假如主机一直返回应答信号,那么从 机可以一直发送数据,也就是图中的(n byte + 应答信号)情况,直到主机发出非应答信号,从机才会停止发送数据。

二、I2C驱动

2.1、I2C驱动作用

I2C驱动是操作系统或固件中的软件组件,它提供了与I2C硬件接口交互的抽象层。驱动的主要作用包括:

(1)设备初始化:配置I2C设备的寄存器,设置通信参数,如速度、地址和中断。

(2)数据传输:实现数据发送和接收的功能,包括启动条件、写入和读取数据。

(3)地址管理:管理I2C总线上设备的地址,确保正确识别和通信。

(4)错误处理:检测和处理通信错误,如超时、应答错误和数据冲突。

(5)中断管理:处理I2C设备的中断请求,如数据传输完成、错误发生等。

(6)流控制:实现I2C协议的流控制机制,确保数据传输的可靠性。

(7)多主机管理:在多主机环境中管理总线访问,避免冲突。

(8)设备发现:扫描I2C总线,发现并识别连接的设备。

(9)电源管理:控制设备的电源状态,如进入低功耗模式。

2.2、I2C驱动的实现

I2C驱动通常包括以下组件:

(1)硬件抽象层(HAL):提供与特定硬件平台相关的接口。

(2)设备驱动模型:操作系统提供的框架,用于管理设备的生命周期和状态。

(3)中断服务例程(ISR):处理I2C设备的中断事件。

(4)API接口:提供给应用程序的接口,用于执行I2C操作,如读写数据。

(5)数据缓冲区:用于存储I2C通信过程中的临时数据。

(6)配置和状态寄存器:用于控制I2C设备的行为和状态。

I2C驱动是嵌入式系统和物联网设备中不可或缺的部分,它使得设备能够通过简单的串行接口进行高效的数据交换。随着技术的发展,I2C协议已经成为许多微控制器和传感器的标准通信接口。

2.3、I2C与ICC协议对比

特性

IIC (I2C)

I2C (I2C V2)

版本

第一代

第二代

速度

标准模式:100 kbps<br>快速模式:400 kbps<br>高速模式:3.4 Mbps

标准模式:100 kbps<br>快速模式:400 kbps<br>高速模式:3.4 Mbps<br>超高速模式:5 Mbps或更高

地址长度

通常7位或10位

通常7位或10位

多主机支持

支持,但同一时间只能有一个主机控制总线

支持,允许多个主机更灵活地控制总线

总线仲裁

基本仲裁机制

改进的仲裁机制,减少总线冲突

流控制

基本流控制

增强的流控制,包括超时和重传机制

信号线

两条:SDA(数据线)和SCL(时钟线)

两条:SDA(数据线)和SCL(时钟线)

应用范围

较广泛的应用,特别是在低速通信场合

适用于高速通信和更复杂的系统


http://www.kler.cn/a/461201.html

相关文章:

  • C++面向对象编程:纯虚函数、抽象类、虚析构、纯虚析构
  • AngularJS 过滤器:提升用户体验的数据处理利器
  • AcWing练习题:差
  • 如何使用Python自动化发送消息:用pynput库批量输入并发送文本
  • 二、AI知识(神经网络)
  • 算法——回溯模式
  • java实现excel导入参考资料合集
  • Zookeeper在中间件的应用和在Spring Boot业务系统中实现分布式锁和注册中心的解决方案
  • CT 扫描显示 USB-C 电缆可能隐藏复杂的恶意硬件
  • 强化学习方法分类详解
  • 电脑cxcore.dll文件缺失怎么办?cxcore100.dll缺失问题解决办法
  • svn不能添加.a文件
  • 从零开发一套UWB定位系统需要多长时间?UWB超宽带定位系统源码
  • 计算机网络•自顶向下方法:IP分片与重组
  • Dell服务器升级ubuntu 22.04失败解决
  • 基于Django+python的Python在线自主评测系统设计与实现
  • caddyfile如何托管静态文件,首页默认为index.html
  • 如何在谷歌浏览器中创建安全的密码
  • 深入理解 pytest Fixture 方法及其应用
  • Java子线程无法获取Attributes的解决方法
  • 【Linux】基础IO-----软硬链接与动静态库
  • docker安装Home Assistant正常下载笔记
  • el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)
  • 怎么在家访问公司服务器?
  • C# 实用工具分享(1)
  • 数据库数据类型对比