提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 指定地址写
  • 当前地址读
  • 指定地址写
  • 总结

        主要用的多的是指定地址写和指定地址读,目前只在MPU6050上实践了I2c通信,主要还是要把握主机视角来完成编程。


指定地址写

借用江科大 的图来完成分析

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

#define MPU6050_ADDRESS		0xD0		//MPU6050的I2C从机地址
//指定地址写
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{
    MyI2c_Start();
    MyI2c_SendByte(MPU6050_ADDRESS);//发送从机地址,读写位为0,表示写入
    MyI2c_ReceiveAck();//接收应答
    MyI2c_SendByte(RegAddress);//发送寄存器地址
    MyI2c_ReceiveAck();//接收应答
    MyI2c_SendByte(Data);
    MyI2c_ReceiveAck();
    MyI2c_Stop();
}

当前地址读

对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

uint8_t MPU6050_ReadReg_Direct(uint8_t RegAddress)
{
    uint8_t Data;
    MyI2c_Start();
    MyI2c_SendByte(MPU6050_ADDRESS);
    MyI2c_ReceiveAck();
    Data = MyI2c_ReadByte();
    MyI2c_SendAck(1);
    MyI2c_Stop();
}

指定地址写

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数(Data)

//指定地址读
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{
    uint8_t Data;
    MyI2c_Start();//I2c起始
    MyI2c_SendByte(MPU6050_Adddress);//发送从机地址,读写位为0,表示即将写入
    MyI2c_ReceiveAck();//接收应答
    MyI2c_SendByte(RegAddress);//发送寄存器地址
    MyI2c_ReceiveAck();//接收应答
    
    MyI2c_Start();//再次起始
    MyI2c_SendByte(MPU6050_Adddress | 0x01);//发送从机地址,读写位为1,表示即将读取
    MyI2c_ReceiveAck();//接收应答
    Data = MyI2c_ReadByte();//接收指定寄存器的数据
    MyI2c_SendAck(1);//发送应答,给从机非应答,终止从机的数据输出
    MyI2c_Stop();//I2c终止
}

更多推荐