MPU6050的I2C通信协议

文章目录

  • I2C协议
    • 开始和结束通信
    • 读/写操作
    • 写时序
    • 读时序
  • 模块化源码
    • 主函数

I2C协议

  • I2C是由信号**串行数据(SDA)串行时钟(SCL)**组成的双线接口。半双工通信机制
  • MPU6050作为从设备与主系统处理器进行通信。SDA和SCL线通常需要上拉电阻(4.7k电阻)到VDD。最大总线速度是400 kHz。
  • MPU6050的从机地址为B110100X,长度为7位。7位地址的LSB位由引脚AD0的逻辑电平决定。这允许两个MPU6050连接到同个I2C总线,其中一个设备的地址应为B1101000 (AD0引脚为逻辑低电平) ,另一个的地址应为B1101001 (AD0引脚为逻辑高电平) 。
  • 本项目采用从机地址B1101000
  • MP_Int是中断引脚,可接到430主控芯片的中断引脚上

MPU6050的I2C通信协议_第1张图片

MPU6050的I2C通信协议_第2张图片

MPU6050的I2C通信协议_第3张图片

开始和结束通信

  • 主机在总线上的启动 I2C 通信条件:
  • SDA从高电平到低电平跳变 (高->低),SCL保持高电平
  • 结束条件为:
  • SDA从低电平到高电平跳变 (低->高),SCL保持高电平

MPU6050的I2C通信协议_第4张图片

读/写操作

  • 在开始条件(S)的通信之后,主机发送一个7位从机地址,然后是第8位(读/写位)(肯定是高位MSB)。
  • 读/写位指示主机是读取数据还是写入从器件。
  • 然后,主机释放SDA线并等待来自从设备的应答信号 (ACK)
  • 数据传输始终由具有STOP条件§的主机终止,从而释放通信线路。但是,主机可以产生一个重复的起始条件(Sr) ,并在不首先产生停止条件§的情况下寻址另一个从设备。
  • 除了启动和停止条件之外,所有SDA变化都应在SCL低电平时进行

MPU6050的I2C通信协议_第5张图片

写时序

  • 为了写入MPU6050寄存器,主机发送开始条件(S) ,然后是 12C地址和写入位(0) 。
  • 第9个时钟周期, MPU6050确认传输。然后主机把寄存器地址(RA) 放在总线上。
  • 在MPU6050确认接收到寄存器地址后,主机将寄存器数据放到总线上,接着是ACK信号,数据传输可以由停止条件§结束。
  • 《计算机组成原理》

MPU6050的I2C通信协议_第6张图片

MPU6050的I2C通信协议_第7张图片

读时序

  • 要读取内部MPU6050寄存器,主机将发送一个开始条件,然后是 I2C 地址和写入位,然后是要读取的寄存器地址。
  • 主机收到来自MPU6050的ACK信号后,发送一个起始信号,随后是从机地址和读取位。
  • 随后, MPU6050发送一个ACK信号和数据。

MPU6050的I2C通信协议_第8张图片

MPU6050的I2C通信协议_第9张图片

文章目录

  • I2C协议
    • 开始和结束通信
    • 读/写操作
    • 写时序
    • 读时序
  • 模块化源码
    • 主函数

模块化源码

主函数

#include "include.h"
void main()
{
    WDT_A_hold(WDT_A_BASE);
    _DINT();  //禁止所有中断
    //@@@
    Hardware_Init();//硬件初始化  
    _EINT();//使能中断
    while (1)
    {
        PollingKernel();  
    }
}

void Hardware_Init(void)
{
    System_Clock_Init();
    I2C_INit();			//IO口模拟IIC时序
    Motor_Init();
    LEDInit();			//LED灯闪初始化
    MPU6050Init();    	//g_MPUManager初始化
    SPL06_Init();		//SPL06初始化
    NRF_Radio_Init(); 
   	if(HARDWARE_CHECK)  //硬件检测
    {
        g_LedManager.emLEDPower = PowerOn;
    }
    
    gcs_init();   		//地面站通信初始化
    
    //@@@
    PID_Init();    		//PID参数初始化   
    
    USART_Init(USCI_A_UART_CLOCKSOURCE_ACLK,115200);
    Timer_Init();
}

你可能感兴趣的:(MPU6050的I2C通信协议)