一、简介:
1.介绍:
(1)两根通信线:SCL(Serial Clock)、SDA(Serial Data),一根给时钟,一根放数据
(2)同步、半双工,带数据应答,支持挂载多设备(一主多从)
(3)优点:UART是异步的,双方时序必须要求十分严格才能正确传输,而I2C通过SCL给出时钟,故可以通过软件手动反转电平给出时钟,不依赖硬件。
2. 时序结构:
(1)起始,终止:
(2)发送和接收字节:
下面的SDA的两行是具体数据,可0可1,需要注意SCL拉高期间SDA不能变。
(3)发送和接收应答:
3.开漏输出+弱上拉模式(巧妙)
一主多从如图:CPU为主机,其他为从机,它们都挂载在同一根SDA和SCL上。
对于I2C协议来说,所有设备都要配置为开漏输出模式+弱上拉。
(1)什么是开漏输出+弱上拉?
开漏输出是,当一个模块对一根线配置电压0/1,输出0有驱动能力,将这根线上的电压置0,输出1则为高阻态,即模块与线断开。如果输出1断开,则这根线上的电压就没有配置,是不确定的,这不好,为了在输出1时这根线上电压为1,就如图所示,配置两个上拉电阻(隔着电阻接到Vdd),这样当输出0时,线上电压为0,输出1时,线上电压为1。
(2)为什么要用开漏输出+弱上拉?
有人要问,为什么不用推挽输出,输出0/1都有驱动,输出是多少,线上电压就是多少?
答:因为对于I2C协议,主机和从机都能控制线上电压,如果它们都为输出,且一个输出0,一个输出1,就短路了。而采用上面的模式,就好比,有一个带弹簧的杠杆,如果没人把它往下拉,弹簧会自动把杠杆拉上去,只要有一个人把杠杆往下拉,杠杆就会被拉下来。就结果而言,对于挂载在同一条线上的所有模块,只要有一个置0,则线上电压为0,只有都置1,线上电压才为1。解决了可能短路的问题。
4.如何收发内容:
从机地址:由于一主多从,主机向从机发送数据,需要确定向哪一个从机发送。故每一次发送数据,第一个字节为从机地址,每个其中前7位为从机地址(高位先行),最低位标志读写,0为主机写,1为读。
(1)指定地址写:
起始条件 + 从机地址(写)+ 控制字/指定地址 + 数据
注:第二个字节是控制字还是指定地址,是由从机来决定的。
(2)当前地址读:
(地址指针:对于一个从机,其内部是有寄存器的,由一个指针指向从机内的地址,称为地址指针。上面的指定地址写时序,中的第二个字节--指定地址,就是在移动地址指针。)
起始条件 + 从机地址(读)+ 数据
注:1.其中,从机地址字节最后一位为1(读)。
2.当主机给出从机地址读操作字节后,立即进入读环节,下一字节为从机放数据,数据为地址指针指向的数据。(问题:没有时间给指定地址)
(3)指定地址读:
起始条件 + 从机地址(写)+ 指定地址 + 起始条件 + 从机地址(读)+ 数据
注:很好理解,通过从机地址(写)+ 指定地址,改变地址指针的位置,再读数据。
(4)连续读写:
上边时序的数据部分,每成功写/读一个字节的数据,地址指针自动+1。
连续写:直接连续给出多个字节的数据(有应答),不给终止时序就可以了。
连续读:如果应答了,从机会继续放数据,就是连续读,给出非应答后停止。
二、MPU6050:
1.简介:
MPU6050是6轴姿态传感器,可以测量芯片自身XYZ轴(即空间各个方向)的加速度,角速度。
2.参数:
收集的加速度,角速度等信息需要转换为数据存储起来,就要用到ADC,本模块采用16位ADC采集传感器的模拟信号,范围-32768-32767
当ADC数值达到最大32767时,对应的实际模拟值,为满量程选择:
加速度计满量程选择:正负2,4,8,16,单位g(重力加速度)
陀螺仪满量程选择:正负250,500,1000,2000,单位 deg/s(度每秒)
模块利用I2C通信,地址:1101000(AD0=0,一个引脚),1101001(AD0=1)
(注:7位地址+1位读写标志位=1个字节)
3.硬件电路:
右侧为MPU6050芯片,左下为8针排针,左上为低压差LDO(低压差线性稳压器,可将5V电压压至3.3V给芯片供电)。
看左下角排针:
SCL、SDA:I2C通信引脚
XCL、XDA:主机I2C通信引脚,用于扩展,如外接磁力计等。
AD0:决定从机地址,默认低电平
INT:中断输出引脚,可配置一些中断
芯片内部还嵌入了DMP处理器,专用于解算姿态,配合官方提供的库使用。