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)实验现象

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

相关推荐
三佛科技-134163842121 小时前
智能窗帘方案开发,基于国产单片机电动窗帘方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
qiuiuiu4133 小时前
正点原子RK3568学习日志12-注册字符设备
linux·开发语言·单片机·学习·ubuntu
hazy1k3 小时前
51单片机基础-外部中断INT
stm32·单片机·嵌入式硬件·51单片机
Blossom.1185 小时前
把 AI“缝”进布里:生成式编织神经网络让布料自带摄像头
人工智能·python·单片机·深度学习·神经网络·目标检测·机器学习
lzj_pxxw6 小时前
嵌入式开发技巧:舍弃标志位,用宏定义函数实现程序单次运行
笔记·stm32·单片机·嵌入式硬件·学习
XINVRY-FPGA7 小时前
XCAU10P-2SBVB484I Xilinx Artix UltraScale+ FPGA
嵌入式硬件·fpga开发·云计算·硬件工程·dsp开发·射频工程·fpga
木子单片机7 小时前
基于51单片机温度检测报警
stm32·单片机·嵌入式硬件·51单片机·keil
hazy1k17 小时前
51单片机基础-步进电机控制
stm32·单片机·嵌入式硬件·51单片机
清风66666617 小时前
基于单片机的智能收银机模拟系统设计
数据库·单片机·毕业设计·nosql·课程设计
第二层皮-合肥18 小时前
RTC时钟原理
单片机·嵌入式硬件