STM32 I2C通信协议详解(一):基础知识与软件实现指南
目录
stm32 I2C通信协议(一)(基本知识和软件实现)
一、I2C基础知识
1)I2C通信

2)I2C硬件电路
- 防止电源短路,所有设备禁止强上拉模式
- 避免了输入输出的频繁切换
- 通过“线与”实现多主机模式下的时钟同步和总线仲裁

2)I2C时序基本单元



3)I2C完整时序


4)MPU6050简介


二、实验
1)软件I2C读写MPU6050
//写一个字节
void MPU6050_WriteReg(u8 RegAddress, u8 Data){
MyI2C_Start();
MyI2C_SendByte(0xD0);
MyI2C_ReceiveAck();
MyI2C_SendByte(RegAddress);
MyI2C_ReceiveAck();
MyI2C_SendByte(Data);
MyI2C_ReceiveAck();
MyI2C_Stop();
}
//读一个字节
u8 MPU6050_ReadReg(u8 RegAddress){
MyI2C_Start();
MyI2C_SendByte(0xD0);
MyI2C_ReceiveAck();
MyI2C_SendByte(RegAddress);
MyI2C_ReceiveAck();
MyI2C_Start();
MyI2C_SendByte(0xD1);
MyI2C_ReceiveAck();
u8 Data = MyI2C_ReceiveByte();
MyI2C_SendAck(1);
MyI2C_Stop();
return Data;
}
u8 MPU6050_GetID(void){
return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}
void MPU6050_Init(void){
MyI2C_Init();
MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x00);
MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);
}
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t*AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ){
int16_t DataH, DataL;
DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
*AccX = DataH << 8 | DataL;
DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
*AccY = DataH << 8 | DataL;
DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
*AccZ = DataH << 8 | DataL;
DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
*GyroX = DataH << 8 | DataL;
DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
*GyroY = DataH << 8 | DataL;
DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
*GyroZ = DataH << 8 | DataL;
}

完整代码见资源绑定
附学习参考网址
- STM32入门教程-2023版 细致讲解 中文字幕
欢迎大家有问题评论交流 (* ^ ω ^)
作者:茯苓gao