【无标题】自学 面向对象用的

#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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值