STM32 I²C通信

news2025/1/12 8:57:40

一、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;  //模式:IIC
	I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;  //应答使能
	I2C_InitStruct.I2C_ClockSpeed = 200000;  //时钟频率要小于400KHz
	I2C_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.coloradmin.cn/o/1618640.html

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

相关文章

CentOS配置JDK8环境并安装配置neo4j

1. 工具安装 1. 安装wget yum install -y wget2. 安装vim yum install -y vim-enhanced2. 配置JDK 1. 安装JDK 先到官网下载jdk8的压缩包,点我传送,并将压缩包上传到虚拟机的/usr/local目录下。 cd /usr/local # 进入 /usr/local目录 tar -zxvf jdk-…

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

代码随想录算法训练营第20天 |654.最大二叉树、 617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树 自己看到题目的第一想法看完代码随想录之后的想法自己实现过程中遇到哪些困难 链接: 654.最大二叉树 链接: 617.合并二叉树 链接: 700.二叉搜索树中的搜索 链接: 98.…

【MATLAB源码-第196期】基于matlab的A*融合DWA算法栅格路径规划仿真,画出路径图、姿态角度以及线角速度。

操作环境: MATLAB 2022a 1、算法描述 A算法与DWA算法的融合是一个高效的路径规划策略,这种策略将A算法的全局路径规划能力与DWA算法的局部避障能力结合起来,以期达到更快、更安全的导航效果。以下是对这种融合策略的详细描述。 一、基本概…

达梦工具使用-DTS

文章目录 前言一、图形化界面的DTS1.从Oracle迁移到DM2.从DM迁移到Oracle3.同构DM数据库迁移 二、命令行方式的DTS总结 前言 DTS是达梦数据库自带的数据迁移工具,主要场景适用于同构数据库轻量数据级之间数据迁移,当数据量不大时,也可用于不…

解决“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误方法

在计算机使用过程中,遇到诸如“找不到MSVCP120.dll”或“MSVCP120.dll丢失”的错误提示并不罕见。这类问题往往会导致某些应用程序无法正常运行,给用户带来困扰。本文旨在详细阐述MSVCP120.dll文件的重要性、其丢失的可能原因,以及解决方法&a…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 一、简单介绍 二、简单进行车牌检测和识别实现原理 …

ACRN Intel推出的虚拟机是啥样的?

前言 ACRN作为Intel为工控领域推出的一个小型化的虚拟机,它的特点主要有这么几个: 1.针对Intel的芯片做了非常强的优化 2.RT-VM实时虚拟机的实时性很好 3.CACHE缓存技术发挥的好 4.TCC技术 / 当然不是所有intel的芯片都支持,&#xff0c…

OKCC搭建配置什么样的服务器合适

OKCC呼叫中心系统是一种采用软硬件结合的架构方式、及分布式的IP技术,从多角度为企业提供整合的一体化解决方案。因此,搭建OKCC呼叫中心系统所使用的服务器应该满足以下几点要求: 稳定性:服务器需要具有较高的稳定性和可靠性&…

应用部署tomcat的三种方式

由于一直在用springboot框架,集成了tomcat,快忘记如何单独部署tomcat了,以下,记录一下: 部署tomcat有三种方式: 一、方式一:将war包丢进webapps 这是最简单粗暴的方式:将web工程打…

平均月薪超4.6万!AI领域重磅课程汇总,哈佛,斯坦福,微软,谷歌等出品!

2023年底,由脉脉高聘人才智库发布的《2023泛人工智能人才洞察》报告显示,2023年前八个月内新发布的AI岗位平均月薪超过了4.6万元,而且人才供不应求,甚至出现了5个岗位争夺2个人才的情况。 本文章整理了10项来自全球各高校与知名企…

语音聊天app软件、语音房软件开发

最近我们收到了众多客户咨询,他们都对语音聊天app非常感兴趣! 语音聊天app,在线组CP,一起连麦聊天、唱歌、打游戏,年轻人非常喜欢的语音社交软件,可以语音通话、多人语音房聊天、发布动态、会员充值等功能.大家可以在虚拟世界里快乐社交! 里面还有好玩的互动小游戏,帮助客户增…

[Meachines][Easy]Bizness

Main $ nmap -p- 10.10.11.252 --min-rate 1000 $ dirsearch -u https://bizness.htb/ $ whatweb https://bizness.htb/control/login 存在一个未授权的RCE $ git clone https://github.com/jakabakos/Apache-OFBiz-Authentication-Bypass.git $ cd Apache-OFBiz-Authenticat…

【webrtc】m98 RoundRobinPacketQueue的优先级处理

m98 代码 PacedSender::EnqueuePackets 的调用者可能是多个地方,所以这个要加锁保护。RoundRobinPacketQueue 本身是没有锁的发现m98和新版本不同,参考:【webrtc】m114自己实现的PrioritizedPacketQueuepush和pop都是RtpPacketToSend 但是实际上,内部是封装为QueuedPacket 处…

【笔试强训】牛牛快递

链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/41b42e7b3c3547e3acf8e90c41d98270?tpId290&tqId39852&ru/exam/oj描述 牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分…

基于RT-Thread的智能家居助手

一、项目简介 智能家居助手主要基于RT-Thread开发的,该系统主要分为语音子系统,环境监测子系统,智能控制子系统,智能网关子系统,音乐播放器,云端以及应用软件七大部分。语音子系统可通过语音进行人机交互来…

基于51单片机的温度、烟雾、防盗、GSM上报智能家居系统

基于51单片机的智能家居系统 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 1.DS18B20检测温度,MQ-2检测烟雾、ADC0832实现模数转换; 2.按键可以设置温度、烟雾浓度阈值&#x…

Linux加强篇-Shell命令脚本

目录 ⛳️推荐 编写Shell脚本 编写简单的脚本 接收用户的参数 判断用户的参数 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 编写Shell脚本 Shell脚本命令的工作方式有下面…

Hdu1350 Taxi Cab Scheme 【最小路径覆盖】

Taxi Cab Scheme 题意 有一张边长不超过 200 200 200 的网格图,有若干个乘客, 乘客 i i i 的需求是: h h : m m , ( a , b ) , ( c , d ) hh:mm, (a,b) , (c, d) hh:mm,(a,b),(c,d),意为他需要在 h h 时 m m 分 hh时mm分 hh时…

Kibana安装部署(Linux)

Kibana是Elasticsearch的开源可视化工具,与存储在Elasticsearch中的数据进行交互。 1. 下载软件 这里使用的Elasticsearch的版本是7.12.0,所以kibana选择同样的7.12.0版本。 官网下载地址:https://www.elastic.co/cn/downloads/past-releas…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装,操作系…