STM32 I²C通信

一、I²C总线通信

1.1 I²C总线特点

        I²C(Inter Integrated Circuit,集成电路总线),通过串行数据线SDA(Serial Data)和串行时钟线SCL(Serial Clock)来完成数据的传输。

特点:

        ①I²C是一种同步、半双工的通信方式

        ②I²C通信带有数据应答机制

        ③在硬件上,I²C总线只需要一根数据线和一根时钟线

        ④I²C总线是一个多主机通信协议,支持挂载多设备,既可以实现一主多从,也可以实现多主多从。当有2个或多个主机同时初始化数据传输,可以通过冲突检测和仲裁防止数据被破坏。每个连接到总线上的器件既可以作为主机也可以作为从机,但同一时刻只允许只有一个主机

        ⑤可变的时钟速率(串行8位数据传输,标准模式:100kbit/s,快速模式:400kbit/s,高速模式:3.4Mbit/s)、功耗低、抗干扰能力强

1.2 I²C的术语

术语含义
发送器发送数据到总线的器件,既可以是主机,也可以是从机
接收器从总线接收数据的器件,既可以是主机,也可以是从机
主机初始化发送,产生时钟信号和终止发送的器件
从机被主机寻址的器件
多主机同时又多于一个主机尝试控制总线,但不破坏信息
仲裁是一个在有多主机同时尝试控制总线,但只允许其中一个控制总线并使信息不被破坏的过程
同步两个或多个器件同步时钟信号的过程
地址主机用于区分不通风从机而分配的地址
SDA数据传输的信号线
SCL时钟传输的信号线

二、I²C的硬件层

        I²C总线要求SDA和SCL可以双向通信(既可以接收数据和时钟,又可以发送数据或时钟),因此I²C的时钟线SCL和数据线SDA采用弱上拉和开漏输出方式,通过上拉电阻正确收发数据

开漏输出的作用:

防止短路

        I²C是半双工模式,主机与从机会不断在输入与输出之间切换,如果总线时序没有协调好,极又可能出现一主一从均处于输出状态,如果正好输出一高一低,此时电路呈现短路状态

        开漏输出:当MOS管导通,输出低电平;当MOS管闭合,此时引脚处于浮空状态,对外呈现高阻态。没有输出高电平的能力,如果想要输出高电平,需在外围电路增加上拉电阻。

        所以,采用开漏输出,相当于在电源与地之间增加了一个电阻,可以有效避免电路短路的现象,保证电路的安全性。因此,大多数总线都采用开漏输出

避免总线信号混乱

        当总线处于空闲状态时,由于上拉电阻的作用,总线呈现高电平,空闲设备呈现高阻态状态,相当于短路。只有开启的设备才能正常进行通信

多主机模式下的时钟同步和总线仲裁

        开漏输出具有线“与”的功能,即多个开漏输出设备连接在一起时,只要有一个设备输出低电平,则整体呈现低电平

总线仲裁:

        I²C总线仲裁机制为分布仲裁方式,每个主设备都是总线使用权的参与者和决策者

        仲裁逻辑:基于线“与”的功能,低电平优先

        仲裁过程:每一个主设备一次发送一位数据,然后在SCL的高电平期间,比较总线上所呈现的电平与自己所发送的数据是否一致。如果一致,继续发送下一位数据,否则就退出竞争

        如果两个主机发送的时序与数据完全一样,则两个主机可以正常完成数据传输

        仲裁可以持续许多位。 它的第一阶段是地址位的比较。 如果主机各自尝试寻址同一设备,则仲裁将继续比较数据位(如果它们是主机发送器),或者是确认位(如果它们是主机接收器)。 由于I2C总线上的地址和数据信息由获胜的主机确定,因此在仲裁过程中不会丢失任何信息

时钟同步:

        时钟同步只会在仲裁时发生。SCL是由主机产生的时钟信号,用于和从机确定数据发送和采样的时间点。倘若处在仲裁期间,会有多个主机同时发送往SCL上发送时钟信号。两个主机配置的通信速率可能不同,因此时钟频率必然不同;即使配置了相同的通信速率,两者开始发送数据的时间也不同。

        在总线空闲的时候,SCL被上拉电阻拉高。开始通信后,主机的时钟信号接入SCL中。如下图所示,有两个主机(时钟信号分别为CLK1和CLK2)都认为主机空闲,因此开始将时钟信号输入SCL:

①CLK1率先变为低电平,由于线与特性SCL也被拉低
②CLK2检测到SCL为低电平,会将CLK2拉低。由于线与的特性,SCL低电平持续的时间取决于低电平持续时间长的时钟。在此期间,低周期比较短的主设备1将进入高电平状态等待。如图,主设备1提前进入高电平等待,主设备2继续保持低电平,并从此时开始计数(计算低电平持续的时间,即下图中的wait state)
③CLK2迎来高电平之后,主机1内部的wait state结束,因为两者都为高,因此SCL总线变为高电平,两个主机内部都会开始对高电平持续的时间进行计数。
④随后,CLK1会比CLK2先回到低电平,SCL也被拉低

⑤现在,CLK1以及获得了需要延长的低电平时间,CLK2也获得了需要减短的高电平时间(都是通过刚才的计数获得的),两个主机会根据之前的计数重新调整自己的时钟周期,从而完成时钟同步。

生成了一个同步的SCL时钟:其低电平周期由时钟低电平周期最长的设备确定,其高电平周期由时钟高电平周期最短的设备确定

综上所述:

        主机的权力很大,包括对SCL时钟线的绝对控制权(推挽输出),在空闲状态下,主机可以主动发起对SDA的控制权,只有在从机发送数据以及接收应答时,主机才会将SDA的控制权转交给从机

        从机的权利比较小,对于SCL时钟线任何时候只能被动读取(浮空输入或上拉输入),从机不允许控制SCL线;对于SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,或者从机产生应答时,从机才能短暂的获取SDA的控制权

三、I²C的协议层

3.1 数据有效性

        I²C总线以串行方式传输数据,时钟线每产生一个时钟脉冲,数据线就传输一位。I²C总线协议规定:SDA上的数据只能在SCL的低电平时才可改变,必须在SCL的高电平是保持稳定

3.2 起始信号(Start)和停止信号(Stop)

        起始信号:SCL为高电平时,SDA出现下降沿

        终止信号:SCL为高电平时,SDA出现上升沿

        I²C总线数据传输必须以起始信号启动传输,以停止信号结束一次传输

3.3 重复开始信号(Repeat Start)

        在I²C总线上,有主机发送一个起始位,在发送停止位之前,主机可以再次发送一次起始位。

它可以帮助主机在不丧失总线控制权的前提下改变数据传输方向或切换到其他从机通信

3.4 发送一个字节(Send Byte)——高位先行

        在SCL的低电平期间,将数据(高位先行)放在SDA线上,当SCL为高电平时,读取数据位,在此期间不允许数据产生变化,依次循环8次

3.5 接收一个字节(Receive Byte)——高位先行

        在SCL的低电平期间,将数据(高位先行)放在SDA线上,当SCL为高电平时,读取数据位,在此期间不允许数据产生变化,依次循环8次(主机接受之前需要释放SDA的控制权)

3.6 应答信号(ACK)

        在接收或发送一个字节数据后,接收器必须产生一个应答信号(0表示应答,1表示非应答

四、I²C的数据帧格式

        一般情况下,I²C通信由4部分组成:起始信号、从机地址传输+传输方向、数据传输、停止信号

        I²C总线上传输数据的最小单位为1个字节(8bit)

        总线上的所有设备通过软件寻址且具有唯一的地址(7位或10位)。7位“从机专用地址码”,其高4位为设备类型地址(由生产厂家制定),低3位为器件引脚定义地址(由使用者定义,A0、A1……),不同期间的固定地址位数不同。在I²C总线系统中,不允许存在两个地址相同的器件

寻址约定:起始信号的第一字节为寻址字节,用来寻找被控器件,并规定数据的传输方向

在7位寻址模式中,须知字节由从机的7位地址位(D7~D1)和一位读写位(D0,0:写,1:读

        当主机发送寻址字节后,总线上的所有器件都将寻址字节中的7位地址与自己比较,如果两者相同,则该器件认为被主机寻址,发送应答信号。

4.1 指定地址写数据

        对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data

        通信流程:起始条件、从机地址+写、寄存器地址、发送数据、终止条件

        在传输过程中,如果从机产生非应答信号,则主机会提前结束本次数据传输

2. 当前地址读数据

        对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data

        通信流程:起始条件、从机地址+读、接受数据、终止条件

        当主机进行寻址时,一旦读写标志位给1,主机放弃SDA的控制权,下一字节就要立马转为读的时序,此时读的位置就是地址指针指示的位置

        地址指针一般上电默认从0地址开始,每读出或写入一个字节,这个地址指针就会自增,移动到下一位置

3. 指定地址读数据

        对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data

        通信流程:起始条件、从机地址+写、寄存器地址、重复开始、从机地址+读、接收数据、终止条件

        在传输过程中,主机随时可以产生非应答信号结束数据传输

I²C通信步骤:

如果发送多个字节,重复4和5

五、MPU6050简介

        MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度(可测范围为±2, ±4,±8, ±16g)、角速度参数(可测范围为±250, ±500, ±1000, ±2000°/秒( dps)),并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)配合InvenSense公司提供的运动处理资料库,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据,可进一步得到姿态角(PITCH、YAW、ROLL),常应用于平衡车、飞行器等需要检测自身姿态的场景

        常见融合算法:互补滤波、卡尔曼滤波

        DMP就是MPU6050内部的运动引擎,全称Digital Motion Processor,直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。Motion Driver是Invensense针对其运动传感器的软件包,并非全部开源,核心的算法部分是针对ARM处理器和MSP430处理器编译成了静态链接库,适用于MPU6050、MPU6500、MPU9150、MPU9250等传感器。

        6轴:3轴加速度和3轴角速度

        9轴:3轴加速度、3轴角速度和3轴磁场强度

        10轴:3轴加速度、3轴角速度、3轴磁场强度和1个气压强度

        注:任何一种传感器都不能获得精确却稳定的欧拉角,只有将传感器的数据进行融合,才可以获得

3轴加速度计(Accelerometer):测量XYZ轴的加速度

3轴陀螺仪传感器(Gyroscope):测量XYZ轴的角速度

3轴磁力传感器(Magnetic):测量XYZ轴的磁力(需要外接)

世界坐标系:东北天   

机体坐标系:右前上

俯仰角,Pitch:绕着x轴旋转,飞机机头下倾或上仰。对应飞机机体坐标y轴与水平面的夹角

翻滚角,Roll:飞机机身左翻滚或右翻滚。对应飞机机体坐标x轴在水平面的投影与世界坐标系x轴的夹角

偏航角,Yaw:飞机机身保持水平,机头向左转向或向右转向。对应飞机机体坐标y轴在水平面的投影与世界坐标系y轴的夹角

5.1 硬件结构

引脚功能
VCC、GND电源
SCL、SDA作为从机,IIC通信的引脚
XCL、XDA作为主机,IIC通信引脚,用于连接外部从设备,如3轴磁力计
AD0从机地址的最低位
INT数据输出的中断引脚

数据参数:

        16位ADC采集传感器的模拟信号,量化范围:-32768~32767(16位有符号数),对各个模拟参量进行量化

        加速度计满量程(相当于ADC中的参考电压)选择:±2、±4、±8、±16(g 重力加速度)(16位AD值达到最大时,对应的物理量具体是多少,由满量程范围决定)

        陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec 角速度)(满量程越大,测量的范围就越广;满量程越小,测量的分辨率越高)

        可配置的数字低通滤波器(输出数据抖动太剧烈,就可以加一点低通滤波,使输出变得平缓一些)

        可配置的时钟源

        可配置的采样分频(时钟源通过分频器的分频,可以为AD转换和内部其他电路提供时钟)

        I2C从机地址:1101000(AD0=0)1101001(AD0=1)

5.2 相关寄存器

除了电源管理寄存器1(0x40:睡眠模式,操作芯片时,先要接触睡眠模式,否则操作无效)和ID寄存器,其他寄存器上电默认值均为0x00

5.2.1 采集频率分频

采样频率分频器:生成MPU-60X0采样率的陀螺仪输出速率的分频器

分频越小,内部ADC的转换就越快,刷新率就越高

Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV )
时钟来源:内部晶振、外部时钟引脚的方波、陀螺仪晶振

5.2.2 配置寄存器

配置外部帧同步引脚采样和数字低通滤波器
配置数字低通滤波器,可使输出波形更光滑

5.2.3 陀螺仪配置寄存器

7~5:配置三轴的自测单元
4~3:配置满量程

5.2.4 加速度计配置寄存器

7~5:配置三轴的自测单元
4~3:配置满量程
2~0:配置高通滤波器

5.2.5 加速度计数据寄存器(16位的有符号数)

5.2.6 温度数据传感器(16位的有符号数)

5.2.7 陀螺仪数据寄存器(16位的有符号数)

5.2.8 电源管理寄存器1

5.2.9 电源管理寄存器2

5.2.10 ID寄存器

六、I²C外设

        STM32内部集成了硬件I2C 收发电路,可以由硬件 自动执行 时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻 CPU的负担。

6.1 I²C的结构及功能

①丰富的通信功能:支持多主机模型,该模块既可以作为主设备也可以作为从设备,可编程的I²C地址检测、可响应2个从地址的双地址能力,产生和检测7位/10位地址和广播呼叫,可选的拉长时钟功能;可配置信息包错误检测(PEC)的产生和校验,发送模式中PEC值可以作为最后一个字节传输,用于最后一个接收字节的PEC错误校验
②支持不同的通信速率:标准速度高达100kHz、快速高达400kHz
③完善的错误检测:主模式的重在丢失,地址/数据传输后的应答(ACK)错误、检测到错位的起始或停止条件,禁止拉长时钟功能时的上溢或下溢
④具有两个中断向量:一个中断用于地址/数据通信中断,另一个中断用于通信出错中断
⑤具有单字节缓冲器的DMA
⑥兼容系统管理总线(System Management Bus,SMBus),25ms时钟低超时延时,带ACK控制的硬件PEC产生/校验,支持地址解析协议(ARP)
STM32F103C8T6 硬件 I2C资源: I²C1I²C2

6.2 I²C通信方式

多主机模型包括固定多主机和可变多主机(任一设备都可以在总线空闲状态下作为主机),STM32F103C8T6就是可变多主机模型,默认模式下,I²C模块是工作在从模式
I²C模块具有4种工作模式:主发送器模式、主接收器模式、从发送器模式和从接收器模式
5.2.1 I²C主模式

6.2.1.1 I²C主模式发送

EV:Event,相当于一个标志位

6.2.1.2 I²C主模式接收

6.2.2 I²C从模式

6.2.2.1 I²C从模式发送

6.2.2.2 I²C从模式接收

6.3 I²C中断

七、I²C模块相关库函数

八、I²C模块使用配置

(1)开启GPIO、IIC时钟
(2)配置GPIO口(复用开漏输出)
(3)配置IIC,完成初始化
	I2C_InitTypeDef I2C_InitStruct;I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;  //模式:IICI2C_InitStruct.I2C_Ack = I2C_Ack_Enable;  //应答使能I2C_InitStruct.I2C_ClockSpeed = 200000;  //时钟频率要小于400KHzI2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;  //时钟信号  低电平:高电平 = 2(高速才有效,大于100KHz)I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;  //作为从机,应答几位的地址I2C_InitStruct.I2C_OwnAddress1 = 0x00;  //作为从机的地址I2C_Init(I2C2,&I2C_InitStruct);
(4)使能IIC

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

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

相关文章

深度学习-数据预处理

目录 创建一个人工数据集处理缺失的数据插入对inputs中的类别值或离散值,将NaN视为一个类别对inputs和outputs中的数值类型转换为张量格式 创建一个人工数据集 import os import pandas as pd os.makedirs(os.path.join(.., data), exist_okTrue) data_file os.p…

ESP-IDF下载与安装完整流程

本文主要看参考官网说明,如下: Windows 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 一、概述 ESP-IDF需要安装一些必备工具,才能围绕ESP32构建固件,包括: PythonGit交叉编译…

Docker搭建Maven仓库Nexus

文章目录 一、简介二、Docker部署三、仓库配置四、用户使用Maven五、管理Docker镜像 一、简介 Nexus Repository Manager(简称Nexus)是一个强大的仓库管理器。 Nexus3支持maven、docker、npm、yum、apt等多种仓库的管理。 建立了 Maven 私服后&#xf…

【JAVA】UDP与TCP套接字编程

目录 一、UDP数据报套接字编程 1、DatagramSocket API 2、DatagramPacket API 3、InetSocketAddress API 4、示例一 5、示例二 二、TCP流套接字编程 1、ServerSocket API 2、Socket API 3、TCP中的长短连接 4、示例一 5、示例二 一、UDP数据报套接字编程 1、Datag…

图像处理之模板匹配(C++)

图像处理之模板匹配(C) 文章目录 图像处理之模板匹配(C)前言一、基于灰度的模板匹配1.原理2.代码实现3.结果展示 总结 前言 模板匹配的算法包括基于灰度的匹配、基于特征的匹配、基于组件的匹配、基于相关性的匹配以及局部变形匹…

第48期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…

Linux--内核移植(二)移植流程及驱动修改

本文来总结一下如何将 NXP 官方提供的 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。 一、官方开发板内核测试 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的,所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0…

的记忆:pandas(实在会忘记,就看作是一个 Excel 表格,或者是 SQL 表,或者是字典的字典。)

pandas 是一个开源的 Python 数据分析库,它提供了快速、灵活和富有表现力的数据结构,旨在使“关系”或“标记”数据的“快速分析、清洗和转换”变得既简单又直观。pandas 非常适合于数据清洗和转换、数据分析和建模等任务。以下是 pandas 的基本概念和主…

简化图卷积 笔记

1 Title Simplifying Graph Convolutional Networks(Felix Wu、Tianyi Zhang、Amauri Holanda de、 Souza Jr、Christopher Fifty、Tao Yu、Kilian Q. Weinberger)【ICML 2019】 2 Conclusion This paper proposes a simplified graph convolutional m…

第100+6步 ChatGPT文献复现:ARIMAX预测新冠

基于WIN10的64位系统演示 一、写在前面 我们继续来解读ARIMAX模型文章,这一轮带来的是: 《PLoS One》杂志的2022年一篇题目为《A data-driven eXtreme gradient boosting machine learning model to predict COVID-19 transmission with meteorologic…

【docker】拉取人大金仓KingbaseES数据库镜像速度很慢问题

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。 对于学习新技术、快速搭建实验环境等是很不错的选择。优势大致总结如下: 1.镜像拉取速度对比 速度前后对比,提升10倍不止,很快将镜像文件下载至本地。 …

探索设计模式的魅力:主从模式与AI大模型的结合-开启机器学习新纪元

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索主从模式与AI大模型之旅✨ 🌟Hey, tech enthusiasts! 你是否还在追…

蓝桥杯:日期问题(我的绝望题)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 目录 前言: 🌷1.问题描述: 1.问题描述: 2.输入格式: 3.输出格式&#…

IP组播简介

定义 作为IP传输三种方式之一,IP组播通信指的是IP报文从一个源发出,被转发到一组特定的接收者。相较于传统的单播和广播,IP组播可以有效地节约网络带宽、降低网络负载,避免广播堵塞带来的诸如摄像头花屏,视频马赛克等…

【数据结构(邓俊辉)学习笔记】向量03——常规向量

文章目录 0.概述1.元素访问2.置乱器3.判等器与比较器4.无序查找4.1 判等器4.2 顺序查找4.3 实现4.4 复杂度 5. 插入5.1 算法实现5.2 复杂度分析 6. 删除6.1 区间删除6.2 单元删除6.3 复杂度 7. 唯一化7.1 实现7.2 正确性7.3 复杂度 8. 遍历8.1 实现8.2 复杂度 9. 总结 0.概述 …

Pycharm代码规范与代码格式化插件安装

给大家分享两个PyCharm编辑器的插件,分别是pylint与autopep8,主要用来提高我们在使用python进行自动化测试编写以及性能测试脚本编写过程中的代码质量、可读性与美观性。 pylint: ● 代码检查工具:它可以帮助检查代码中的错误、…

Java常见面试题总结

文章目录 1. 什么是线程和进程?2. 请简要描述线程与进程的关系,区别及优缺点?3. 什么是堆和方法区?4. 并发与并行的区别5. 同步和异步的区别6.为什么要使用多线程? 优点?(重要)7. 使用多线程可能带来什么问题?8. 如…

视频滚动字幕一键批量轻松添加,解锁高效字幕编辑,提升视频质量与观众体验

视频已成为我们获取信息、娱乐休闲的重要渠道。一部成功的视频作品,除了画面精美、音质清晰外,字幕的添加也是至关重要的一环。字幕不仅能增强视频的观感,还能提升信息的传达效率,让观众在享受视觉盛宴的同时,更加深入…

vue项目使用百度地图

打开百度地图开放平台 百度地图开放平台 | 百度地图API SDK | 地图开发 在控制台新建应用 复制访问应用的ak 可修改地图样式 使用部分 <!-- 引入地图 --><div class"main-aside"><div id"b-map-container"></div></div> …

面试ssss

响应式布局 响应式布局是一种设计和开发网页的方法&#xff0c;使网页能够适应不同的设备和屏幕尺寸&#xff0c;提供更好的用户体验。它通过使用媒体查询&#xff08;Media Queries&#xff09;和弹性布局&#xff08;Flexbox&#xff09;等技术&#xff0c;根据设备的特性和…