硬件IIC模式转自:https://blog.csdn.net/dingyc_ee/article/details/99870758

本文主要是介绍硬件IIC模式转自:https://blog.csdn.net/dingyc_ee/article/details/99870758,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 IIC进入主模式的步骤:

在主模式时,I 2 C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停
止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。
以下是主模式所要求的操作顺序:
● 在I2C_CR2寄存器中设定该模块的输入时钟以产生正确的时序
● 配置时钟控制寄存器
● 配置上升时间寄存器
● 编程I2C_CR1寄存器启动外设
● 置I2C_CR1寄存器中的START位为1,产生起始条件

2 作为主机发送器时的传送时序图

主发送器发送流程及事件说明如下:
(1) 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1,表示起始信号已经发送;

 EV5事件:

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

EV6事件:

EV8_1事件

(3) 以上步骤正常执行并对 ADDR 位清零后,我们往 I2C 的“数据寄存器 DR”写入要发送的数据,然后DR会将数据转移到移位寄存器,移位寄存器将数据通过SDA线一位一位的发送。一旦DR的数据转移到了移位寄存器,就会产生EV8事件:

EV8事件:EV8:TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件。值得注意的是,EV8事件必须在当前字节传输完成前清除,为什么?因为如果没有及时清除,就说明没有新的数据填入DR,此时会是发送完成的状态(即EV8_2),然后系统就会产生停止信号了。

如何消除EV8事件?

可以看到,EV8事件其实就是连续用于写入数据的。当发送数据时(DR已经转移到移位寄存器,且无新写入数据),EV8事件会一直持续,所以我们可以往DR再传入一个数据,来消除EV8事件。而其他的事件,会一直拉低SCL,不发送时钟信号,直到我们处理完对应的事件。

所以,当发送单个数据时,由于没有新的数据写入DR,会在这个单数据发送后BTF = 1,此时TXE = 1,产生EV8_2事件,然后继续发送停止信号。当连续发送时,不断的往DR写入数据,这会清除掉BTF标志,只有当最后一个数据时,才会产生EV8_2。

(4) 当我们发送数据完成后,控制 I2C 设备产生一个停止信号(P),这个时候会产生EV8_2 事件,SR1 的 TXE位及 BTF位都被置 1,表示通讯结束。

按照寄存器描述,BTF位实际上做的是如下工作:在移位寄存器将数据全部发送完成时判断DR是否有数据,如果没有,那就代表这已经是最后一个数据了,所以此时字节发送结束。

3 作为主机接收器时的传输时序

主接收器接收流程及事件说明如下:
(1) 同主发送流程,起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对 SR1寄存器的“SB”位置 1,表示起始信号已经发送;

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

这里存在一些难以理解的地方,接下来是个人的理解,可能会有错误,欢迎指正。

首先是EV6_1事件:中文参考手册中说到,要清除响应和停止条件的产生位。清除响应很好理解(就是在接收到一个数据后不应答),此时发送器就不会再发送数据。但是为什么要清除停止条件的产生位?应该是要设置停止位才对啊

对于这个问题,最好的答案就是英文参考手册,其实中文参考手册在这里是错误的,真的无语了,以下是英文参考手册,如何设置说的非常清楚。

如果只接收一个字节的数据,在EV6事件后,马上设置关闭应答使能,以及产生停止条件,这些设置都必须在当前传输的ACK到达之前完成(如果没有,就容易出现数据错误),这也是硬件IIC的一个缺点吧,整个硬件IIC的详细分析就到此结束了。

这篇关于硬件IIC模式转自:https://blog.csdn.net/dingyc_ee/article/details/99870758的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639863

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“