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主控芯片的中断引脚上



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

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

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


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


模块化源码
主函数
#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();
Motor_Init();
LEDInit();
MPU6050Init();
SPL06_Init();
NRF_Radio_Init();
if(HARDWARE_CHECK)
{
g_LedManager.emLEDPower = PowerOn;
}
gcs_init();
PID_Init();
USART_Init(USCI_A_UART_CLOCKSOURCE_ACLK,115200);
Timer_Init();
}