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

学习嵌入式之硬件——I2C

一、I2C

1.定义

        内部集成电路的简称,半双工串行同步通信,是芯片和芯片之间的通信方式;通常只有一个主机,多个从机,采用主从应答的方式

  • 上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA, 另一根是时钟线SCL。这两个信号线都是双向的。
  • 作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发生的数据被总 线上所有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址 相同时,接收方才真正执行相关的指令。
  • 主从应答:命令总是由主机发起,从机应答,如果主机只有一个,叫单主机,两个或两个以上,是多主机,通常情况下为单主机;主机再发命令的时候,所有从机都能收到,从机的回答所有也都能收到;
  • 时钟信号线永远只有主机发;

2.释放总线:

  • 整根线为高电平
  • 释放总线的权利(1)应该由接收方来,谁要接收数据,谁要提前释放总线

3.上拉电阻

  •  IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都 要外接上拉电阻。对于I.MX来说,这个上拉电阻也可以在引脚电器配置中设置。
  • 上拉电阻的作用就是当双方在发1的时候,保证最后线上是1,防止内阻拉低,看过原理图10k

4.I2C时序图:

  • 空闲时,两根线均处于高电平;
  • 每次通信前,发送方首先发送一个“起始”信号,其实信号就是在SCL为高电平 时,SDA发送一个低电平。时钟信号是由主机来控制和发送;
  • 时钟信号线为低电平时,数据信号线可以发生改变,当为高电平时,数据信号线必须保持稳定,接收方要在高电平阶段来采样。
  • 高位先行原则
  • 当发完信号时,接收方需要应答,应答为ACK(0)或者NACK(1)(芯片手册写);
  • 如果后续还有发送数据,就接着应答后面,继续发,依旧遵循上述原则
  • 如果后续没有发送数据,在时钟信号线为高电平时,把数据信号线拉为高电平,从此置空闲状态

每一个从机都有占有一个字节的地址值,而主机发完一个起始信号后,先发从机的地址,地址占7位;最后一个bit,是数据流向位。0:主机发从机收;1:从机发主机收,

5.I.MA6ULL

       I.MX6U 提供了 4 个 I2C 外设,通过这四个 I2C 外设即可完成与 I2C 从器件进行通信I.MX6U
的 I2C 支持两种模式:标准模式和快速模式,标准模式下 I2C 数据传输速率最高是 100Kbits/s,在快速模式下数据传输速率最高为 400Kbits/s。

6.寄存器I2C_I2CR

  • IEN(bit7):I2C 使能位,为 1 的时候使能 I2C,为 0 的时候关闭 I2C;
  • IIEN(bit6):I2C 中断使能位,为 1 的时候使能 I2C 中断,为 0 的时候关闭 I2C 中断;
  • MSTA(bit5):主从模式选择位,设置 IIC 工作在主模式还是从模式,为 1 的时候工作在主模式,为 0的时候工作在从模式;
  • MTX(bit4):传输方向选择位,用来设置是进行发送还是接收,为 0 的时候是接收,为 1 的是发送;
  • TXAK(bit3):传输应答位使能,为 0 的话发送 ACK 信号,为 1 的话发送 NO ACK 信号;
  • RSTA(bit2):重复开始信号,为 1 的话产生一个重新开始信号。

7.寄存器 I2Cx_I2SR 

  • ICF(bit7):数据传输状态位,为 0 的时候表示数据正在传输,为 1 的时候表示数据传输完成;
  • IAAS(bit6):当为 1 的时候表示 I2Cx_IADR 寄存器中的地址是从设备地址。为0表示I2Cx_IADR是自己的地址;
  • IBB(bit5):I2C 总线忙标志位,当为 0 的时候表示 I2C 总线空闲,为 1 的时候表示 I2C 总线忙;
  • IAL(bit4):仲裁丢失位,为 1 的时候表示发生仲裁丢失。仲裁丢失在手册第1455页有说明,如果多个设备同时尝试连接总线,则其中一个成为主设备。硬件会立即将仲裁失败的设备切换到Slave
  • Receive模式 。那么仲裁失败的设备就会产生仲裁丢失,导致此位置位。需要理解的是这种情况一定发生在发送起始位的时候,也就是说在发送完起始位之后应该判断此位是否为1;
  • SRW(bit2):从机读写状态位,当 I2C 作为从机的时候使用,此位用来表明主机发送给从机的是读还是写命令。为 0 的时候表示主机要向从机写数据,为 1 的时候表示主机要从从机读取数据;
  • IIF(bit1):I2C 中断挂起标志位,当为 1 的时候表示有中断挂起,此位需要软件清零;
  • RXAK(bit0):应答信号标志位,无论作为主机还是从机,为 0 的时候表示接收到 ACK 应答信号,为1 的话表示检测到 NO ACK 信号。

8.寄存器I2Cx_I2DR

        这是 I2C 的数据寄存器,此寄存器只有低 8 位有效,当要发送数据的时候将要发送的数据写入到此寄存器
注意:此时LSB代表的是数据流向,需要按照实际情况设置为1或者0;如果要接收数据的话
          直接读取此寄存器即可得到接收到的数据

二、电可擦存储器

1.时序图

(1)写8个bit数据

(2)连续写数据

写操作:首先主从机释放总线处于空闲状态,主机在clk处于高电平时,将sda电平拉高,发送起始位。接着主机发送8个bit的设备地址,第8位为数据流向位(0为主机写,1为主机读),从机收到后会发送ACK应答。主机收到从机的应答后,再发送寄存器的地址位,从机收到后发送ACK应答;之后主机发送数据,从机收到后发送ACK应答。主机发送完之后在clk位高电平时拉高电平发送停止位。

(3)当前位置发数据给主机

(3)主机从指定位读

读操作:主机先发送起始位,之后发送8位的设备地址,其中第8个bit写操作,从机收到发送ACK应答,主机再发送寄存器地址,从机回复ACK应答。之后主机会重发设备地址,但第8bit为读操作,从机收到回复ACK应答,从机发送数据,主机收到后回复ACK,主机在最后一个数据字节后回复NACK表示结束,之后主机发送停止位。

  • 如果最后主机回应NACK是从机不发了,如果主机发ACK的话,就继续发

三、I2C原理

1.总原理图

  • 作为发送方,是否要检测对面回应的ACK;
  • 作为接收方,回应的是ACK/NACK;

  • 一般用于停止位是否发送并且置1成功

四、I2C操作流程

1.初始化的流程图、写设备、读设备流程图

五、逻辑分析仪

http://www.dtcms.com/a/333648.html

相关文章:

  • Redis7学习--管道
  • P4069 [SDOI2016] 游戏 Solution
  • “社保新规”9月施行,内容、影响与时代意义
  • Ansible 学习笔记:变量事实管理、任务控制与文件部署
  • 分布式锁的具体实现和原理分析
  • 无线收发模块高效协同:EMS系统监控、交互、执行端同步通讯
  • SpringCloud学习
  • 现金流分析与预测提示词设计指南:从基础到复杂场景的实用框架
  • IO多路复用底层原理
  • Python中推导式和表达式
  • 基本电子元件:碳膜电阻器
  • 代码随想录二刷之“字符串”~GO
  • 集合车位租售、充电桩共享、二手市场、便民服务的家政服务平台,带源码
  • 数说故事发布全新AI产品:Social Research,免费洞察各行各业趋势,提升营销效率
  • 20250815日记
  • 智慧零碳园区——解读2025 零碳产业园区实施路径规划【附全文阅读】
  • pytorch学习笔记-模型的保存与加载(自定义模型、网络模型)
  • 大白话解析 Solidity 中的防重放参数
  • USENIX Security ‘24 Fall Accepted Papers (1)
  • 归并排序和统计排序
  • 用matlab实现的svdd算法
  • 2025年机械制造、机器人与计算机工程国际会议(MMRCE 2025)
  • gnu arm toolchain中的arm-none-eabi-gdb.exe的使用方法?
  • C#WPF实战出真汁05--左侧导航
  • 日常反思总结
  • 异步开发:协程、线程、Unitask
  • 线性代数 · 直观理解矩阵 | 空间变换 / 特征值 / 特征向量
  • 树莓派开机音乐
  • 模板引用(Template Refs)全解析2
  • CVE-2025-8088复现