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://xiahunao.cn/news/2980204.html

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

相关文章

java泛型介绍

Java 泛型是 JDK 5 引入的一个特性,它允许我们在定义类、接口和方法时使用类型参数,从而使代码更加灵活和类型安全。泛型的主要目的是在编译期提供类型参数,让程序员能够在编译期间就捕获类型错误,而不是在运行时才发现。这样做提…

(ICML-2021)从自然语言监督中学习可迁移的视觉模型

从自然语言监督中学习可迁移的视觉模型 Title:Learning Transferable Visual Models From Natural Language Supervision paper是OpenAI发表在ICML 21的工作 paper链接 Abstract SOTA计算机视觉系统经过训练可以预测一组固定的预定目标类别。这种受限的监督形式限制…

[笔试训练](四)

010 Fibonacci数列_牛客题霸_牛客网 (nowcoder.com) 题目: 题解: 1.创建一个数组fib[],保存范围内的所有斐波那契数,再求离N最近的斐波那契数。 2.创建3个数a,b,c,依次先后滚动,可得出所有的斐波那契数&#xff0c…

椋鸟数据结构笔记#11:排序·下

文章目录 外排序(外部排序)文件拆分并排序归并文件两个文件归并多文件归并优化 萌新的学习笔记,写错了恳请斧正。 外排序(外部排序) 当数据量非常庞大以至于无法全部写入内存时,我们应该怎么排序这些数据呢…

贪吃蛇(C语言版)

在我们学习完C语言 和单链表知识点后 我们开始写个贪吃蛇的代码 目标:使用C语言在Windows环境的控制台模拟实现经典小游戏贪吃蛇 贪吃蛇代码实现的基本功能: 地图的绘制 蛇、食物的创建 蛇的状态(正常 撞墙 撞到自己 正常退出&#xf…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言:在上一章节中我们介绍并成功搭建了Eureka集群,本章节则介绍如何把微服务注册进Eureka集群,使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件,使这…

刷题之Leetcode242题(超级详细)

242.有效的字母异位词 力扣题目链接(opens new window)https://leetcode.cn/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2…

使用kali进行DDos攻击

使用kali进行DDos攻击 1、打开命令提示符,下载DDos-Attack python脚本 git clone https://github.com/Elsa-zlt/DDos-Attack 2、下载好之后,cd到DDos-Attack文件夹下 cd DDos-Attack 3、修改(设置)对ddos-attack.py文件执行的权…

抖音小店现在还能做吗?未来还有多大的发展空间?聊聊我的看法

大家好,我是电商笨笨熊 关于“抖店还能做吗”这样的问题,每年都有人在问; 尤其是今年来说,抖店已经走过了四五年的时间,很多人担心抖店还能走多远,还能做多久; 一些一直未进入抖店但持续在观…

【从零开始学习IO机制 | 第一篇】I/O的演进之路

前言: 自诞生以来,Java 一直是软件开发领域的重要一环。作为一种广泛应用于各种应用程序和系统的编程语言,Java 一直致力于提供高效、可靠的 I/O(输入/输出)操作,以满足不断增长的软件需求和用户期望。 Ja…

javaweb-数据库

数据库管理系统(DataBase Management System,简称DBMS) MySQL 官网:MySQL :: Developer Zone 安装 官网下载地址:MySQL :: Download MySQL Community Server (Archived Versions) 图形化工具 通常为了提高开发效…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下,只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了,甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

Linux部署MySQL8.0—手把手保姆级教程

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、下载MySQL8.0安装包二、安装MySQ…

顺序栈着三种结构定义及其初始化

定义 顺序堆栈这三种结构定义及其初始化 - 知乎 (zhihu.com) 根据以上链接得到: 1.理解为数组,top是这个数组的索引值;定义这个结构体类型时,系统不分配空间 在主函数声明时,定义了关于这个结构体的变量&#xff0c…

python基础知识三(运算符、while循环、for循环)

目录 运算符: 算术运算符: 比较运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: while循环: 1. while循环的语法: 2. while循环的执行过程&#xff1a…

Docker搭建Maven仓库Nexus

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

新技术前沿-2024-国内主流AI大模型架构及应用场景深度分析

参考国内主流AI 大模型架构及应用场景深度分析 2024 1 厂商总览 1.1 国外 (1)Open AI:GPT-4【美国旧金山的人工智能研究公司】 GPT-4于2023年3月14日发布,是千亿级参数的多模态预训练模型,能够支持图像和文本的输入。 (2)Anthropic(人类的):Claude【美国人工智能初创公司…

【前端技术】HTML基础入门篇

1.1 HTML简介 ​ HTML(HyperText Markup Language:超文本标记语言)是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组…

【嵌入式AI部署神经网络】STM32CubeIDE上部署神经网络之指纹识别(Pytorch)——篇一|环境搭建与模型初步部署篇

前言:本篇主要讲解搭建所需环境,以及基于pytorch框架在stm32cubeide上部署神经网络,部署神经网络到STM32单片机,本篇实现初步部署模型,没有加入训练集与验证集,将在第二篇加入。篇二详细讲解STM32CubeIDE上…