当前位置: 首页 > 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.lryc.cn/news/622440.html

相关文章:

  • 系统介绍pca主成分分析算法
  • C语言:指针(5)
  • 智能指针:C++内存管理的利器
  • c++程序示例:多线程下的实例计数器
  • [HDCTF 2023]Normal_Rsa(revenge)
  • 主流开源实时互动数字人大模型
  • 读书笔记-积极心理学 《心流,最优体验心理学》
  • 条件变量的基本介绍与有界缓冲区问题
  • 小红书帖子评论的nodejs爬虫脚本
  • 补充日志之-配置文件解析指南(Centos7)
  • CAXA电子图板2026(国产CAD之光)
  • 机器学习之PCA
  • pyqt5无法显示opencv绘制文本和掩码信息
  • OpenCV 阈值处理
  • 应用侧华为云LoTDA设备接入平台
  • 重塑工业设备制造格局:明远智睿 T113-i 的破局之道
  • IgH初始化--未接从站
  • 【160页PPT】机械行业数字化生产供应链产品解决方案(附下载方式)
  • 光伏工单智能管理,故障处理快人一步
  • 状态流程框架(cola-component-statemachine)
  • WinForm 简单用户登录记录器实现教程
  • 五、ZooKeeper、Kafka、Hadoop、HBase、Spark、Flink集群化软件的部署
  • Sui 主网升级至 V1.53.2
  • 【DDIA】第三部分:衍生数据
  • 俄罗斯信封套娃问题-二维最长递增子序列
  • day29-进程和线程(2)
  • python自学笔记9 Seaborn可视化
  • 47.分布式事务理论
  • Elasticsearch:使用 Gradio 来创建一个简单的 RAG 应用界面
  • LeetCode刷题记录----236.二叉树的最近公共节点(medium)