公司动态
I2C通信协议
1.简介1.有两根通信线SCL,SDA2.同步半双工3.带数据应答4.支持总线挂载多设备一主多从即从机在主机点名后才能触碰总线多主多从在总线冲突时协议进行仲裁胜利的一方取得控制权失败自动变为从机多主机模式下还要进行时钟同步2.硬件电路1.所有SCL连载一起SDA连载一起2.设备的SCL和SDA均要配置位开漏输出模式3.SCL和SDA各添加一个上拉电阻阻值一般为4.7千欧4.主机权力对SCL线的完全控制在空闲状态下主机可以主动发起对SDA的控制只有在从机发送数据和从机应答时主机才会转交SDA控制权给从机5.从机权力在任何时候都只能被动读取SCL时钟线只有在主机发送读取从机命令后或从机应答时才能短暂获取SDA控制权6.有一个设备输出低电平总线就输出低电平只有设备全高电平总线才输出高电平可以利用这个特征执行多主机模式的时钟同步和总线仲裁3.软件规定时序基本单元1.起始条件SCL高电平期间SDA从高电平切换到低电平2.终止条件SCL高电平期间SDA从低电平切换到高电平3.发送一个字节SCL低电平期间主机将数据位一次放到SDA线上高位先行然后释放SCL从机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可发送一个字节4.接收一个字节SCL低电平期间从机将数据位依次放到SDA线上高位先行然后释放SCL主机将在SCL高电平期间读取数据位所以SCL高电平期间SDA不允许有数据变化依次循环上述过程8次即可接收一个字节主机在接收前需释放SDA5.发送和接收应答1.发送应答主机在接受完一个字节后在下一个时钟发送一位数据数据0表示应答1表示非应答2.接收应答主机在发送玩一个字节后在下一个时钟接收一位数据判断从机是否应答0表示应答1表示非应答主机在接收前需释放SDA4.完整时序1.指定地址写对于指定设备通过从机地址确定在指定地址设备内部寄存器地址下写入指定数据1.读写位为0要进行写入操作1为读出操作2.应答位主机释放SDASDA没回弹到高电平代表产生应答3.从机设备可指定第二个及后续字节用途一般为寄存器地址或指令控制字等2.当前地址读1.对于指定设备在当前地址指针指示的地址下读取从机数据2.在从机中所有寄存器被分配到了一个先行区域中并且会有一个单独的指针变量指示其中一个寄存器指针上电默认一般指向0地址并且没写u一个和读出一个字节后指针会自动自增一次移动到下一个位置主机尚未指定地址从机就会返回当前指针指向寄存器的值3.指定地址读1.对于指定设备在指定地址下读取从机数据5.MPU60501.简介1.是一个6轴姿态传感器可以测量芯片x,y,z方向的加速度和角速度通过数据统合可进一步得到姿态角常用于平衡车飞行器等2.3轴加速度计Acc或A测量x,y,z方向的加速度3.3轴陀螺仪传感器Gyro或G测量x,y,z轴的角速度2.主要参数1.16位ADC采集传感器的模拟信号量化范围-32768-327672.加速度计满量程选择-2-4-8-16g3.可配置的数字低通滤波器 让数据输出变得平缓4.可配置的时钟源5.可配置的采样分频6.I2C从机地址1101000AD00,1101001(AD01)7.陀螺仪满量程选择-250-500-1000-2000。/sec运动较剧烈满量程可选择大一些3.硬件电路4.模块框图1.内置加速度传感器 陀螺仪和温度传感器2.通过ADC进行模数转换转换完成后数据统一放到寄存器中读取寄存器就能得到传感器测量值了3.每个传感器都有自测单元用于验证芯片好坏启动自测后芯片内部会模拟一个外力施加在传感器上传感器先使能自测读取数据在失能自测读取数据两个数据详见得到自测响应4.电荷泵对模块进行升压5.中断状态寄存器可以控制内部的那些时间到中断引脚的输出6.FIFO先入先出寄存器可以对数据流进行缓存7.配置寄存器可以对内部的各个电路进行配置8.传感器寄存器数据寄存器存储了各个传感器的数据9.工厂校准内部的传感器都进行了校准10.数字运动处理器DMP芯片内部自带的一个姿态解算的硬件算法 配合DMP库可以进行姿态解算6.软件I2C操控MPU60501.软件I2C手动反转电平1.AD0引脚用于扩展从机最低位2.INT中断信号输出脚2.代码逻辑1.先建立I2C通信层的C和头文件2.在通信层写好GPIO初始化和6个时序基本单元起始终止发送字节接收字节发送应答接收应答3.建立MPU6050的c语言和头文件4.在主函数调用5.可以用宏定义来对端口进行重命名6.若起始条件之前SCL和SDA已经是高电平了先释放哪一个都是一样的结果Start还要兼容重复起始条件Sr最开始SCL是低电平SDA电平不确定为保险起见先释放SDA再释放SCL即可兼容其实条件和重复其实条件7.若Stop开始时SCL和SDA均为低电平先释放SCL再释放SDA但时序单元开始时SDA不一定是低电平为确保之后释放SDA能产生上升沿要在时序单元开始时先拉低SDA再释放SCL再释放SDA8.发送一个字节开始时SCL是低电平实际上除了终止条件SCL以高电平结束其他单元都会保证SCL以低电平结束以此方便各单元拼接