stm32学习笔记:IIC通信(未完)

概述

第一块:介绍协议规则,然后用软件模拟的形式来实现协议。

第二块:介绍STM32的iic外设,然后用硬件来实现协议。

程序一现象:通过软件I2C通信,对MPU6050芯片内部的寄存器进行读写,写入到配置寄存器,就可以对外挂的这个模型进行配置,读出数据寄存器,就可以获取外挂模块的数据。I2通信的目的

串口通信没有时钟线的异步全双工的协议。

如果我们想要读写寄存器来控制硬件电路,我们至少需要定义两个字节的数据。一个字节是我们要读写哪个寄存器,也就是指定寄存器的地址,另一个字节就是这个地址下存储器的内容,写入内容就是控制电路,读出内容就是获取电路状态。

要求

1、全双工变为半双工;
2、应答机制(安全起见)
3、一根通讯线能够同时外接多个模块(单片机可以指定和任意一个模块进行通信,同时单片机在跟某个模块进行通信时,其他模块不能对正常的通信产生干扰。)
4、串口是异步时序,也就是发送方和接收方约定的传输速率是非常严格的,时钟不能有过大的偏差,也不能在传输过程中,单片机有事进入中断了,异步时序是不能暂停的,单片机一个字节发一半数据暂停了,接收方是不知道的,它仍然会按照原来的约定速率读取,最终导致传输出错。(异步时序的缺点是依赖硬件外设的支持,必须要有USART电路才能方便使用,如果没有USART硬件电路的支持,那么串口是很难用软件来模拟的),需要将该协议改为同步协议,另外加一条时钟线来指导对方读写。由于存在时钟线,对传输的时间要求就不高了,单片机可以随时暂停传输,去处理其他事情,因为暂停传输的同时,时钟线也暂停了,所以传输双方都能定格在暂停的时刻,可以过一段时间再继续,不会对传输造成影响。(同步时序的好处),使用同步时序可极大降低单片机对硬件电路的依赖。即使没有硬件电路的支持也可以很方便地用软件手动翻转电平来实现通信,而异步时序的好处是省一根时钟线,节省资源,缺点是对时间要求严格,对硬件电路的依赖比较严重。

单片机读写自己的寄存器,可以直接通过内部的数据总线来实现,直接用指针操作就行,不需要我们操心。但是,现在这个模块的寄存器在单片机的外面,那怎么实现单片机读写外部模块寄存器的操作呢

项目要求

通过通信线,实现单片机读写外挂模块寄存器的功能,其中至少要实现在指定的位置读寄存器和在指定的位置写寄存器两个功能。实现读写寄存器也就实现了对外挂模块的完全控制。

同步时序稳定性比异步时序更高,然后只有一根SDA数据线,变全双工为半双工,一根线兼具发送和接收,最大化利用资源。一主多从:单片机作为主机,主导I2C总线的运行,挂在在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制IIC总线,不能在未经允许的情况下去碰I2C总线,防止冲突。

 I2C的硬件规定

1.左边CPU就是单片机,作为总线主机,功能包括对SCL线的完全控制,任何时候都是主机完全掌控SCL线。在空闲状态下,主机可以主动发起对SDA的控制。只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。

2.被控IC就是挂载在iic总线上的从机,可以是姿态传感器,OLED,存储器,时钟模块等。

3.从机权利比较小,对SCL时钟线,在任何时刻都只能被动读取,从机不允许控制SCL线,对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂的获取SDA的控制权。

4.接线要求所有从机SCL,SDA线都在一条线上与主机相连。

5.主机SCL可以配置成推挽输出,从机的SCL可以配置成浮空输入或者上拉输入,数据流向是主机发送,所有从机接收。

6. 主机SDA在发送的时候是输入,在接收的时候是输出,从机的SDA也在输入和输出之间切换。如果总线时序没协调好,就可能发生两个引脚同时处于输出状态。如果这时一个输出高电平,一个输出低电平,这个状态就是电源短路。需要避免。

7.为了避免这个问题,IIC禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构。所以设备的SCL和SDA均要配置成开漏输出模式。并且添加上拉电阻。

 

I2C的软件规定

起始和终止条件

起始条件:SCL高电平期间,SDA从高电平切换到低电平

        即左下角,在IIC处于空闲状态时,SCL和SDA都处于高电平状态,也就是没有设备去碰SCL和SDA,SCL和SDA由外挂的上拉电阻拉高至高电平,总线处于平静的高电平状态,当主机需要进行数据收发时,需要产生起始条件,即SCL处于高电平,把SDA拉底,变成低电平,产生一个下降沿,当从机捕获到SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤,在SDA下降沿之后,主机要把SCL拉底。原因是占用总线,且为了方便基本单元的拼接,即为了保证每个时序单元的SCL都是以低电平开始,低电平结束的,这样这些单元拼接起来,SCL才能续上。

终止条件:SCL高电平期间,SDA从低电平切换到高电平

         即SCL先拉高,SDA再拉高,产生一个上升沿,这个上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平。回归到平静状态。类似串口的起始位和停止位。

         一个完整的数据帧总是以其实条件开始,终止条件结束,起始和终止都是由主机产生的。再总线空闲状态时,从机双手放开。不允许触碰总线。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

界面控件DevExpress .NET MAUI v23.2新版亮点 - 拥有全新的彩色主题

DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 今年第一个重要版本v23.1正式发布,该版本拥有众多…

QT TCP传输文件+ui

TCPFile tcp协议传输文件 TCPFile.pro QT core gui networkclientwidget.h #include <QWidget> #include <QTcpSocket> // 通信套接字 #include <QFile>private slots:void on_pushButton_clicked();private:QTcpSocket *tcpSocket;QFile file; /…

结构4a1-13的分类规则汇总

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让A的6张图片中共有3个点&#xff0c;B中有1个点.&#xff0c;测试集为二进制的0-63.收敛误差7e-4&#xff0c;比较分类准确率。 A B 0 0 0 0 0 …

【漏洞复现】某厂商明御WEB应用防火墙任意用户登录漏洞

Nx01 产品简介 安恒明御WEB应用防火墙&#xff08;简称WAF&#xff09;是杭州安恒信息技术股份有限公司自主研发的一款专业应用安全防护产品&#xff0c;专注于为网站、APP等Web业务系统提供安全防护。 Nx02 漏洞描述 安恒明御WEB应用防火墙report.php文件存在硬编码设置的Con…

【three.js】手把手带你理解制作一个3D场景 超级详细

我们主要目的是制作这样一个三维模型: 我们直接上代码,从代码中一点点解释模型是如何一步一步制作的。 // 引入three.js import * as THREE from three; /*** 创建3D场景对象Scene*/ const scene = new THREE.Scene();/*** 创建网格模型*/ //创建一个长方体几何对象Geometry…

在Windows系统上安装Docker和SteamCMD容器的详细指南有哪些?

在Windows系统上安装Docker和SteamCMD容器的详细指南有哪些&#xff1f; 安装Docker&#xff1a; 首先&#xff0c;需要在Windows操作系统上激活WSL2功能。这是因为Docker作为一个容器工具&#xff0c;依赖于已存在并运行的Linux内核环境。可以通过使用winget来安装Docker。具体…

用HTML5的<canvas>元素实现刮刮乐游戏

用HTML5的&#xff1c;canvas&#xff1e;元素实现刮刮乐游戏 用HTML5的<canvas>元素实现刮刮乐&#xff0c;要求&#xff1a;将上面的“图层”的图像可用鼠标刮去&#xff0c;露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像&#xff0c;我这…

浮点数的比较以及abs和fabs的区别

『踩坑记录』浮点数的比较以及abs和fabs的区别 Chapter1 『踩坑记录』浮点数的比较以及abs和fabs的区别abs函数与fabs函数的区别相同点&#xff1a;不同点&#xff1a; Chapter2 浮点数为什么不能用 进行比较浮点数比较方法判定相等拓展&#xff1a; Chapter1 『踩坑记录』浮点…

FreeRtos Queue(四)

本篇主要分析xQueueReceive&#xff0c;从队列中读取消息&#xff0c;读消息也是在死循环里操作的&#xff0c;大致分为两个逻辑&#xff1a; 1、队列不为空的时候的处理 2、队列为空的时候的处理 一、队列不为空 先分析下从队列中读取消息这个函数 prvCopyDataFromQueue 队…

Java进阶-IO(1)

进入java IO部分的学习&#xff0c;首先学习IO基础&#xff0c;内容如下。需要了解流的概念、分类还有其他一些如集合与文件的转换&#xff0c;字符编码问题等&#xff0c;这次先学到字节流的读写数据&#xff0c;剩余下次学完。 一、IO基础 1、背景 1.1 数据存储问题 变量…

Linux 学习笔记(8)

八、 启动引导 1 、 Linux 的启动流程 1) BIOS 自检 2) 启动 GRUB/LILO 3) 运行 Linux kernel 并检测硬件 4) 挂载根文件系统 5) 运行 Linux 系统的第一个进程 init( 其 PID 永远为 1 &#xff0c;是所有其它进程的父进程 ) 6) init 读取系统引导配置文件…

WSL2外部网络设置

1 关闭所有WSL系统 wsl --shutdown 2 打开Hyper-V管理器 3 将“虚拟交换机管理器”-> ”WSL连接类型“设置为“外部网络” 4 启动WSL系统&#xff0c;手动修改WSL网络 将WSL网络IP修改为192.168.1.9 sudo ip addr del $(ip addr show eth0 | grep inet\b | awk {print $2} |…