IIC通信协议**(注意时序问题和数据发送顺序;翻车过)
1.软件模拟协议
2.硬件实现协议
I2C通信:两根同通信线SCL(时钟线),SDA(数据线) 同步,半双工,带数据应答,支持挂载多设备。
I2C通信的硬件电路:
主机控制SCL线
从机在主机的允许下可以对SDA控制
SCL和SDA均要配置成开漏输出模式,各添加一个上拉电阻一般为4.7k欧姆
这是个弱上拉加开漏输出的模式(杜绝短路现象,保护电路;避免引脚模式频繁切换;具有线与特性(多机通信))
时序单元:
(除了起始和终止,每个时序单元都是以低电平开始,低电平结束)
起始:SCL高电平,SDA下降沿
终止:SCL高电平,SDA上升沿
发送一个字节:SCL低电平,主机将数据位依次放到SDA上(高位先行),释放SCL;从机将在SCL高电平期间读取数据位,SCL高电平期间SDA不允许有数据变化;循环8次,即发送一个字节。
接收一个字节:SCL低电平,从机将数据放到SDA线上(高位先行),然后释放SCL,主机在SCL高电平期间读取数据位,期间SDA不允许变化;如此循环8次,即接收一个字节(主机在接收之前,释放SDA,相当于切换到输入模式)
发送应答:主机接受完一个字节后,下一个时钟发送一位数据:0表示应答,1表示非应答
接收应答:主机发送完一个字节后,下一个时钟接受一位数据,判断从机是否应答:0表示应答,1表示非应答(主机接收之前需要释放SDA)
MPU6050
AD0引脚可以更改模块的7位地址的最后一位
指定地址写:
对于指定设备(Slave Address)例如从机地址,在指定地址下(Reg Address),例如寄存器地址,写入指定数据Data;从机地址+读写位刚好是八位 0表示写,1表示读
从机地址
从机的寄存器地址
写入寄存器的数据
当前地址读:
对于指定从机设备,在当前地址指针指示的地址下,读取从机数据
从机地址+读(命令中没有需要读取的从机寄存器的地址,通过当前地址指针读取数据)
当前地址指针:该指针上电默认指向寄存器内的0地址,每写入/读出字节,都会使其自增,指向下一个位置
指定地址读:
对于指定从机,在指定寄存器地址内读取数据 (连续读取多个字节,只需在最后一个字节给从机发送非应答,其余字节都发送应答)
实现原理是前两个方式的相加,通过指定地址写的前两个命令,将当前地址指针指向需要读的寄存器地址,再执行当前地址读,读出指定地址的数据
Sr:start repeat重复起始条件
MPU6050
从机地址是七位,在用iic发送从机地址还需要加上一位读写位,所以发送字节时需要把七位从机地址左移一位,加上读写位
内部结构框图
寄存器映像:
0x19采样频率分频器:分频越小,内部AD转换越快,数据刷新越快
0x1A配置寄存器:可配置DLPF低通滤波器,参数越大数据抖动越小,不使用时,陀螺仪时钟为8KHz,使用时为1KHz
0x1B陀螺仪配置寄存器
0x1C加速度计配置寄存器
0x3B~0x40 xyz轴加速度数据寄存器
0x41~0x42温度DR
0x43~0x48陀螺仪xyz轴DR0x
0x6B~0x6C电源管理寄存器1、2 (寄存器1的值上电默认0x40,就是睡眠模式)
0x75元件ID(寄存器值上电默认0x68,其他默认0x00)