1.两根通信线:(同步半双工)
SCL:串行时钟线
SDA:串行数据线
2.带数据应答;支持总线挂载多设备(一主多从,多主多从)
3.硬件规定:
主机权利:任何时候,主机完全掌控SCL线;空闲状态,主机可以发出对SDA的控制,只有在从机发送数据和应答时,主机才会转交SDA控制权给从机
从机权利:任何时候,都只能被动读取SCL线;从机不能主动发起对SDA的控制,只有在主机发送读取从机的命令后或从机应答时,可以获取SDA控制权
硬件电路:所以I2C设备的SCL连在一起,SDA连在一起
SCL和SDA各外置弱上拉电阻,均配置成开漏输出(只能输出低电平)
4.软件规定:(主要看时序图)
起始条件:SCL高电平,同时SDA下降沿,且最终都处于低电平
终止条件:SCL高电平,同时SDA上升沿,且最终都处于高电平
发送一个字节:SCL低电平时,主机将数据位依次放到SDA上(高位先行),然后释放SCL,在SCL高电平时,从机读取数据位,依次循环上述八次,即可发送一个字节(可以看出主机对时序掌控的主导地位)
接收一个字节:SCL低电平,从机将数据位依次放到SDA上(高位先行),然后释放SCL,在SCL高电平时,主机读取数据位,依次循环上述八次,即可发送一个字节
发送应答:主机在接受完一个字节后,发送一位数据,0表示应答
接受应答:主机在发送完一个字节后,接受一位数据,判断从机是否应答,0表示应答
5.从机地址:
每个从机设备地址都要不一样,有的7位,有的10位
设备地址可在芯片手册里找到,一般器件地址最后几位时可以在电路中改变的(由引脚电平切换)
6.I2C时序:
指定地址写:指定设备指定地址写入指定数据;起始+从机地址位+读写位(0表示写)+应答位+指定地址+指定数据+应答+指定数据+应答。。。+非应答+停止 (写入一次数据后,地址指针自动+1)
当前地址读:读取指定设备的当前地址指针指示的地址里的从机数据;起始+从机地址位+读写位(1表示读)+应答位+读的时序。。。+非应答+停止
指定地址读:假指定地址写(到指定地址这一步,不写数据)+当前地址读;起始+从机地址位+读写位(0表示写)+应答位+指定地址+起始+从机地址位+读写位(1表示读)+应答位+读的时序。。。+非应答+停止
7.通信一般目的:方便主机读取从机的寄存器数据
MPU6050
(把PS和RM手册看一遍)
1.6轴姿态传感器:测量XYZ轴的加速度(加速度计A),角速度(陀螺仪传感器G);
9轴:3轴加速度,角速度,磁场强度
10轴:3轴加速度,角速度,磁场强度,1个气压强度
2.数据融合得到姿态角(欧拉角):装置相对于初始三个轴的夹角
3.3轴加速度计:静态稳定性;3轴陀螺仪:角速度积分得粗略角度,有动态稳定性
4.参数:
16位ADC模拟信号,范围(有符号数):-32768-32767;加速度计满量程选择(最大AD值对应加速度的最大量程是多少):正负2,4,8,16(g);陀螺仪满量程选择:正负250,500,1000,2000(度每秒) (量程越小,测量越精细;运动剧烈选大量程);可配置的数字低通滤波器(数据抖动厉害时可加,配置滤波器参数越大,输出数据抖动越小);可配置的时钟源;可配置的采样分频 (分频越小,AD转换越快)
5.I2C从机地址:1101 000(AD0=0)(0x68,如果它要当从机地址时,还需要将0x68左移一位(0xD1)后在加上读写位);1101 001(AD0=1)
6.内部的传感器(相当于一个可变电阻)产生模拟电压,进行AD转换后得到的传感器数据放入数据寄存器,读取寄存器就可以得传感器测量值;转换是内部自动进行的
7.XCL XDA引脚通常用于外接磁力计或气压计
8.每个传感器都有一个自测单元;使能自测,读数据,再失能自测,读数据,两数据相减得自测响应,若在芯片手册的自测响应范围内,则说明芯片正常
9.有电荷泵升压
10.FIFO 先入先出寄存器 对数据流缓存
11.DMP 芯片内部自带的姿态解算的硬件算法
12.上电默认是睡眠模式,需要解除
软件I2C读写MPU6050 代码部分:
配置SCL和SDA(GPIO初始化)->写好6个时序基本单元
拼接基本时序成数据帧
硬件I2C
1.STM32内部集成了硬件I2C收发电路;支持可变多主机模型;支持DMA;支持7位/10位地址;10位地址:11110+2位地址+1位读写位+8位地址;兼容SMBus协议
2.引脚固定;对应GPIO口要配置成复用、开漏输出模式
3.发送:数据写入数据寄存器,移位寄存器为空时,数据就转到移位寄存器,然后发送
4硬件I2C读写MPU6050.代码部分
配置I2C外设 初始化->控制外设电路 实现读写时序
1. |=:可以把一个字节的某些位置1,而不影响其他位
&=:可以把一个字节的某些位清0,而不影响其他位
^=:可以把一个字节的某些位取反,而不影响其他位