#ifndef I2C_H #define I2C_H #include "stm32f10x.h" // I2C配置结构体 typedef struct { I2C_TypeDef* I2Cx; // 指向I2C外设的指针 uint32_t ClockSpeed; // I2C时钟速度 uint16_t OwnAddress; // I2C设备地址 GPIO_TypeDef* GPIOx; // 指向GPIO端口的指针 uint16_t SCL_Pin; // SCL引脚 uint16_t SDA_Pin; // SDA引脚 } I2C_Config; // I2C对象结构体 typedef struct { I2C_Config Config; void (*Init)(struct I2C* self); void (*Write)(struct I2C* self, uint8_t addr, uint8_t reg, uint8_t data); uint8_t (*Read)(struct I2C* self, uint8_t addr, uint8_t reg); } I2C; // 函数声明 void I2C_Init(I2C* self); void I2C_Write(I2C* self, uint8_t addr, uint8_t reg, uint8_t data); uint8_t I2C_Read(I2C* self, uint8_t addr, uint8_t reg); I2C I2C_Create(I2C_Config config); #endif // I2C_H
#include "i2c.h" // 初始化函数 void I2C_Init(I2C* self) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 初始化I2C GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = self->Config.SCL_Pin | self->Config.SDA_Pin; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(self->Config.GPIOx, &GPIO_InitStructure); // 初始化I2C if (self->Config.I2Cx == I2C1) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); } else if (self->Config.I2Cx == I2C2) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); } I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = self->Config.OwnAddress; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = self->Config.ClockSpeed; I2C_Init(self->Config.I2Cx, &I2C_InitStructure); I2C_Cmd(self->Config.I2Cx, ENABLE); } // 写数据函数 void I2C_Write(I2C* self, uint8_t addr, uint8_t reg, uint8_t data) { I2C_GenerateSTART(self->Config.I2Cx, ENABLE); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(self->Config.I2Cx, addr, I2C_Direction_Transmitter); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(self->Config.I2Cx, reg); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); I2C_SendData(self->Config.I2Cx, data); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(self->Config.I2Cx, ENABLE); } // 读数据函数 uint8_t I2C_Read(I2C* self, uint8_t addr, uint8_t reg) { uint8_t data; I2C_GenerateSTART(self->Config.I2Cx, ENABLE); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(self->Config.I2Cx, addr, I2C_Direction_Transmitter); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(self->Config.I2Cx, reg); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); I2C_GenerateSTART(self->Config.I2Cx, ENABLE); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(self->Config.I2Cx, addr, I2C_Direction_Receiver); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); while (!I2C_CheckEvent(self->Config.I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); data = I2C_ReceiveData(self->Config.I2Cx); I2C_GenerateSTOP(self->Config.I2Cx, ENABLE); return data; } // I2C对象创建函数 I2C I2C_Create(I2C_Config config) { I2C i2c; i2c.Config = config; i2c.Init = I2C_Init; i2c.Write = I2C_Write; i2c.Read = I2C_Read; return i2c; }
#ifndef MPU6050_H #define MPU6050_H #include "i2c.h" // MPU6050配置结构体 typedef struct { I2C* i2c; // 指向I2C对象的指针 uint8_t Address; // MPU6050设备地址 } MPU6050_Config; // MPU6050对象结构体 typedef struct { MPU6050_Config Config; } MPU6050; // 函数声明 void MPU6050_Init(MPU6050* self); void MPU6050_ReadAcceleration(MPU6050* self, int16_t* ax, int16_t* ay, int16_t* az); void MPU6050_ReadGyroscope(MPU6050* self, int16_t* gx, int16_t* gy, int16_t* gz); #endif // MPU6050_H
#include "mpu6050.h" #define MPU6050_REG_ACCEL_XOUT_H 0x3B #define MPU6050_REG_GYRO_XOUT_H 0x43 // 初始化函数 void MPU6050_Init(MPU6050* self) { // 可以在此处添加MPU6050的初始化代码 } // 读取加速度数据函数 void MPU6050_ReadAcceleration(MPU6050* self, int16_t* ax, int16_t* ay, int16_t* az) { uint8_t buffer[6]; // 读取加速度数据 self->Config.i2c->Write(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H, 0); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H, buffer[0]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H + 1, buffer[1]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H + 2, buffer[2]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H + 3, buffer[3]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H + 4, buffer[4]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_ACCEL_XOUT_H + 5, buffer[5]); // 将数据转换为16位有符号整数 *ax = (buffer[0] << 8) | buffer[1]; *ay = (buffer[2] << 8) | buffer[3]; *az = (buffer[4] << 8) | buffer[5]; } // 读取陀螺仪数据函数 void MPU6050_ReadGyroscope(MPU6050* self, int16_t* gx, int16_t* gy, int16_t* gz) { uint8_t buffer[6]; // 读取陀螺仪数据 self->Config.i2c->Write(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H, 0); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H, buffer[0]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H + 1, buffer[1]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H + 2, buffer[2]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H + 3, buffer[3]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H + 4, buffer[4]); self->Config.i2c->Read(self->Config.i2c, self->Config.Address, MPU6050_REG_GYRO_XOUT_H + 5, buffer[5]); // 将数据转换为16位有符号整数 *gx = (buffer[0] << 8) | buffer[1]; *gy = (buffer[2] << 8) | buffer[3]; *gz = (buffer[4] << 8) | buffer[5]; }
【无标题】自学 面向对象用的
最新推荐文章于 2024-10-04 16:27:57 发布