149 stm32 I2C总线通信.docx
《149 stm32 I2C总线通信.docx》由会员分享,可在线阅读,更多相关《149 stm32 I2C总线通信.docx(18页珍藏版)》请在冰豆网上搜索。
149stm32I2C总线通信
一、I2C总线通信原理
(一)I2C总线简介
1.I2C总线介绍
I2C(Inter-IntegratedCircuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。
它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。
2.I2C总线特征
两条总线线路:
一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下
可达3.4Mbit/s。
一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输。
3.I2C总线物理·拓扑结构
I2C总线在物理连接上分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。
通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。
在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
(二)I2C总线协议
●I2C协议规定:
总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。
起始和结束信号总是由主设备产生。
总线在空闲状态时,SCL和SDA都保持着高电平。
起始信号:
当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件
结束信号:
当SCL为高而SDA由低到高的跳变,表示产生一个停止条件
●数据传输
数据传输以字节为单位,主设备在SCL线上产生每个时钟脉冲的过程中将在SDA线上传输一个数据位,数据在时钟的高电平被采样,一个字节按数据位从高位到低位的顺序进行传输
主设备在传输有效数据之前要先指定从设备的地址,一般为7位,然后再发生数据传输的方向位,0表示主设备向从设备写数据,1表示主设备向从设备读数据
●应答信号
接收数据的器件在接收到8bit数据后,向发送数据的器件发出低电平的应答信号,表示已收到数据。
这个信号可以是主控器件发出,也可以是从动器件发出。
总之,由接收数据的器件发出。
(三)I2C总线读写操作
主设备往从设备写数据
主设备读从设备数据
主设备读从设备的某个寄存器
(四)STM32F0-I2C控制器特性
●软件模拟I2C时序
由于直接控制GPIO引脚电平产生通讯时序时,需要由CPU控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。
●硬件控制产生I2C时序
STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。
这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。
●I2C的主要特点
I2C总线规范rev03兼容性:
-从机模式和主机模式
-多主机功能
-标准模式(高达100kHz)
-快速模式(高达400kHz)
-超快速模式(高达1MHz)
-7位和10位地址模式
-软件复位
1字节缓冲带DMA功能
(五)STM32F0-I2C控制
SCL:
时钟,I2C1的话pb6或者8都可以
SDA:
数据传输
I2C的主要特点
§64KB片上闪存的F0带2个I2C:
I2C1和I2C2
§32KB片上闪存的F0只带1个I2C:
I2C1
§I2C2比I2C1所支持的功能少些,不具备
§对SMBus的硬件支持
§20mA的驱动能力
§模块双时钟域以及从停止模式唤醒
二、三轴加速度传感器mpu6050介绍
(一)mpu6050简介
1.MPU6050介绍
MPU-6050是全球首例6轴运动处理传感器。
它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(DigitalMotionProcessor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。
扩展之后还可以通过其I2C输出一个9轴的信号。
MPU-6050也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。
虽然陀螺仪可以测量加速度和角速度,但是大部分是用来测量角速度的。
2.三轴加速度测量
注意:
加速度测量计反应的加速向量与当前的受力方向是相反的,如上图,受力方向向左,但是加速度的向量方向为右
3.陀螺仪
陀螺仪,是用来测量角速度的,单位为度每秒(deg/s)
一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。
人们根据这个道理,用它来保持方向。
Mpu6050有3个陀螺仪,可测X,Y,Z方向的角速度值
(二)mpu6050特性参数
关于分辨率的计算:
首先加速度和陀螺仪都是16位的。
216/4(加速度测量范围+-2)=65536/4=16384
当加速度测量范围为+-2以上的时候,意味着分母越来越大,分辨率就越小。
(三)mpu6050寄存器介绍
1.POWERMANAGEMENT电源管理寄存器
SLEEP该位置1,MPU-60X0进入睡眠模式。
CLKSEL置0,可选择使用MPU-60X0默认的内部8M振荡器作为时钟源
●典型设置
//解除休眠状态
I2C_WriteReg(MPU6050_RA_PWR_MGMT_1,0x00);
2.SAMPLERATEDIVIDER采样频率分频器
采样频率=陀螺仪输出频率/(1+SMPLRT_DIV)
当DLPFsisdisabled(0DLPF_CFG=0ror7777)),陀螺输出频率=8kHz;
●典型设置
//陀螺仪采样率,1KHz
I2C_WriteReg(MPU6050_RA_SMPLRT_DIV,0x07);
3.CONFIGURATION低通滤波配置寄存器
该寄存器配置外部引脚采样,
陀螺仪和加速度计的数字低通滤波器。
●典型设置
//低通滤波频率,典型值:
0x06(带宽5KHz)
I2C_WriteReg(MPU6050_RA_CONFIG,0x06);
4.GYROSCOPECONFIGURATION陀螺仪配置寄存器
该寄存器是用来触发陀螺仪自检和配置陀螺仪的满量程范围。
●典型设置
陀螺仪自检及测量范围,典型值:
0x18(不自检,2000deg/s)
I2C_WriteReg(MPU6050_RA_GYRO_CONFIG,0x18);
5.ACCELEROMETERCONFIGURATION加速度配置寄存器
该寄存器是用来触发加速度计自检和配置加速度计的满量程范围。
●典型设置
//配置加速度传感器工作在2G模式,不自检
I2C_WriteReg(MPU6050_RA_ACCEL_CONFIG,0x00);
6.读取X,Y,Z三轴加速度的值
7.读取X,Y,Z三轴陀螺仪的值
8.读取温度值
摄氏度的温度可以用寄存器的置这么计算:
TemperatureninsdegreesC=
(TEMP_OUTRegistereValueasasignedquantity)/340+36.53
三、I2C通信实例
用I2C总线读取MPU6050数据
实验要求
利用STM32-I2C总线配置MPU6050,并读取三轴加速度的原始数据
(一)寄存器
●MPU6050的设备地址
因为AD0为高电平1,所以最终得到的地址为:
1101001。
这样给一位用户自己决定的好处在于,一个设备可以配备两个mpu6050,一个接地,一个接电源,地址是不同的。
(二)MPU6050电气原理图
NC表示可以未接,而我们板子实际上也是未接R4的,所以AD0和地是断开的。
因此AD0得到的是高电平1.
注:
R4未接,AD0直接接到电源上,因此设备地址为1101001既0x69
(三)Cubemx配置
虽然我们I2C1的SCL可以是PB6和8,但是我们MPU的SCL是连接到PB8的。
配置uart的波特率,I2C采用默认模式
(四)准备工作
1.将寄存器地址头文件加入
在老师的资料中有个mpu6050.h将所有相关寄存器地址都写在里面了。
将mpu6050.h复制到同一个project的Inc目录下。
2.创建新的mpu6050.c文件
新建一个文件,并按ctrl+s选择存放地点和存放名。
图是我保存后打开的。
(五)编写代码
1.从设备地址
写的时候方向为是0,所以最后一位是0,我们在头文件中已经封装好了
2.寄存器初始化
3.获取加速度
4.获取陀螺仪角速度
5.Main中获取初始值并循环取值
四、作业
利用I2C读取三轴传感器角速度的数值,并打印出来,可截图可录制视频演示结果