基于stm32C8T6的I2C通信学习记录(2)
·
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 指定地址写
- 当前地址读
- 指定地址写
- 总结
主要用的多的是指定地址写和指定地址读,目前只在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终止
}
更多推荐




所有评论(0)