STM32学习笔记13-通信协议I2CMPU6050
I2C通信协议
I2C通信
- I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
- 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
SCL:串口时钟线:同步的时序,降低对硬件的依赖;
SDA:串口数据线:半双工,一根线兼具发送和接收;
- 同步,半双工
- 带数据应答
- 支持总线挂载多设备(一主多从、多主多从)
一主多从:单片机作为主机,主导I2C总线的运行,挂载在I2C总线的所有外部模块都是从机,从机只有被主机点名之后才能控制I2C总线——常用模型
在多主多从的情况下,需要额外调用SCL来达成同步,且复杂的协议
硬件电路(一主多从)
- 所有I2C设备的SCL连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏上拉输出模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出的电路结构
开漏输出:原本的推挽输出,是上下都接入高低电平,如果导通则强上拉导通高电平,反之;现在不需要上面电路,当电流导通,会进入浮空状态。
所以 这就是对应的开漏输出,当导通后属于浮空状态,这时就需要电阻
,把此电路改成弱上拉;
好处:
一、完全杜绝了电源短路的现象,保证电路安全——无论电流高或低,都不会存在同时高电平和低电平的情况;
二、避免了引脚模式的频繁切换,开漏加弱上拉的模式,同时兼具了输入和输出的功能——想换高电平可直接导通即可,低电平就连GND即可;
三、存在“线与”的现象,指只要有任意一个或多个设备输出了低电平,总线就处于低电平,反之;因此可以利用这特性,实现执行多主机模式下的时钟同步和总线仲裁
I2C时序基本单元
- 起始条件:SCL高电平期间,SDA从高电平切换到低电平
- 终止条件:SCL高电平期间,SDA从低电平切换到高电平
- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
低电平主机放数据,高电平从机读数据
- 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
释放SDA:就证明切换为了输入模式,主机一般默认是输入模式,当需要发送的时候,会将SDA拉低;在被动接收的时候,就必须先释放SDA,避免有数据重叠
低电平从机放数据,高电平主机读数据。
此时从机获得控制权,实现表示主机控制部分,虚线表从机控制的部分;
- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
- 发送一位或接收一位:这一位作为应答
地址:当主机发送指令,去访问对应设备,这些设备就要有一个独立的地址:
在I2C协议标准里分为7位和10位地址:7位为例,且7位使用范围最广:
厂商会为它分配一个7位的地址,以MPU6050芯片为例,通过芯片手册可以得知是:
1101 000,一般器件地址的最后几位是可以在电路中改变,这里是1101 000x;用来区分同器件的不同地址,当对应引脚接低电平,地址为1101 0000,反之
I2C时序:
都是一个字节的操作
- 指定地址写
- 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
示波器:
- 当前地址读
- 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
- 但是对应读地址,并不能确定当前的读入的地址,所以需要使用当前地址指针,去指向指定地址读
- 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
若要多个字节的操作,就需要把读和写的操作重复执行,这样时许就变为,在指定的位置开始按顺序连续读写入多个字节
MPU6050简介
- MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
- 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度,能确定静态稳定性
- 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度(绕X、Y、Z轴旋转的速度),能确定动态稳定性
我们通常都是把芯片内部的器件,想象为机器设备,至于怎么放进芯片的,就是公司的秘籍。
MPU6050参数
- 16位ADC采集传感器的模拟信号,分为2个字节存储,量化范围:-32768~32767
- 加速度计满量程选择:±2、±4、±8、±16(g:1g=9.8m/s)
- 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
- 可配置的数字低通滤波器
- 可配置的时钟源
- 可配置的采样分频
- I2C从机地址:1101000(AD0=0)——7位转换:110 1000——0x68
1101001(AD0=1)
在之前的时序中,读写的操作可以先拆分为7位:0x68,再<<1作为从机操作地址;也可以作4分的地址:0xD0的从机地址,直接修改即可;