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

I2C

任何一个CPU要和某个设备交互,就需要使用某种双方约定好的通信协议。这种通信协议,从OSI七层计算机网络架构上来说,从最高层应用层的HTTP,传输层的TCP,到底层数据链路层的I2C,SPI,CAN等。本文来介绍I2C协议,这是本科刚开始学嵌入式时就接触到的非常基础的东西了,工作后在这回顾整理一下。

MCU用这种协议来和存储器等外部设备通信,是一种低速、简单的协议,只有一根时钟线和一根数据线。数据线 SDA 和时钟线 SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电压,所以当总线空闲的时候,这两条线路都是高电平。总线上数据的传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达3.4Mbit/s。把某个外设挂载到I2C总线上,MCU就能使用I2C协议和这个外设通信。

一个MCU可能要和多个外设通信,因此需要知道外设地址。知道了地址之后,就可以使用I2C读写时序来发出信号、和外设通信了。
image

时序

MCU准备发送数据,先要告知外设:“我要发数据了,你准备好接收”。
当 SCL 为高电平期间,SDA 从高电平跳到低电平。该信号由主机发出,在起始信号产生后,总线就处于被占用状态,准备数据传输。

接着开始传输数据。进行数据传送时,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。时钟信号为高电平期间,数据线上的数据必须保持稳定。I2C数据每传输一个字节,就在下一个时钟脉冲期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位( ACK 简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

发送完成之后,MCU要告知外设:“我说完了”。当 SCL 为高电平期间, SDA 由低到高跳变,就表达了这个意思。在停止信号发出后,总线就处于空闲状态。

IIC 总线的 SDA 和 SCL 两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

这里还有一个问题是,MCU怎么告诉设备要读/写设备上哪个地址的数据?一般在发送设备地址后会发送设备的内存地址,然后再结合设备属性进行单字节操作或单页操作等。一般根据应答/非应答信号确定是否继续。

写时序

整体的写时序如下

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

image

读时序

读时序如下

依然是MCU发出起始信号,接着发送从机地址+1(读操作)组成的 8bit 数据,从机接收到数据验证是否是自身的地址。验证是自己的设备地址后,从机就会发出应答信号,并向主机返回 8bit 数据,发送完之后从机就会等待主机的应答信号。假如主机一直返回应答信号,那么从机可以一直发送数据,就是图中的(n byte + 应答信号)情况,直到主机发出非应答信号,再发送停止信号,从机才会停止发送数据。

image

http://www.vanclimg.com/news/953.html

相关文章:

  • 小新Pad2022刷机记录
  • 最左前缀原则和覆盖索引相关问题
  • 【LeetCode 142】算法:环形链表 II
  • Gin框架介绍
  • 正则表达式中的元字符
  • sequence的启动
  • L. Dynamic Convex Hull 题解
  • 实时通信技术深度对比:WebSocket与SSE的最佳实践(1018)
  • 微服务架构的轻量级解决方案(6064)
  • WebSocket服务端的高效处理(1104)
  • 服务端推送技术的现代实现(6185)
  • 异步编程在Web开发中的应用(1191)
  • 从零开始构建高性能实时聊天系统:Hyperlane框架实战指南(3242)
  • 中间件架构设计模式:从Express到现代Rust框架的演进(4232)
  • 中间件架构的优雅实现(8032)
  • Rust异步Web框架性能突破之路(1499)
  • 实战项目:文件分块上传系统(5527)
  • spring-data-JPA代码审计
  • 不同Linux发行版Node安装指南
  • 虚化引擎游戏解包工具
  • Qcom dcvs_epss.c 驱动解析.
  • AirSim+PX4+QGC实现无人机自动避障
  • js基础第五天
  • 简单了解高阻抗(High-Z)
  • docker安装
  • 二进制简史:从理论到芯片
  • js基础第四天
  • 同时点亮LED、数码管以及点阵
  • 关于跨域的一点新理解
  • js基础第三天