嵌入式—— IIC

目录

一、初识IIC

1. 介绍

2. 理解

二、IIC的简单拆分

1. 物理层

特点:

2. 协议层

(1)IIC基本读写过程

具体过程描述:

(2)通信的起始和停止信号

(3)数据有效性

(4)地址及数据方向

(5)响应

四、IIC架构拆解

1. 通信引脚

2. 时钟控制

3. 数据控制逻辑

4. 整体控制逻辑

四、通信过程

1. 主发送器发送流程

2. 主接收器接收流程


一、初识IIC

1. 介绍

        IIC通信协议是由Philips公司开发的,提供多主机功能,控制所有IIC总线特定的时序、协议、仲裁和定时。由于不需要使用USART、CAN等通信协议的外部收发设备,现在被广泛地用于系统内多个集成电路间的通信

2. 理解

        对于IIC通信协议,最基本的可以把它分为物理层和协议层物理层规定通信系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体中的传输。协议层主要规定通信逻辑,统一收发双方的数据打包、解包标准。

        简单来说,物理层规定我们是用嘴巴还是用肢体来交流,协议层则规定我是用中文还是英文来交流。

二、IIC的简单拆分

1. 物理层

特点:

    ① 它是一个支持设备的 总线(指多个设备共用的信号线)。在一个IIC通信总线中,可连接多个 IIC通信 设备,支持 多个通信主机 及 多个通信从机。

    ② 一个IIC总线只使用 两条总线线路,一条 双向串行数据线(SDA),用来 示数据一条 串行时钟线(SCL),用于 同步数据的收发

    ③ 每个连接到总线的设备都有 一个独立的地址,主机可以利用这个地址进行 不同设备之间的访问

    ④ 总线通过 上拉电阻接到电源。当 IIC设备空闲 时,会 输出高阻态,而当所有设备都空闲,都 输出高阻态时,由 上拉电阻把总线拉成高电平

    ⑤ 多个主机 同时使用总线时,为了 防止数据冲突,会利用 仲裁方式 决定由哪个设备占用总线。

    ⑥ 具有 3种传输模式标准模式传输速率为 100kbps,快速模式为 400kbps,高速模式可达 3.4Mbps(目前 大多IIC设备 尚不支持高速模式)。

    ⑦ 连接到相同总线的 IIC数量 受到 总线的 最大电容400pf 限制。

2. 协议层

        IIC的协议定义了通信的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。

    主机和从机 通信时,SDA线 的数据包 序列

(1)IIC基本读写过程

        S表示由 主机的IIC接口 产生的传输起始信号,这时连接到IIC总线上的所有从机都会接收到这个信号。

        起始信号产生后,所有从机就开始等待主机广播从机地址信号 (SLAVE_ADDRESS)。在IIC总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会 忽略之后的数据信号。根据 IIC协议,这个 从机地址可以是7位或10位

        在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是 由主机传输至从机,即主机向从机写数据。该位为 1 时,则相反,即 主机由从机读数据

        从机接收到匹配的地址后,主机或从机 会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

具体过程描述:

① 写数据

        若配置的方向传输位 为“写数据” 方向。广播完地址,接收到应答信号后,主机开始正式 向 从机传输数据(DATA)数据包 的大小为 8位主机每发送完 一个字节数据,都要等待从机的 应答信号(ACK),然后 重复这个过程。可以向从机传输 N个数据, N没有 大小限制。当数据传输结束时,主机向从机发送一个 停止传输信号(P),表示不再传输数据。

② 读数据

        若 配置的方向传输位 为“读数据” 方向。广播完地址,接收到应答信号 后,从机开始 向主机 返回数据(DATA)数据包大小为 8位从机每发送完 一个数据,都会 等待主机的应答信号(ACK),然后 重复这个过程。可以返回 N个数据,N 没有 大小限制。当主机希望   停止接收数据时,就 向从机返回一个 非应答信号(NACK),则 从机自动停止数据传输

③ 读和写数据

        除了 基本的读写,IIC通信更常用的是 复合格式。该传输过程 有 两次起始信号(S)。一般在 第 1次传输 负责告诉从机读写地址,主机 通过 SLAVE_ADDRESS 寻找到 从设备后,发送一段 “数据 ”,这段 数据 通常 用于 表示 从设备 内部的寄存器或存储器地址( 与SLAVE_ADDRESS不同 );在 第 2 次 的传输中 负责 读写的 实际内容,即 对该地址的 内容进行 读或写。

(2)通信的起始和停止信号

        当 SCL线 是高电平时 SDA线 从高电平向低电平切换,表示通信的起始。当SCL是高电平时SDA线由低电平向高电平切换,表示通信的停止

    起始和停止信号一般由主机产生。

(3)数据有效性

        IIC使用SDA信号线来传输数据,使用SCL信号线进行数据同步SDA数据线在SCL的每个时钟周期传输一位数据。传输时,SCL为 高电平的时候 SDA表示的 数据有效,即此时的SDA为高电平时表示数据‘1’,为低电平时表示数据‘0’。当SCL 为 低电平时 SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。

    每次数据传输都 以字节 为单位,每 次传输的字节数不受限制。

(4)地址及数据方向

        IIC总线上的每个设备都有自己的独立地址,主机发起通信时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。IIC协议 规定设备地址可以是 7位 或 10位 7位的 地址应用比较广泛 )。紧跟设备地址的一个数据位用来表示数据传输方向,它是 数据方向位(R/W)( 第8位 或 第11位 )。数据方向位为 ‘1’ 时表示主机由从机读数据,该位为 ‘0’ 时表示主机向从机写数据。

        读数据方向时,主机会释放对SDA信号线的控制,由 从机控制 SDA 信号线,主机 接收信号;写 数据方向时,SDA 由 主机控制,从 机接收信号

(5)响应

        IIC的数据和地址传输都带响应。响应包括“应答”(ACK)和“非应答”(NACK)两种信号。作为数据接收端时,当设备(无论主从机)接收到 IIC传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答”(ACK)信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答”(NACK)信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。

        传输时 主机产生时钟,在第 9个 时钟时,数据发送端会 释放 SDA的 控制权,由 数据接收端控制 SDA,根据需要将其拉低或拉高。若SDA为高电平,表示 非应答信号( NACK ),低电平表示应答信号 ( ACK)。

四、IIC架构拆解

1. 通信引脚

        IIC的所有硬件架构都是根据 SCL线和SDA线展开的(SMBA线用于 SMBus的警告 信号,IIC通信中不使用 ),STM32芯片有多个 IIC外设,它们的 IIC通信信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚。

2. 时钟控制

        SCL线的时钟信号,由IIC接口根据时钟控制寄存器CCR控制,控制的参数主要为时钟频率。配置PC的CCR寄存器可修改通信速率相关的参数。

3. 数据控制逻辑

        IIC的SDA 信号主要 连接到数据移位寄存器上,数据移位寄存器的数据来源及目标数据寄存器(DR)、地址寄存器(OAR) 、PEC寄存器以及SDA数据线

        当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去;当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。

        若使能了 数据校验,接收到的数据会经过 PEC计算器 运算,运算结果存储在 “ PEC寄存器”中。

        当 STM32的 IIC 工作在 从机模式 的时候,接收到 设备地址 信号时,数据移位寄存器   会把接收到的 地址 与STM32 自身的 “ IIC地址寄存器 ” 的值 作比较,以便 响应主机的寻址。STM32的 自身的 IIC地址 可通过 “ 自身 地址 寄存器 ” 修改,支持 同时使用 两个 IIC设备地址,两个地址 分别存储在 OAR1和 OAR2 中。

4. 整体控制逻辑

        负责协调整个PC外设。工作模式根据自己配置的控制寄存器 CR1/CR2的参数而改变。

        在外设工作时,控制逻辑会根据外设的工作状态修改状态寄存器 SR1和SR2,只要读取这些寄存器相关的寄存器位,就可以了解IIC的工作状态。

        控制逻辑 还 根据要求,控制 产生 IIC中断信号、DMA 请求及各种 IIC的 通信 信号(起始、停止、应答信号等)。

四、通信过程

        使用IIC外设通信时,在通信的不同阶段会对状态寄存器SR1/SR2的不同数据位写入参数,可以通过读取这些寄存器标志来了解 通信状态

1. 主发送器发送流程

(1)控制产生起始信号(S),当发生起始信号后,它产生事件EV5,并会对SR1寄存器的SB位置1,表示起始信号已经发送。

(2)发送设备地址并等待应答信号。若有从机应答,则产生事件EV6 及 EV8,这时 SR1寄存器的ADDR位及TxE位被置1( ADDR置1表示地址已经发送,TXE置1表示数据寄存器为空 )。

(3)上述步骤正常执行并对ADDR位清零后,往 IIC的数据寄存器DR 写入要发送的数据,这时TxE位 会被重置 0,表示数据寄存器非空IIC外设通过 SDA信号线一位位 把数据发送出去后,又会产生EV8事件,即 TXE位 被置1( 重复这个过程,就可以发送多个字节数据 )。

(4)发送了足够的数据后,设置 控制寄存器 CR1 的 STOP 位,这种情况下,当 IIC发送了最后一个数据后会产生EV8_2事件SR1 的TxE 位及BTF位 都被置1,然后 IIC总线 产生一个停止信号(P),表示通信结束。

        假如 使能了 IIC 中断以上 所有事件产生时,都会 产生 IIC 中断信号,进入 同一个中断 服务函数。进入 IIC中断 服务程序后,再 通过 检查 寄存器 位来 判断 是哪 一个事件。

2. 主接收器接收流程

(1)起始信号(S)由主机端产生控制发生起始信号,同时产生事件EV5,并对SR1寄存器的SB位 置1,表示起始信号已经发送。

(2)发送设备地址并等待应答信号,若有从机应答,则产生事件EV6,这时 SR1寄存器的ADDR位被置1,表示 地址已经发送。

(3)从 机端 接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生EV7事件SR1寄存器的RxNE 被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可 控制 IIC 发送 应答信号(ACK) 或非应答信号(NACK)( 若应答则重复以上步骤接收数据,若非应答则停止传输 )。

(4)发送非应答信号后,产生停止信号(P)结束传输。


                                                                                                                        后面再进行补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/367052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模拟请求ElasticSearch

Step1 安装chrome的这个插件 Step2 打开插件,GET的json填什么。 在IDEA的debug模式,走到Java代码的searchBuilder, 在这个searchBuilder变量里,对里面query变量点右侧 view按钮, IDEA里会显示出一个json&#xff…

带着问题读源码——Spring MVC是怎么找到接口实现类的?

引言 我们的产品主打金融服务领域,以B端客户为我们的核心合作伙伴,然而,我们的服务最终将惠及C端消费者。在技术实现上,我们采用了公司自主研发的微服务框架,该框架基于SpringBoot,旨在提供高效、可靠的服…

10MHz 到 80MHz、10:1 LVDS 并串转换器(串化器)/串并转换器(解串器)MS1023/MS1224

产品简述 MS1023 串化器和 MS1224 解串器是一对 10bit 并串 / 串并转 换芯片,用于在 LVDS 差分底板上传输和接收 10MHz 至 80MHz 的并行字速率的串行数据。起始 / 停止位加载后,转换为负载编 码输出,串行数据速率介于 120Mbps…

优化:Dynamo根据构件坐标XY值排序

Hello 大家好!我是九哥~ 前一阵群里有个小伙伴咨询如何按 XY 坐标给桩编码,当时呢也没过多思考,就把常规的逻辑告诉他了,利用 Dynamo 自带的 List.SortByKey 节点,根据族放置坐标的 XY 值进行两次排序,就能…

跟着cherno手搓游戏引擎【19】抽象纹理

引入: 导入stb_image: GitHub - nothings/stb: stb single-file public domain libraries for C/C 下载复制stb_image.h的内容(8000多行),然后粘到如图位置 stb_image.cpp: #include"ytpch.h" #define STB_IMAGE_IM…

面试八股文(3)

文章目录 1.HashSet如何检查重复2.comparable和Comparator区别3.ConcurrentHashMap和Hashtable区别4.线程和进程5.并发与并行的区别6.为什么使用多线程7.使用多线程可能带来问题8.线程的生命周期和状态9.什么是上下文切换10.线程死锁11.产生死锁四个条件12.如何避免死锁 1.Hash…

双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。 1、295. 数据流的中位数 手写堆实现: 加入元素: 如何维护一个中位数?我们考虑一下堆的特点,大顶堆堆顶是一个最大值,小顶堆堆顶是一个最小值,那么,如果我们可以把数…

NUXTJS安装始终报错无法正常运行问题解决

近日在了解NuxtJS,按照官方给出方法进行安装后,不是报错,就是安装成功后运行不了。执行npm run dev后始终运行出错,判断肯定是对应版本问题,沿着这方向研究,最终运行成功了。 文档地址:安装 - …

【C++初阶】--入门基础(一)

目录 一.命名空间 1.前言引入 2.namespace关键字 (1)前言 (2)域作用限定符 :: (3)命名空间域namespace ① 细节理解 ② 命名空间的名称相同 ③命名空间的嵌套 (4)命名空间的使用 ① 加命名空间名称及作用域限定符 ②使用using将命名空间中某个成员引入 ③ 使用u…

【内置对象·js】

数学对象 document.write("圆周率为 " Math.PI "<br>");日期对象 var date new Date(); // 实例化 Date 对象var month date.getMonth() 1; // 获取月份&#xff0c;取值为 0&#xff08;一月&#xff09;到 11&#xff08;十二月&#xff09;之…

某站平台的签名算法分享

先charles抓包&#xff0c;api.xxxxxx.com域名的包 分析包 看到路径参数如下 appkey1d8b6e7d45233436&build5531000&channeldw056&mobi_appandroid&mode0&oid326052200&plat2&platformandroid&ps20&statistics%7B%22appId%22%3A1%2C%22p…

Redis核心技术与实战【学习笔记】 - 16.Redis 缓存异常:缓存和数据库不一致

概述 只要使用 Redis 缓存&#xff0c;就必须面对缓存和数据库的一致性问题。 重要的是&#xff0c;如果数据不一致&#xff0c;那么业务应用从缓存中读取的数据就不是最新数据&#xff0c;这会导致严重的问题。比如说&#xff0c;我们把电商商品的库存信息缓存在 Redis 中&am…

机器学习_13_SVM支持向量机、感知器模型

文章目录 1 感知器模型1.1 感知器的思想1.2 感知器模型构建1.3 损失函数构建、求解 2 SVM3 线性可分SVM3.1 线性可分SVM—概念3.2 线性可分SVM —SVM 模型公式表示3.3 线性可分SVM —SVM 损失函数3.4 优化函数求解3.5 线性可分SVM—算法流程3.6 线性可分SVM—案例3.7 线性可分S…

如何读论文

如何读论文 0. 目的 单篇文章从头读到尾&#xff0c;可以&#xff1b; 世界上那么多篇文章&#xff0c; 都这样读&#xff0c; 时间上划不来。 适合你的文章就那么一小撮。 paper 的八股文结构&#xff1a; titleabstractintromethodexpconclusion 1. 第一遍 海选&#…

HiveSQL题——聚合函数(sum/count/max/min/avg)

目录 一、窗口函数的知识点 1.1 窗户函数的定义 1.2 窗户函数的语法 1.3 窗口函数分类 聚合函数 排序函数 前后函数 头尾函数 1.4 聚合函数 二、实际案例 2.1 每个用户累积访问次数 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 各直播间最大的同时在线人数 …

计算视图里的projection和aggregation节点区别

Projection 和 Aggregation到底有什么区别&#xff1f; 看名字就能看出来的。 那么在什么场景下用呢&#xff1f; 1. Projection就是投影&#xff0c;也就是说你本来的源里有什么&#xff0c;就直接给你拿出来。 除了这个&#xff0c;它使用的场景就是&#xff1a; 只映射需…

Framework - ActivityThread 应用启动UI渲染流程

一、概念 ActivityThread拥有 main(String[] agrs) 方法&#xff0c;作为程序的入口&#xff0c;是应用程序的初始化类。&#xff08;ActivityThread不是主线程&#xff0c;它在 main() 方法中实例化&#xff0c;是运行在主线程中。&#xff09;ApplicationThread是 ActivityT…

解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例&#xff1a; 1.1 实现代码1&#xff1a;列数为常量 运行结果&#xff1a; 1.2 实现代码2&#xff1a;列数为变量 运行结果&#xff1a; 1.示例&#xff1a; 开发需求&#xff1a;读取Excel文件&#xff0c;统计第3列到第5列中每列的"False"字段占…

STM32SPI通信协议--(2)W25Q64简介

一、W25Q64简介 1、W25Qxx中的xx是不同的数字&#xff0c;表示了这个芯片不同的存储容量&#xff1b; 2、存储器分为易失性与非易失性&#xff0c;主要区别是存储的数据是否是掉电不丢失&#xff1a; 易失性存储器&#xff1a;SRAM、DRAM&#xff1b; 非易失性存储器&#xff…

django+flask+python高校教材管理系统47nia

本.4论文结构 绪论&#xff1a;剖析项目可行性&#xff0c;表明研究方向。 开发技术&#xff1a;系统关键运用了Python技术性、Django框架、B/S架构和myspl数据库查询&#xff0c;并进行了详细介绍[6]。 系统分析&#xff1a;包含系统的总体构造&#xff0c;用例图和结构图。 系…
最新文章