STM32学习笔记(10_1)- I2C通信协议

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。

最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com

本期开始学习 I2C通信,会分两大块来介绍,第一块, 就是介绍协议规则,然后用软件模拟的形式来实现协议;第二块, 就是介绍STM32的 I2C外设, 然后用硬件来实现协议。

I2C:高位先行,只有在SCL高电平时才会读取SDA的电平

本期的内容其实就是对MPU6050芯片内部的寄存器进行读写,写入到配置寄存器,就可以对外挂的这个模块进行配置;读出数据寄存器,就可以获取外挂模块的数据。最终,我们读出的数据会显示在这个OLED上。而STM32对MPU6050的读写是通过I2C来进行的。

因为I2C是同步时序,软件模拟协议也非常方便,所以这里会先介绍软件模拟 I2C。

本期会使用MPU6050陀螺仪、加速度传感器来学习 I2C。

 I2C的完整时序,主要有指定地址写、当前地址读和指定地址读这3种。I2C指定地址写简单来说就是SCL高电平时、SDA下降沿开始传输,传输的第一个字节为从机的7位地址+1位读写位(置0表示要写入),然后是1位应答位(RA,置0表示应答),传输的第二个字节为从机的寄存器地址或者是指令控制字,然后也是1位应答位,传输的第三个字节为主机想写入从机的数据,然后也是1位应答位,这时若不想传输了,则SCL高电平时、SDA上升沿停止传输。

当前地址读就是SCL高电平时、SDA下降沿作为起始条件开始传输,传输的第一个字节为从机的7位地址+1位读写位(这里置1表示读取),然后是1位应答位(RA,置0表示应答),传输的第二个字节为从机的数据,然后是1位非应答位(SA,置1),这时SCL高电平、SDA上升沿作为停止条件停止传输。

指定地址读就是指定地址写去掉写数据的部分+当前地址读,SCL高电平时、SDA下降沿作为起始条件开始传输,传输的第一个字节为从机的7位地址+1位读写位(置0表示要写入),然后是1位应答位(RA,置0表示应答),传输的第二个字节为从机的寄存器地址或者是指令控制字,然后也是1位应答位(置0),然后接重复起始条件Sr(即再来一次起始条件),传输的第三个字节为从机的7位地址+1位读写位(置1表示要读取),然后再接收1位应答位(置0),传输的第四个字节为从机的数据,然后1位非应答位(SA,置1),然后SCL高电平、SDA上升沿作为停止条件停止传输。

I2C通信

下图左一是MPU6050,可以进行姿态测量,使用了I2C通信协议;左二是OLED模块,可以显标字符、图片等信息,也是I2C协议;左三是AT24C02,存储器模块;第4个图片,是DS3231,实时时钟模块,也是使用I2C协议。

本期只会用到一主多从,一主多从就是单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制I2C总线。

作为通信协议,它必须要在硬件和软件上,都作出规定。硬件规定就是你的电路该怎么连接、端口的输入输出模式都是啥样的。软件上的规定就是,你的时序是怎么定义的,字节如何传输、高位先行还是低位先行、一个完整的时序由哪些部分构成。

硬件电路

下图便是一主多从模型,任何时候,都是主机完全掌控SCL线。另外在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机。从机对于SCL时钟线,在任何时刻都只能被动的读取。

I2C的设计是,禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构。不采用推挽输出是为防止时序混乱导致SDA上出现电源短路 的情况。右边的图是内部的具体结构说明,SCLK信号进来,都可以通过一个数据缓沖器或者是施密特触发器,进行输入。输出只能是开漏输出。

 软件部分

I2C时序基本单元

在I2C总线处于空闲状态时,SCL和SDA都处于高电平状态。当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。

起始之后,就到发送部分。高位先行,SCL低电平时,主机如果想发送0,就拉低SDA到低电平;如果想发送,就放手,SDA回弹到高电平。在SCL低电平时,SDA可以变化,但在SCL高电平时,SDA不允许变化。

接收部分

 应答

I2C完整时序

 I2C的完整时序,主要有指定地址写、当前地址读和指定地址读这3种。首先把每个从设备都确定一个唯一的设备地址,主机在起始条件之后,要先发送一个字节叫一下从机名字,所有从机都会收到第一个字节,和自己的名字进行比较,如果一样,就说明,主机现在在叫我,那我就响应之后主机的读写操作。

指定地址写

从机设备地址,在I2C协议标准里分为7位地址和10位地址,我们目前只讲7位地址的模式。那在每个I2C设备出厂时,厂商都会为它分配一个7位的地址,这个地址具体是什么,可以在芯片手册里找到。一般不同型号的芯片地址都是不同的,相同型号的芯片地址都是一样的,那如果有相同的芯片挂载在同一条总线怎么办呢?这就需要用到地址中的可变部分了,一般器件地址的最后几位是可以在电路中改变的,比如MPU6050地址的最后一位,就可以由这个板子上的AD0脚确定。这个引脚接低电平,那它的地址就是1101 000;这个引脚接高电平,那它的地址就是1101 001。

下面以几个波形来详细解释I2C的完整时序。

空闲状态,SCL和SDA都是高电平。然后主机需要给从机写入数据的时候,首先,SCL高电平期间,拉低SDA,产生起始条件(Start,S)。在起始条件之后,跟着的时序,必须是发送一个字节的时序。字节的内容,必须是从机地址+读写位,正好从机地址7位,读写位是1位,加起来是一个字节,8位。发送从机地址,就是确定通信的对象。比如这个波形下,主机寻找的从机地址就是1101 000,这个就是MPU6050的地址,然后最低位,表示读写位,0表示,之后的时序主机要进行写入操作。1表示,之后的时序主机要进行读出操作。紧跟着的单元,就得是接收从机的应答位(Receive Ack,RA),在这个时刻,主机要释放SDA。最终高电平期间,主机读取SDA,发现是0,就说明,我进行寻址,有人给我应答了。应答结束后,我们要继续发送一个字节。第二个字节,就可以送到指定设备的内部了,从机设备可以自己定义第二个字节和后续字节的用途,一般第二个字节可以是寄存器地址或者是指令控制字等。比如MPU6050定义的第二个字节就是寄存器地址;比如AD转换器,第二个字节可能就是指令控制字;比如存储器,第二个字节可能就是存储器地址。图中的第二个字节在MPU6050里,就表示我要操作0x19地址下的寄存器了。接着同样,是从机应答。同样的流程在来一遍,主机发送第三个字节。这个字节就是主机想要写入到0x19地址下寄存器的内容了,比如这里就表示,我要在0x19地址下,写入0xAA。最后是接收应答位,然后也是1位应答位,如果主机不需要继续传输了,就可以产生停止条件(Stop,P)。在停止条件之前,先拉低SDA,为后续SDA的上升沿作准备,然后释放SCL,再释放SDA,这样就产生了SCL高电平期间,SDA的上升沿。这样一个完整的数据帧就完成了。这个数据帧的目的就是,对于指定从机地址为1101 000的设备,在其内部0x19地址的寄存器中,写入0xAA这个数据

当前地址读

这就是当前地址读的时序,如果主机想要读取从机的数据,就可以执行这个时序。

那最开始,还是SCL高电平期间, 拉低SDA,产生起始条件。然后,主机必须首先调用发送一个字节,来进行从机的寻址和指定读写标志位,比如图示的波形,表示本次寻址的日标是1101 000的设备,同时,最后一位读写标志为1,表示主机接下来想要读取数据。然后,接收一下从机应答位,从机应答0,代表从机收到了第一个字节。应答后,第二个字节数据的传输方向就要反过来,因为发了读的命令,所以主机要把SDA的控制权交给从机。主机调用接收一个字节的时序,进行接收操作,这段时间,从机可以在SCL低电平期间写入SDA,然后主机在SCL高电平期间读取SDA。那最终,主机在SCL高电平期间依次读取8位,就接收到了从机发送的一个字节数据。由于这里主机并没有指定读取的地址,所以就要用到当前地址指针。在从机中会有一个单独的指针变量,这个指针上电默认,一般指向0地址,并且,每写入一个字带和读出一个字节后,这个指针就会自动自增一次,那么在调用当前地址读的时序时,主机没有指定要读哪个地址,从机就会返回当前指针指向的寄存器的值,那假设,我刚调用了这个指定地址写的时序,在0x19的位置写入了0xAA,那么指针就会+1,移动到0x1A的位置,我再调用这个当前地址读的时序,返回的就是0x1A地址下的值。如果在调用一次,返回的就是0x1B地址下的值。由手当前地址读并不能指定读的地址,所以用的不多

指定地址读

从中间红线分开,左边是指定地址写,但是去掉了写数据的那部分;右边是当前地址读。

因为我们刚指定了地址,所以再调用当前地址读,就是指定地址读,也叫复合格式。所以这个时序会复杂点。

首先,最开始仍然是启动条件,然后发送一个字节,进行寻址。这里指定从机地址是1101 000,读写标志位是0,代表我要进行写的操作。经过从机应答后,再发送第二个字节,用来指定地址,这个数据就写入到了从机的地址指针里了。也就是说从机接收到第二个数据后,它的寄存器指针就指向了0x19这个位置。

这时再来一个起始条件,这个Sr(Start Repeat)的意思就是重复起始条件,这时还不能开始发送数据,因为指定读写标志位只能是跟着起始条件的第一个字节,所以如果想切换读写方向。只能再来个起始条件,然后起始条件后,重新寻址并且指定读写标志位,此时读写标志位是1,代耒我要开始读了,接着主机开始读,这个字节是不是就是0x19地址下的数据。在读完一个字节之后,一定要给从机发个非应答,(Send Ack,SA),非应答就是该主机应答的时候,主机不把SDA拉低。

两个程序现象

一是软件 I2C读写MPU6050 

对MPU6050芯片内部的寄存器进行读写,写入到配置寄存器,就可以对外挂的这个模块进行配置;读出数据寄存器,就可以获取外挂模块的数据。最终,我们读出的数据会显示在这个OLED上。最上面的是ID号,图中这个MPU6050的ID号固定为0x68,可以读取这个ID号用来测试 I2C读取数据的功能是不是正常,不同批次的MPU6050,ID号会有所不同。然后下面,左边3个,是加速度传感器的输出数据,分别是X轴、Y轴和Z轴的加速度,右边3个,是陀螺仪传感器的输出数据,分别是X轴、Y轴和Z轴的角速度。

二是硬件 I2C读写MPU6050

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

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

相关文章

Linux基础命令篇之——压缩与解压(tar、gzip、bzip2、zip和unzip)

linux基础命令——解压与压缩 以下是关于Linux命令tar、gzip、bzip2、zip和unzip的详细介绍: 1. tar 这个是Linux用的最多的解压缩命令 tar是Linux系统中用于创建和处理归档文件的命令。归档文件是一个包含多个文件和/或目录的单一文件。常与压缩命令gzip或bzip2结…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板:Huawei Atals 200I DK A2 内存:4G NPU:Ascend 310B4 CANN:7.0 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch…

.NET CORE 分布式事务(四) CAP实现最终一致性

目录 引言: 1.0 最终一致性介绍 2.0 CAP 2.0 架构预览 3.0 .NET CORE 结合CAP实现最终一致性分布式事务 3.1 准备工作(数据库,本文使用的是MySql) 3.1.1 数据模型 3.1.2 DbContext 3.1.3 数据库最终生成 3.2 Nuget引入 3.3 appsettings.json …

【OS探秘】【虚拟化】【软件开发】VirtualBox 虚拟化软件卸载和重装

往期OS系列博文: 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装mac OS虚拟机 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装Kali Linux虚拟机 一、事出有因 近日,笔者的Oracle VM VirtualBox突然抽风了,虚拟机无法启动&…

深入理解MapReduce:从Map到Reduce的工作原理解析

当谈到分布式计算和大数据处理时,MapReduce是一个经典的范例。它是一种编程模型和处理框架,用于在大规模数据集上并行运行计算任务。MapReduce包含三个主要阶段:Map、Shuffle 和 Reduce。 ** Map 阶段 ** Map 阶段是 MapReduce 的第一步&am…

Linux appimage如何正确打开

在之前的文章中,提到使用appimage软件非常方便。 但是首次使用会遇到这样的问题: 1. 双击打不开 2. 在终端打开提示: /home/roy/software/appimage/Obsidian-1.5.11.AppImage dlopen(): error loading libfuse.so.2 AppImages require …

关系型数据库mysql(9)主从复制和读写分离

目录 1. 主从复制和读写分离 2. mysql 支持的复制类型 3.架构图 一.主从复制 1.主从复制的定义 2.主从复制的过程 中继日志(Relay Log): 优点: 3.为什么要复制 4.谁复制谁 5.数据放在什么地方 6.主从复制出现的问题 …

基于Uni-app的体育场馆预约系统的设计与实现

文章目录 基于Uni-app的体育场馆预约系统的设计与实现1、前言介绍2、开发技术简介3、系统功能图3、功能实现4、库表设计5、关键代码6、源码获取7、 🎉写在最后 基于Uni-app的体育场馆预约系统的设计与实现 1、前言介绍 伴随着信息技术与互联网技术的不断发展&#…

服务器固定IP(固定出口IP)去访问外部服务

背景 服务器上有多个IP,那么在服务器请求外部服务的时候,到底是使用哪个IP呢?如果要使用特定的IP去请求外部服务,该如何设置呢? 分析 遇到一个实际的场景: 我们产品和其他产品联调,我们的服务…

软考历史题目

2023.3 1. 磁盘索引块1KB,每个地址项4字节,每个磁盘索引块可以存放256个物理块地址 2.5个地址项为直接索引地址,所以0-5逻辑块是直接索引 3.一级间接地址索引,每个指向的物理块存255个地址 4.二级间接地址:256个间接索引表地址…

Php_Code_challenge16

题目: 答案: 解析: 所以科学计数法绕过即可。

蓝桥杯练习系统(算法训练)ALGO-963 转圈游戏

资源限制 内存限制:128.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 n个小伙伴(编号从0到n-1)围坐一圈玩游戏。按照顺时针方向给n个位置编号,从0到n-1。   …

Windows 电脑麦克风 自动启用/禁用 小玩具!

WinMicrophone Windows 系统的 麦克风设备(启用/禁用)切换驱动!它是小巧且快速的,它能够自动的检测并切换麦克风的情况。 您可以在软件包仓库中找到发布版本的exe包,无需安装!其能够大大增大您在Windows中…

家用储能配套用AKH-0.66 K-Φ16-HM 开口电流互感器-安科瑞 蒋静

1.产品特点 产品外形美观,安装、接线方便,专用于通讯机房 100A 及以下配电系统改造,可与 AMC16 多回路监控仪表配合使用。 2.型号说明 3.外形尺寸(公差:2mm) 注:引线长度为 2 米 2*26AWG 护套线,线头…

认识V模型、W模型、H模型

软件测试与软件工程息息相关,软件测试是软件工程组成中不可或缺的一部分。 在软件工程、项目管理、质量管理得到规范化应用的企业,软件测试也会进行得比较顺利,软件测试发挥的价值也会更大。 要关注软件工程、质量管理以及配置管理与软件测试…

Stream流的详细说明

什么是stream流 Stream流是指一种数据处理的概念,它可以将数据以连续的方式传输,而不用等待整个数据集全部加载完成。在计算机编程中,Stream流通常用于处理大数据集或实时数据流。 Stream流可以分为输入流和输出流,输入流用于从数…

56 如何调试 npm run build 的代码/如何在测试环境,预发布环境进行调试

前言 测试环境/预发布环境 如何进行调试 这里主要是 提及一些一个 模拟的生产环境, 应该如何测试 比如 上线之前, 或者 线上出现问题, 需要 hotfix 的场景下 我们应该怎么 在一个 测试环境/预发布 的环境下面 进行一个模拟的调试呢? 对于 如果是没有网络请求的项目, 甚至…

【yy讲解PostCSS是如何安装和使用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

STM32 uC/OS-III

What is uC/OS-III? C/OS-III 的发音为“Micro C O S Three”,这意味着 C/OS-III 是基于 C 语言编写的第三代 小型操作系统,当然这里所说的第三代是相对于 C/OS 的前两个版本 C/OS 和 C/OS-II 而言 的,后面也会介绍这三个版本的差别。C/OS/…

Vue前端项目打包

4.1编译打包 npm run build 4.2 前端项目 nginx的配置文件default.conf 和 dockerfile default.conf upstream wms-app { server 192.168.14.3:3666 ; server 192.168.14.3:3777 ; } server { listen 80; listen [::]:80; server_name localhost; access_log /var/log/nginx…