• 【STM32】IIC(Inter Integrated Cirruit--集成电路总线)


    【单片机】14-I2C通信之EEPROM-CSDN博客

    一、IIC总线协议介绍

    1.IIC简介

    同步(有时钟频率),半双工(同一个时间只能接收或者发送),串行(一个字节一个字节传输),高位读取

    一主多从:表示只能主机同意发送才可以发送

    多主多从:表示其中每一个人都有说话的权力,但是同一个时间只能有一个人说话【仲裁】

    2.IIC总线结构图

    1)主机控制SDA和SCL,只有从机发送应答的时候主动权才在从机上

    2)从机不允许控制SCL

    3.IIC协议时序

    应答:因为在CLK和SDA上有一个上拉电阻,表示在没有传入数据的时候,默认两个数据线上的电平为高电平。当我们接收到数据时,就要将电平从高电平拉低为低电平。所以nack(高电平)表示未接收到数据,ack(低电平)表示接收到数据。

    4.起始/停止代码

    起始/终止都是由主机产生的

    5.接收应答信号:主机--->从机

    表示当主机数据传输结束后,需要从机发送一个应答信号。

    主机将SDA拉高,如果从机接收到数据了,则将SDA拉低,

                                 如果没有接收到,则SDA不变(还是处于被主机拉高的状态)

    6.发送应答信号:从机-->主机

    7.发送非应答信号

    8.开始信号、结束信号、应答信号

    9.发送1字节数据

    1)SCL在低电平时期-->SDA将数据放上去-(此时数据放好了)-->SCL松开手(变为高电平)---->从机开始读取数据--(数据读取好了)->SCL拉低电平

    2)当在传输数据的时候,产生中断,此时SCL和SDA不会发生变化,会等待处理完成后在接着执行

    3)任何一个设备拉低电平,整个线上都是低电平

    4)只有全部设备都拉高,整个线上才会是高电平

    发送数据:低电平,主机发送数据

                      高电平,从机接收数据

    发送完数据就要是否SDA--》置为高电平

    10.接收1字节数据

    读取数据:低电平,从机发送数据【从机掌握SDA的控制权,所以主机要先是否SDA】

                      高电平,主机接收数据

    11.数据传输注意点

    IIC总线在进行数据传送时,时钟线SCL为低电平期间,发送器向数据线发送一位数据,此期间数据线上的信号允许发送变化,时钟线SCL为高电平期间,接收器从数据线上读取一位数据,此期间数据线上的信号不允许发生变化,需保持稳定。(即时钟线SCL的作用是告诉发送器什么时候发送数据,告诉接收器什么时候读取数据。故时钟线SCL既连在发送器上,又连在接收器上)

    12.重点:当前地址写时序图

    1.第一字节:指定地址写

    第一个数据=从机地址+读/写位

    0:写入操作

    1:读入操作

    2.第二字节:指定寄存器地址

    3.第三字节:传输数据

    13.当前地址读时序图

    0:写入操作

    1:读入操作

    由于当前地址读,当设置为读时序,就马上开始读,所以无法指定要读取哪一个寄存器的值。所以只能读取当前寄存器的值。

    14.重点:指定地址读时序图(复合格式)

    用于读取外挂寄存器的值

    为什么我们这里可以进行指定写寄存器的值???

    这里我们在当前地址读操作前加上指定地址写--->指定地址读=指定地址写+当前地址读

    2)记得最后结束的时候应答信号是0(非应答信号)

    二、MPU6050:6轴姿态传感器

    1.MPU6050简介

    10轴:3轴加速度+3轴角速度+3轴磁场强度+1个气压强度

    姿态角=欧拉角【比如飞机的左转,右转等】

    压了任意一个面,就会产生压力,输出对应的压力值

    加速度计(压力计):A

    具有静态稳定性,不具有动态稳定性(因为在运动的时候,计算出来的结果会有误差)

    陀螺传感器:G

    MPU6050中陀螺传感器测量的是角速度

    陀螺仪具有动态稳定性,不具有静态稳定性

    2.MPU6050参数

    1)满量程:等价于ADC转换中的Vref参考电压一样

    2)加速度的单位:g(1g=9.8m/s^2)

    3)

            如果MUP6050的从机地址为:0xD0(包含写地址位)或者0xD1(包含读地址位),表示将读/写位融入从机地址

          如果MUP6050的从机地址为:0x68(直接把7位地址转换位十六进制得到的),则在计算传入数据时要将数据(0x68<<1)再或与上读/写

    3.硬件电路

    根据我们此时的应用场景

    直接将J1引脚上的SCL和SDA直接接到我们对应STM32的IIC引出的RXD和TXD两个引脚上即可。

    4.MPU6050框图

    自测功能

    电荷泵

    升压自动的

    IIC接口

    5.略读数据手册

    MPU-6050_(TDK InvenSense(应美盛))MPU-6050中文资料_价格_PDF手册-立创电子商城 (szlcsc.com)

    三、软件IIC读写MPU6050

    软件IIC读写:实际上就是自己操控GPIO引脚的高低电平转换

    1.硬件连接

    2.模块划分

    3.IIC代码编写

    0.引脚的封装

    可移植性高

    1.iic_init()

    1)初始化为开漏输出,释放总线(置为高电平)

    2)SCL和SDA处于高电平,此时IIC处于空闲状态

    2.起始条件

    1)要先拉低SDA再拉低SCL

    2)先确保SDA和SCL都为高电平,然后再拉低SDA和SCL

    3.终止条件

    先拉低SDA(确保SDA是从低电平--->高电平)

    再拉高SCL

    最后拉高SDA

    4.发送一个字节

    1)将SCL拉低

    2)趁SCL为低,将数据放到SDA上

    3)将SCL拉高,开始读取SDA

    4)读取结束,将SCL拉低,准备下一次读取

    5.接收一个字节

    1)将SCL拉低

    2)将SDA释放---》表示将SDA的主动权交给从机(设置为高电平)【因为此时数据是从从机输出给主机】

    3)如果传输的是高电平则就就拉高,如果传输的是低电平则就拉低

    4)趁SCL为低,将数据放到SDA上

    5)将SCL拉高,开始读取SDA【判断SDA上是高电平还是低电平】

    6)读取结束,将SCL拉低,准备下一次读取

    6.发送应答

    1)将SCL拉低

    2)将应答数据放入SDA

    3)拉高SCL,开始读取应答信号

    4)拉低SCL,开始读取下一次数据

    7.接收应答

    1)将SCL拉低

    2)释放SDA--》将SDA主动权交给从机【因为此时数据是从从机输出给主机】

    3)将应答数据放入SDA

    4)拉高SCL,开始读取应答信号

    5)拉低SCL,开始读取下一次数据

    4.IIC测试代码

    指定地址写

    main.c

    5.MPU6050代码

    1.mpu6050写入寄存器

    2.mpu6050读入寄存器

    前面一部分和“ mpu6050写入寄存器 ”一样

    最后记得将应答信号修改为不应答

    6.MPU6050测试代码

    获取MPU6050的id

    [10-3] 软件I2C读写MPU6050_哔哩哔哩_bilibili

    未看完-->等待后面继续了解【44分】

  • 相关阅读:
    python中类的内置函数有哪些
    Docker:容器网络互联
    Oracle/PLSQL: Least Function
    Go 使用Viper处理Go应用程序的配置
    提前实现盈利的快手还有多少成长空间?
    【Azure 架构师学习笔记】- Azure Private Endpoint
    FFmpeg源码:get_bit_length函数分析
    dalle:zero-shot text-to-image generation
    【英语:基础进阶_读写专项训练】G6.翻译的技巧
    RK3568 + YT 9215交换机芯片,MAC TO MAC 调试记录
  • 原文地址:https://blog.csdn.net/m0_63077733/article/details/134492332