STM32模块:018 I2C通信Part.02实验

模块实验

实验一:软件I2C读写MPU6050

1)接线图

软件优势:端口不受限

硬件优势:执行效率高,节省CPU资源,能实现完整多主机通信,时序波形规整,通信速率快。

2)程序

提升程序语义的两种方法:1.函数宏定义,即有参宏:带参数的宏定义,宏定义内部的括号里的x可以是任意值。BitAction为枚举变量,值为0或1,此处为强制类型转换为枚举。2.函数封装:函数封装有利于程序移植到不同MCU时对函数内部进行修改,例如本次实验部分主频过高MCU需加入延迟函数。

1.引脚初始化
2.读写电平
3.基本时序单元(翻转电平时序)

start中要先拉高SDA,防止重复起始条件Sr被识别为停止条件。

Stop中不用拉低SCL的原因是发送完位后就是低电平。

4.MPU6050初始化

42.设置为不复位,取消睡眠模式,不循环模式,不使能温度传感器,选择内部陀螺仪时钟。

43.设置为不需要循环模式唤醒频率,不需要单轴独立待机。

44.10分频。

45.设置不外部同步,最大平滑滤波。

46.陀螺仪不自测,最大量程。

47.加速度计不自测,最大量程。

5.数据读写(基本时序单元组合)

6.主函数

3)实验现象

实验二:硬件I2C读写MPU6050

1)I2C外设介绍
1.简介

多主机模型:固定多主机和可变多主机,在没有设备加入或退出总线的情况下,固定多主机模式下主从机都不变且主机数量大于1,可变多主机主从机都可以变化且主机数量可以大于1。STM32为可变多主机。冲突时进行总线仲裁。

7位地址:1字节,地址+读写位。

10位地址:2字节,前5位为11110作为标志位+2位地址+读写位+8位地址。

作为同步时序,其通信速度的具体值并不严格,例如快速模式是约为400kHz。

SMBus:系统管理总线,由I2C改进而来,主要用于电源管理。

2.I2C外设框图

由于可变多主机模型,STM32默认情况下作为从机,当STM32被总线主机寻址时,STM32根据比较器判断收到的寻址是否与自身地址相同进而决定是否作为从机响应。STM32可设置2个地址(双地址寄存器+自身地址寄存器)。

PEC使用的硬件自带的CRC校验运算。

3.I2C基本结构图
4.操作流程

数据从DR进入移位寄存器的时间不计,只考虑DR和移位寄存器的读写时间。

EV事件:组合多个标志位的大标志位,EV事件位于状态寄存器中。

Start位由控制寄存器产生,起始条件产生后STM32由从模式自动进入主模式。停止条件相反。

发送序列:EV8事件期间为DR寄存器写入。数据N表示移位寄存器移位,移位完成后DR进入移位寄存器。DR等待移位寄存器发完数据后才能写入(EV8为DR写入下一个数据,所以要等待移位寄存器发完数据后获得此时的DR才能开始写,否则会覆盖),移位寄存器发送和DR写入同时进行,提高通信效率。当无数据写入时,移位寄存器为空,此时DR也为空,则产生8_2事件标志结束。EV8写入下一个数据

接收序列:EV7为读DR寄存器,数据N表示总线数据进入移位寄存器,两者同时进行,提高通信效率,EV7需等待数据进入移位寄存器完成才能开始读取(EV7为DR读取上一个移位寄存器数据,所以要等待上一个数据完全进入移位寄存器才能读)。EV7_1为读取倒2个数据,并设置ACK=0和STOP请求。

5.软硬件波形对比
2)接线图
3)函数
1.I2C函数
2.状态监控函数

645.基本状态监控,同时判断一个或多个标志位以确定EV事件发生。

651.高级状态监控,将SR1,SR2状态寄存器拼接成16位数据。

660.基于标志位的状态监控,单独判断某个标志位。

4)程序
1.初始化函数

注:其他部分与软件一致。

标准速度模式下,时钟占空比为1:1,即低电平和高电平的比率为1:1,快速模式下(100khz以上)可以调节占空比(I2C_DutyCycle)为2:1或者16:9,提高低电平时间的原因是低电平写入,高电平读取,而读取速度高于写入速度,由于周期过短,提高低电平能增加信号的写入时间。

2.数据写入

(与软件数据写入对比)

软件I2C函数为阻塞式函数,即函数执行完时信号已经发送完毕,而硬件函数为非阻塞式函数,通常情况下是设置寄存器,函数执行完代表寄存器设置完成而信号未必完全发送成功,此时需要等待标志位来确保函数的信号发送执行到位。

3.数据读取

(对比)

使用TRANSNUTTED(字节正在发送)会在寄存器地址发送完才开始产生重复起始信号,而使用TRANSNUTTING(字节发送完成)可能会产生完重复起始信号后等待寄存器地址发送完毕。

Receiver和Transmitter会自动设置地址最后一位读写位为1或0。

4.超时退出

程序中while循环过多容易造成程序卡死,因此需要设计超时退出机制。

替换所有CheckEvent为WaitEvent。

5)实验现象

(知识自学习专题,课程资料来源江协科技)

相关推荐
YTao_G1 小时前
STM32模块:022 PWR电源控制
stm32·单片机·嵌入式硬件
丁满与彭彭3 小时前
嵌入式学习笔记-MCU阶段-DAY01
笔记·单片机·学习
海海不掉头发4 小时前
【计算机组成原理】-CPU章节学习篇—笔记随笔
笔记·单片机·学习·考研·计算机组成原理
趣多多代言人4 小时前
从零开始手写嵌入式实时操作系统
开发语言·arm开发·单片机·嵌入式硬件·面试·职场和发展·嵌入式
h137286978695 小时前
Type-C PD快充协议智能芯片S312L详解
嵌入式硬件
不想学习\??!6 小时前
STM32-外部中断
stm32·单片机·嵌入式硬件
不想学习\??!7 小时前
STM32-定时器
stm32·单片机·嵌入式硬件
LIN-JUN-WEI7 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
LS_learner8 小时前
嵌入式系统中实现串口重定向
嵌入式硬件
景彡先生9 小时前
STM32中SPI协议详解
stm32·单片机·嵌入式硬件