STM32 IIC

news2024/11/28 18:44:36

第一块:介绍协议规则,然后用软件模拟的形式来实现协议,
第二块:介绍STM32的IIC外设,然后用硬件来实现协议

因为IIC是同步时序的额,软件模拟协议也非常方便,像我们单片机一样,外挂芯片里的众多外设也是通过读写寄存器来控制运行的,寄存器本身也是存储器的一种,,这个芯片多有的寄存器也是都被分配到了一个线性的存储空间,如果我们想要读写寄存器来控制硬件电路,我们就至少需要定义两个字节数据,一个字节是要读写哪个寄存器,也就是寄存器的地址,另一个地址就是这恶鬼地址下寄存器存的内容,写入内容就是控制电路,读出内容就是获取电路的状态,这整个流程和单片机CPU操作外设的原理一样的,单片机读写自己的寄存器可以通过内部的数据总线来实现,直接用指针就可以了,不需要我们操心,但是这个模块的寄存器在单片机的外面,你要是直接把单片机内部的数据总线拽出来,把两个芯片合为一体,那可能不太实现,所以现在大公司找到你,要求你给他设计一种通信协议,在单片机和外部模块连接少量几根线,实现单片机读写外部模块寄存器的功能。

异步时序在单片机运行过程中,单片机有事进入中断了,时序能不能暂停一下,接收方不知道可能导致数据出错,异步时序非常依赖硬件外设的支持。
同步时序能极大的降低单片机对硬件电路的依赖,即使没有硬件电路的支持,也可以很方便的用软件手动反转电平来实现通信,比如软件模拟IIC。如果设计能实现项目要求,符合电路原理,性能和稳定性好,如果能有大公司帮忙推广,得到了广泛认可,那以后学习的就是自己设计的通信协议了。
至少要实现在指定位置读寄存器和写寄存器,这两个功能,

在这里插入图片描述
单片机作为主机,主导IIC总线的运行,挂载在IIC总线的所有外部模块都是从机,从机只有被主机点名之后才能控制IIC总线,不能在未经允许的情况下碰IIC,防止冲突,这就像是在教室里,老师是主机主导课堂的运行,所有从机可以被动地听老师讲课,但是从机只有在被老师点名之后才能说话,我们使用IIC的绝大多数场景都是一主多从的形式,多主多从的模型在总线任何一个模块都可以主动跳出来,说接下来我就是主机,你们都得听我的,,这就像是在教室里,老师正在讲课,突然有个学生站起来说,老师打断一下,接下来让我说,所有同学听我指挥,这时就相当于发生了总线冲突,仲裁胜利的一方获取总线控制权,失败的一方自动变回从机,当然由于时钟线也是由主机控制的,所以多主机的模型下,还要进行时钟同步,多主机的情况下,协议是比较复杂的,感兴趣自行了解,

一般使用一主多从。
作为一个通信协议,必须要在硬件和软件上,都作出规定,硬件上就是电路应该如何连接,端口的输入输出模式都是什么样的,时序如何定义,字节如何传输,高位先行还是低位先行,一个完整的时序由哪些部分构成,硬件的规定和软件的规定配合起来,就是一个完整的通信协议。

任何时候,都是主机完全掌控SCL线,另外在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机,这就是主机的权力

在这里插入图片描述
从机不允许主动发起对SDA的控制,只有主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地取得SDA的控制权,这就是一主多从模型中协议的规定。
单主机模式下,其实SCL设置成推挽输出没问题。但是仍然采用了开漏加上拉输出的模式,因为多主机模式下会利用这个特征。

通过一个数据缓冲器或者施密特触发器,进行输入。

在这里插入图片描述
IIC总线处于空闲状态时,SCL和SDA都处于高电平状态,也就是没有任何一个设备去碰SCL和SDA,由外挂的上拉电阻拉高至高电平。当主机需要进行数据收发时,首先要打破总线的宁静,产生一个其实条件,把SDA拽下来,产生一个下降沿,当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。然后再SDA下降沿之后,主机要把SCL拽下来,一方面是占用这个总线,另一方面也是为了方便我们这些基本单元的拼接,就是之后我们会保证,除了起始和终止条件每个时序单元的SCL都是以低电平开始,低电平结束,这些单元拼接起来,SCL才能续的上,SCL高电平期间,SDA从低电平切换到高电平,也就是这样,SCL先放手,回弹到高电平,SDA再放手,回弹高电平,产生一个上升沿,这个上升沿触发终止条件,同时终止条件后,SCL和SDA都是高电平,回归到最初的平静状态,这个起始条件和终止条件就类似串口时序里面的起始位和停止位,,一个完整的数据帧,总是以起始条件开始,终止条件结束,。起始和终止,都是由主机产生的。从机不允许产生起始和终止,所以在总线空闲状态时,从机必须始终双手放开,不允许主动跳出来,去碰总线,

在这里插入图片描述
起始条件之后,第一个字节,也必须时主机发送的,就是最开始,SCL低电平,,主机如果想发送0,就拉低SDA到低电平,如果想发送1,就放手,SDA回弹到高电平,在SCL低电平期间,允许改变SDA电平,当这一个放好之后,主机就松手时钟线,SCL回弹到高电平,高电平期间,是从机读取SDA的时候,所以高电平期间SDA不允许变化,从机需要尽快地读取SDA,一般都是在上升沿的时刻,从机就已经读取完成了,因为时钟是主机控制的,从机并不知道什么时候会产生下降沿,你从机要是磨磨唧唧,主机可不会等你,所以从机在上升沿的时候,就会立刻把数据读走,那主机在放手SCL一段时间后,就饿可以继续拉低SCL,传输下一位了,主机也需要在SCL下降沿之后,尽快把数据放在SDA上,但是主机有时钟的主导权,所以主机并不需要那么着急,只需要在低电平的任意时刻把数据放在SDA上就行了,数据放完之后,主机再松手SCL,SCL高电平,就这样的流程。主机拉低SCL,把数据放在SDA上,主机松开SCL,从机读取SDA的数据,在SCL的同步下,依次进行主机发送和从机接收,循环8此,就发送了8位数据,也就是一个字节,所以第一位是一个字节的最高位B7,最后发送最低位B0,串口时序是低位先行,IIC是高位先行,。
另外,由于这里有时钟线进行同步,所以如果主机一个字节发送一半,突然中断了,不操作SCL和SDA了,那时序就会在终端位置不断拉长,SCL和SDA电平都暂停变化,等中断结束,主机回来继续操作。传输仍然不会出现问题,这就是同步时序的好处。由于整个时序就是主机发送一个字节,所以在这个单元里,SCL和SDA全程都由主机掌控,从机只能被动读取,这就是发送一个字节的时序,

在这里插入图片描述

SDA实线部分是主机控制的电平,虚线部分是从机控制的电平,SCL全程由主机控制,SDA在主机接受前要释放,交由从机控制,之后还是一样,因为SCL时钟是由主机控制的,所以从机的数据变换基本都是贴着SCL下降沿进行的,而主机可以在SCL高电平的任意时刻读取,,这就是接收一个字节的时序。

在这里插入图片描述
应答机制分为发送应答和接收应答,分别和发送一个字节,接收一个字节的其中一位是相同的,可以理解为发送一位和接收一位,这一位就用来作为应答,是主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答,。
是主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答,。
然后同样,主机在接收之前,需要释放SDA,这个意思就是当我们在调用发送一个字节之后

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础入门转录组数据分析——基因Wilcoxon秩和检验

零基础入门转录组数据分析——基因Wilcoxon秩和检验 目录 零基础入门转录组数据分析——基因Wilcoxon秩和检验1. 单基因Wilcoxon秩和检验的基础知识2. 基因Wilcoxon秩和检验(Rstudio)——代码实操2. 1 数据处理2. 2 基因Wilcoxon秩和检验2. 3 Wilcoxon秩…

FreeRTOS学习笔记—①堆与栈

在嵌入式系统中,堆与栈通常表示操作系统对进程占用的两种管理方式,而RTOS中栈更为重要,每一个链路都要有自己的栈。因此对堆和栈的概念进行了些区分和了解。以下是自己学习总结的一些,如有不对的地方请指正: &#xf…

算法打卡 Day25(二叉树)-修剪二叉搜索树 + 将有序数组转换为二叉搜索树 + 把二叉搜索树转换为累加树

文章目录 Leetcode 669-修剪二叉搜索树题目描述解题思路 Leetcode 108-将有序数组转换为二叉搜索树题目描述解题思路 Leetcode 538-把二叉搜索树转换为累加树题目描述解题思路 Leetcode 669-修剪二叉搜索树 题目描述 https://leetcode.cn/problems/trim-a-binary-search-tree…

elementUI——checkbox复选框监听不到change事件,通过watch监听来解决——基础积累

今天在写后台管理系统的时候,遇到一个需求,就是要求监听复选框的change事件,场景就是:两个复选框互斥,且可以取消勾选。 就是这两个复选框可以同时都不勾选,如果勾选的话,另一个一定要取消勾选。…

​如何通过Kimi强化论文写作中的数据分析?

在学术研究领域,数据分析是验证假设、发现新知识和撰写高质量论文的关键环节。Kimi,作为一款先进的人工智能助手,能够在整个论文写作过程中提供支持,从文献综述到数据分析,再到最终的论文修订。本文将详细介绍如何将Ki…

OceanBase 的ODP OBproxy 的记录

OceanBase 的ODP的路由说明一、简述为什么使用ODP的原因 (强一致性情况下) 1.分布式数据库在SQL解析这块存在本地执行计划,远程执行计划,分布式执行计划。 本地执行计划:整个SQL的表都在session所在的Observer 节点上。…

ABAP 结构体变量的嵌套INCLUDE TYPE 和 INCLUDE STRUCTURE

文章目录 创建程序语法格式程序测试AS SPFLI_NAME2 RENAMING WITH SUFFIX _NAME2 后缀变量的结构程序结构类型嵌套表和结构字段类型TYPES嵌套类型程序 创建程序 语法格式 程序测试 AS SPFLI_NAME2 RENAMING WITH SUFFIX _NAME2 后缀 变量的结构 程序 *&------------------…

Java进阶13讲__第六讲

算法: 冒泡排序 选择排序 二分查找 1. 冒泡排序 1.1 定义 1.2 代码示例 Java业务逻辑-1(冒泡排序)-CSDN博客https://blog.csdn.net/XiaomeiGuiSnJs/article/details/140880229 2. 选择排序 2.1 定义 2.2 代码示例 package cn.hdc.itWork.d5.d2;import java.uti…

【C语言】详解数组

文章目录 前言一、数组的概念二、一维数组1.一维数组的创建2.一维数组的初始化3. 一维数组的使用4.一维数组在内存中的存储 三、二维数组1.二维数组的创建2. 二维数组的初始化3. 二维数组的使用4.二维数组在内存中的存储 前言 一、数组的概念(数组是一组相同类型元素…

精准设计与高效开发:用六西格玛设计DFSS实现新能源汽车开发突破

快速变化的市场需求和激烈的竞争迫使制造企业不得不持续创新和优化产品开发流程。如何在保证产品质量的前提下,加快产品开发周期,成为许多企业亟待解决的问题。六西格玛中的DFSS(Design for Six Sigma)模型提供了一种系统的方法&a…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机: 用户截屏,被禁用 用户录屏,录制的是空白内容/黑色内容的视频。 二、微信小…

RS-FS-N01风速变送器简明教程(485通信类型变送器)

该文章仅供参考,编写人不对任何实验设备、人员及测量结果负责!!! 文章主要介绍变送器的硬件连接、软件配置、数据读写以温湿度计算。 1 硬件连接 2 软件配置 将变送器硬件部分正确连接后 打开“485 参数配置工具.exe” 对风速…

hello树先生——红黑树

红黑树 一.什么是红黑树二.红黑树的实现1.创建树节点结构2.插入功能的实现 三.提供一些常见二叉树接口四.进行平衡测试 一.什么是红黑树 红黑树是一种自平衡的二叉搜索树,具有以下特性: 节点颜色:每个节点要么是红色,要么是黑色。…

从模型到实践:新时代【数学建模竞赛论文】的结构、规范与创新解析

目录 1. 数学建模竞赛论文的重要作用 1.1 论文是竞赛成果的书面形式 1.2 论文是评判参赛成绩的唯一依据 1.3 论文写作是科技论文写作的基本训练 1.4 数学建模竞赛论文的综合性 1.5 数学建模竞赛论文与学术研究的联系 1.6 数学建模竞赛论文的重要性在评委眼中 1.7 数学建…

Leetcode3248. 矩阵中的蛇

Every day a Leetcode 题目来源:3248. 矩阵中的蛇 解法1:模拟 遍历字符串数组 commands,模拟🐍的移动过程。 如果最后🐍的位置为 (i, j),则编号为 (i * n) j。 代码: /** lc appleetcode…

[Hive]五、Hive 源码编译

G:\Bigdata\2.hive\大数据技术之Hive源码编译 第1章 部署Hadoop和Hive 1.1 版本测试 Hadoop3.3.6 和Hive3.1.3 运行hive客户端时报错: java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V 查看Ha…

计算机的错误计算(八十一)

摘要 讨论双曲正弦函数 sinh(x)的计算精度问题。 例1. 计算 sinh(312.08) . 若在Python下计算,则有: 若在Excel单元格中计算,则有: 事实上,16位的正确值是 0.1712347549914620e136(ISRealsoft 提供&…

MLLM(一)| 文/图生视频任务大升级,BigModel 开源了视频模型CogVideoX

CogVideoX的体验地址:https://bigmodel.cn/console/trialcenter?modelCodecogvideox 自2021年起,智谱 AI 技术团队便开始着手布局包括 text-2-img、text-2-video、img-2-text、video-2-text 在内的多模态模型,并陆续研发并开源了CogView、Co…

0基础学习爬虫系列:Python环境搭建

1.背景 当前网络资源更新非常快,然后对应自己感兴趣的内容,每天盯着刷网站又太费时间。我在尝试借助Ai,搭建一套自己知识抓取更新提醒的系统,这样可以用极少的时间,关注到自己感兴趣的信息。 其实,这套逻辑…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中,C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息,可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”(/FC)选项…