基于ESP32的SPI读取MPU9250数据
MPU9250集成了加速度计、陀螺仪、磁力计,能够比较精准的得到位姿信息,同时400KHZ的I2C和1MHZ的SPI让其更适用于对速度要求高的领域。
由于产品对速度的要求,我们选择采用速度更快的SPI进行读取,然而网上选择使用ESP32的SPI读取的资料很少,大多网友都选择I2C读取,官方提供的库又非常繁琐复杂,于是我大概摸索了一下,将STM32的读取程序和ESP32的库结合了一下,简化了代码,增加了可读性。
闲话少说,上代码
mpuspi.cpp
#include "mpuspi.h"
MPU mpu_value;
unsigned char BUF[6];
u8 x_axis,y_axis,z_axis;
SPISettings Setting;
void delay_us(int m)
{delayMicroseconds(m);
}
void delay_ms(int m)
{delay(m);
}
u8 SPI1_ReadWriteByte(u8 TxData)
{return SPI.transfer(TxData);
}/*u8 MPU9250_Write_Reg(u8 reg,u8 value)
{MPU_9250_ENABLE; // MPU9250_CS=0; u8 status=SPI1_ReadWriteByte(reg); SPI1_ReadWriteByte(value);MPU_9250_DISENABLE;// MPU9250_CS=1; return(status);
}*/
void MPU9250_Write_Reg(u8 reg,u8 value)
{SPI.beginTransaction(Setting);MPU_9250_ENABLE; // MPU9250_CS=0; SPI.transfer(reg); //delay_us(20);SPI.transfer(value);//delay_us(20);MPU_9250_DISENABLE;// MPU9250_CS=1; SPI.endTransaction();
}u8 MPU9250_Read_Reg(u8 reg)
{u8 reg_val;SPI.beginTransaction(Setting);MPU_9250_ENABLE;// MPU9250_CS=0; SPI1_ReadWriteByte(reg|0x80); //delay_us(5);reg_val=SPI1_ReadWriteByte(0xff);//delay_us(5);MPU_9250_DISENABLE;// MPU9250_CS=1; SPI.endTransaction(); return(reg_val);
}void i2c_Mag_write(u8 reg,u8 value)
{MPU9250_Write_Reg(I2C_SLV0_ADDR ,MPU9250_AK8963_ADDR);delay_us(200);MPU9250_Write_Reg(I2C_SLV0_REG ,reg);delay_us(200);MPU9250_Write_Reg(I2C_SLV0_DO ,value);delay_us(200);
}u8 i2c_Mag_read(u8 reg)
{MPU9250_Write_Reg(I2C_SLV0_ADDR ,MPU9250_AK8963_ADDR|0x80); delay_us(200);MPU9250_Write_Reg(I2C_SLV0_REG ,reg);// set reg addrdelay_us(200);MPU9250_Write_Reg(I2C_SLV0_DO ,0xff);//readdelay_us(200);return MPU9250_Read_Reg(EXT_SENS_DATA_00);
}void Init_MPU9250(void)
{ MPU9250_Write_Reg(PWR_MGMT_1, 0x80); delay_ms(1000);/**********************Init SLV0 i2c**********************************/
//Use SPI-bus read slave0MPU9250_Write_Reg(INT_PIN_CFG ,0x32);// INT Pin / Bypass Enable Configuration MPU9250_Write_Reg(I2C_MST_CTRL,0x4d);//I2C MAster mode and Speed 400 kHzMPU9250_Write_Reg(USER_CTRL ,0x20); // I2C_MST _EN MPU9250_Write_Reg(I2C_MST_DELAY_CTRL ,0x01);MPU9250_Write_Reg(I2C_SLV0_CTRL ,0x81); //enable IIC and EXT_SENS_DATA==1 Byte//*******************Init GYRO and ACCEL******************************/ MPU9250_Write_Reg(CONFIG, 0x07); MPU9250_Write_Reg(SMPLRT_DIV, 0x07); MPU9250_Write_Reg(GYRO_CONFIG, 0x10); MPU9250_Write_Reg(ACCEL_CONFIG_2, 0x08);MPU9250_Write_Reg(ACCEL_CONFIG, 0x10);/**********************Init MAG **********************************/i2c_Mag_write(AK8963_CNTL2_REG,AK8963_CNTL2_SRST); // Reset AK8963i2c_Mag_write(AK8963_CNTL1_REG,0x12); // use i2c to set AK8963 working on Continuous measurement mode1 & 16-bit output // MPU9250_Write_Reg(MPU9250_RA_FIFO_EN, 0xFF);//FIFO??
// delay_ms(10);// /***********************DMP??**********************************/
// MPU9250_Write_Reg(MPU9250_RA_INT_PIN_CFG,0x00);
// MPU9250_Write_Reg(MPU9250_RA_INT_ENABLE,0x01); delay_ms(10);
}void READ_MPU9250_ACCEL(void)//
{ BUF[0]=MPU9250_Read_Reg(ACCEL_XOUT_L); BUF[1]=MPU9250_Read_Reg(ACCEL_XOUT_H);mpu_value.Accel[0]= (BUF[1]<<8)|BUF[0];mpu_value.Accel[0]/=164; BUF[2]=MPU9250_Read_Reg(ACCEL_YOUT_L);BUF[3]=MPU9250_Read_Reg(ACCEL_YOUT_H);mpu_value.Accel[1]= (BUF[3]<<8)|BUF[2];mpu_value.Accel[1]/=164; BUF[4]=MPU9250_Read_Reg(ACCEL_ZOUT_L); BUF[5]=MPU9250_Read_Reg(ACCEL_ZOUT_H);mpu_value.Accel[2]= (BUF[5]<<8)|BUF[4];mpu_value.Accel[2]/=164;
}void READ_MPU9250_GYRO(void)
{ BUF[0]=MPU9250_Read_Reg(GYRO_XOUT_L); BUF[1]=MPU9250_Read_Reg(GYRO_XOUT_H);mpu_value.Gyro[0]= (BUF[1]<<8)|BUF[0];mpu_value.Gyro[0]/=164; BUF[2]=MPU9250_Read_Reg(GYRO_YOUT_L);BUF[3]=MPU9250_Read_Reg(GYRO_YOUT_H);mpu_value.Gyro[1]= (BUF[3]<<8)|BUF[2];mpu_value.Gyro[1]/=164; BUF[4]=MPU9250_Read_Reg(GYRO_ZOUT_L);BUF[5]=MPU9250_Read_Reg(GYRO_ZOUT_H);mpu_value.Gyro[2]= (BUF[5]<<8)|BUF[4];mpu_value.Gyro[2]/=164;
}void READ_MPU9250_MAG(void)
{
// u8 x_axis,y_axis,z_axis; x_axis=i2c_Mag_read(AK8963_ASAX);y_axis=i2c_Mag_read(AK8963_ASAY);z_axis=i2c_Mag_read(AK8963_ASAZ);if((i2c_Mag_read(AK8963_ST1_REG)&AK8963_ST1_DOR)==0)//data ready{BUF[0]=i2c_Mag_read(MAG_XOUT_L); //Low data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register & check Magnetic sensor overflow occurred {BUF[0]=i2c_Mag_read(MAG_XOUT_L);//reload data} BUF[1]=i2c_Mag_read(MAG_XOUT_H); //High data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register{BUF[1]=i2c_Mag_read(MAG_XOUT_H);}mpu_value.Mag[0]=((BUF[1]<<8)|BUF[0])*(((x_axis-128)>>8)+1); BUF[2]=i2c_Mag_read(MAG_YOUT_L); //Low data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register{BUF[2]=i2c_Mag_read(MAG_YOUT_L);} BUF[3]=i2c_Mag_read(MAG_YOUT_H); //High data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register{BUF[3]=i2c_Mag_read(MAG_YOUT_H);}mpu_value.Mag[1]=((BUF[3]<<8)|BUF[2])*(((y_axis-128)>>8)+1); BUF[4]=i2c_Mag_read(MAG_ZOUT_L); //Low data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register{BUF[4]=i2c_Mag_read(MAG_ZOUT_L);} BUF[5]=i2c_Mag_read(MAG_ZOUT_H); //High data if((i2c_Mag_read(AK8963_ST2_REG)&AK8963_ST2_HOFL)==1)// data reading end register{BUF[5]=i2c_Mag_read(MAG_ZOUT_H);}mpu_value.Mag[2]=((BUF[5]<<8)|BUF[4])*(((z_axis-128)>>8)+1); }
}
mpuspi.h
#include <Arduino.h>
#include <SPI.h>
#define u8 unsigned char
#define MPU_9250_ENABLE digitalWrite(27,LOW)
#define MPU_9250_DISENABLE digitalWrite(27,HIGH)
#define SMPLRT_DIV 0x19 //陀螺仪采样率
#define CONFIG 0x1A
#define GYRO_CONFIG 0x1B
#define ACCEL_CONFIG 0x1C
#define ACCEL_CONFIG_2 0x1D #define INT_PIN_CFG 0x37 //中断配置
#define USER_CTRL 0x6a
#define I2C_MST_CTRL 0x24
#define I2C_MST_DELAY_CTRL 0x67
//--------------------i2c slv0-------------------------------//
#define I2C_SLV0_ADDR 0x25
#define I2C_SLV0_REG 0x26
#define I2C_SLV0_CTRL 0x27
#define I2C_SLV0_DO 0x63 //output reg
//--------------------AK8963 reg addr------------------------//
#define MPU9250_AK8963_ADDR 0x0C //AKM addr
#define AK8963_WHOAMI_REG 0x00 //AKM ID addr
#define AK8963_WHOAMI_ID 0x48 //ID
#define AK8963_ST1_REG 0x02 //Data Status1
#define AK8963_ST2_REG 0x09 //Data reading end register & check Magnetic sensor overflow occurred
#define AK8963_ST1_DOR 0x02
#define AK8963_ST1_DRDY 0x01 //Data Ready
#define AK8963_ST2_BITM 0x10
#define AK8963_ST2_HOFL 0x08 // Magnetic sensor overflow
#define AK8963_CNTL1_REG 0x0A
#define AK8963_CNTL2_REG 0x0B
#define AK8963_CNTL2_SRST 0x01 //soft Reset
#define AK8963_ASAX 0x10 //X-axis sensitivity adjustment value
#define AK8963_ASAY 0x11 //Y-axis sensitivity adjustment value
#define AK8963_ASAZ 0x12 //Z-axis sensitivity adjustment value
//--------------------9axis reg addr-----------------------//
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41 //temperture
#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48#define MAG_XOUT_L 0x03
#define MAG_XOUT_H 0x04
#define MAG_YOUT_L 0x05
#define MAG_YOUT_H 0x06
#define MAG_ZOUT_L 0x07
#define MAG_ZOUT_H 0x08
//--------------------other reg addr-----------------------//
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
#define WHO_AM_I 0x75 //ID地址寄存器(正确数值0x71,只读)#define EXT_SENS_DATA_00 0x49 //MPU9250 IIC外挂器件读取返回寄存器00
#define EXT_SENS_DATA_01 0x4a //MPU9250 IIC外挂器件读取返回寄存器01
#define EXT_SENS_DATA_02 0x4b //MPU9250 IIC外挂器件读取返回寄存器02
#define EXT_SENS_DATA_03 0x4c //MPU9250 IIC外挂器件读取返回寄存器03/************Reg ***********************/
#define MPU9250_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU9250_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU9250_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU9250_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN
#define MPU9250_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN
#define MPU9250_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN
#define MPU9250_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
#define MPU9250_RA_XA_OFFS_L_TC 0x07
#define MPU9250_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
#define MPU9250_RA_YA_OFFS_L_TC 0x09
#define MPU9250_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
#define MPU9250_RA_ZA_OFFS_L_TC 0x0B
#define MPU9250_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR
#define MPU9250_RA_XG_OFFS_USRL 0x14
#define MPU9250_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR
#define MPU9250_RA_YG_OFFS_USRL 0x16
#define MPU9250_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR
#define MPU9250_RA_ZG_OFFS_USRL 0x18
#define MPU9250_RA_SMPLRT_DIV 0x19
#define MPU9250_RA_CONFIG 0x1A
#define MPU9250_RA_GYRO_CONFIG 0x1B
#define MPU9250_RA_ACCEL_CONFIG 0x1C
#define MPU9250_RA_ACCEL_CONFIG_2 0x1D
#define MPU9250_RA_LP_ACCEL_ODR 0x1E
#define MPU9250_RA_MOT_THR 0x1F
#define MPU9250_RA_MOT_DUR 0x20
#define MPU9250_RA_ZRMOT_THR 0x21
#define MPU9250_RA_ZRMOT_DUR 0x22
#define MPU9250_RA_FIFO_EN 0x23
#define MPU9250_RA_I2C_MST_CTRL 0x24
#define MPU9250_RA_I2C_SLV0_ADDR 0x25
#define MPU9250_RA_I2C_SLV0_REG 0x26
#define MPU9250_RA_I2C_SLV0_CTRL 0x27
#define MPU9250_RA_I2C_SLV1_ADDR 0x28
#define MPU9250_RA_I2C_SLV1_REG 0x29
#define MPU9250_RA_I2C_SLV1_CTRL 0x2A
#define MPU9250_RA_I2C_SLV2_ADDR 0x2B
#define MPU9250_RA_I2C_SLV2_REG 0x2C
#define MPU9250_RA_I2C_SLV2_CTRL 0x2D
#define MPU9250_RA_I2C_SLV3_ADDR 0x2E
#define MPU9250_RA_I2C_SLV3_REG 0x2F
#define MPU9250_RA_I2C_SLV3_CTRL 0x30
#define MPU9250_RA_I2C_SLV4_ADDR 0x31
#define MPU9250_RA_I2C_SLV4_REG 0x32
#define MPU9250_RA_I2C_SLV4_DO 0x33
#define MPU9250_RA_I2C_SLV4_CTRL 0x34
#define MPU9250_RA_I2C_SLV4_DI 0x35
#define MPU9250_RA_I2C_MST_STATUS 0x36
#define MPU9250_RA_INT_PIN_CFG 0x37
#define MPU9250_RA_INT_ENABLE 0x38
#define MPU9250_RA_DMP_INT_STATUS 0x39
#define MPU9250_RA_INT_STATUS 0x3A
#define MPU9250_RA_ACCEL_XOUT_H 0x3B
#define MPU9250_RA_ACCEL_XOUT_L 0x3C
#define MPU9250_RA_ACCEL_YOUT_H 0x3D
#define MPU9250_RA_ACCEL_YOUT_L 0x3E
#define MPU9250_RA_ACCEL_ZOUT_H 0x3F
#define MPU9250_RA_ACCEL_ZOUT_L 0x40
#define MPU9250_RA_TEMP_OUT_H 0x41
#define MPU9250_RA_TEMP_OUT_L 0x42
#define MPU9250_RA_GYRO_XOUT_H 0x43
#define MPU9250_RA_GYRO_XOUT_L 0x44
#define MPU9250_RA_GYRO_YOUT_H 0x45
#define MPU9250_RA_GYRO_YOUT_L 0x46
#define MPU9250_RA_GYRO_ZOUT_H 0x47
#define MPU9250_RA_GYRO_ZOUT_L 0x48
#define MPU9250_RA_EXT_SENS_DATA_00 0x49
#define MPU9250_RA_EXT_SENS_DATA_01 0x4A
#define MPU9250_RA_EXT_SENS_DATA_02 0x4B
#define MPU9250_RA_EXT_SENS_DATA_03 0x4C
#define MPU9250_RA_EXT_SENS_DATA_04 0x4D
#define MPU9250_RA_EXT_SENS_DATA_05 0x4E
#define MPU9250_RA_EXT_SENS_DATA_06 0x4F
#define MPU9250_RA_EXT_SENS_DATA_07 0x50
#define MPU9250_RA_EXT_SENS_DATA_08 0x51
#define MPU9250_RA_EXT_SENS_DATA_09 0x52
#define MPU9250_RA_EXT_SENS_DATA_10 0x53
#define MPU9250_RA_EXT_SENS_DATA_11 0x54
#define MPU9250_RA_EXT_SENS_DATA_12 0x55
#define MPU9250_RA_EXT_SENS_DATA_13 0x56
#define MPU9250_RA_EXT_SENS_DATA_14 0x57
#define MPU9250_RA_EXT_SENS_DATA_15 0x58
#define MPU9250_RA_EXT_SENS_DATA_16 0x59
#define MPU9250_RA_EXT_SENS_DATA_17 0x5A
#define MPU9250_RA_EXT_SENS_DATA_18 0x5B
#define MPU9250_RA_EXT_SENS_DATA_19 0x5C
#define MPU9250_RA_EXT_SENS_DATA_20 0x5D
#define MPU9250_RA_EXT_SENS_DATA_21 0x5E
#define MPU9250_RA_EXT_SENS_DATA_22 0x5F
#define MPU9250_RA_EXT_SENS_DATA_23 0x60
#define MPU9250_RA_MOT_DETECT_STATUS 0x61
#define MPU9250_RA_I2C_SLV0_DO 0x63
#define MPU9250_RA_I2C_SLV1_DO 0x64
#define MPU9250_RA_I2C_SLV2_DO 0x65
#define MPU9250_RA_I2C_SLV3_DO 0x66
#define MPU9250_RA_I2C_MST_DELAY_CTRL 0x67
#define MPU9250_RA_SIGNAL_PATH_RESET 0x68
#define MPU9250_RA_MOT_DETECT_CTRL 0x69
#define MPU9250_RA_USER_CTRL 0x6A
#define MPU9250_RA_PWR_MGMT_1 0x6B
#define MPU9250_RA_PWR_MGMT_2 0x6C
#define MPU9250_RA_BANK_SEL 0x6D
#define MPU9250_RA_MEM_START_ADDR 0x6E
#define MPU9250_RA_MEM_R_W 0x6F
#define MPU9250_RA_DMP_CFG_1 0x70
#define MPU9250_RA_DMP_CFG_2 0x71
#define MPU9250_RA_FIFO_COUNTH 0x72
#define MPU9250_RA_FIFO_COUNTL 0x73
#define MPU9250_RA_FIFO_R_W 0x74
#define MPU9250_RA_WHO_AM_I 0x75#define MPU9250_RA_MAG_XOUT_L 0x03
#define MPU9250_RA_MAG_XOUT_H 0x04
#define MPU9250_RA_MAG_YOUT_L 0x05
#define MPU9250_RA_MAG_YOUT_H 0x06
#define MPU9250_RA_MAG_ZOUT_L 0x07
#define MPU9250_RA_MAG_ZOUT_H 0x08#define MPU9250_TC_PWR_MODE_BIT 7
#define MPU9250_TC_OFFSET_BIT 6
#define MPU9250_TC_OFFSET_LENGTH 6
#define MPU9250_TC_OTP_BNK_VLD_BIT 0#define MPU9250_VDDIO_LEVEL_VLOGIC 0
#define MPU9250_VDDIO_LEVEL_VDD 1#define MPU9250_CFG_EXT_SYNC_SET_BIT 5
#define MPU9250_CFG_EXT_SYNC_SET_LENGTH 3
#define MPU9250_CFG_DLPF_CFG_BIT 2
#define MPU9250_CFG_DLPF_CFG_LENGTH 3#define MPU9250_EXT_SYNC_DISABLED 0x0
#define MPU9250_EXT_SYNC_TEMP_OUT_L 0x1
#define MPU9250_EXT_SYNC_GYRO_XOUT_L 0x2
#define MPU9250_EXT_SYNC_GYRO_YOUT_L 0x3
#define MPU9250_EXT_SYNC_GYRO_ZOUT_L 0x4
#define MPU9250_EXT_SYNC_ACCEL_XOUT_L 0x5
#define MPU9250_EXT_SYNC_ACCEL_YOUT_L 0x6
#define MPU9250_EXT_SYNC_ACCEL_ZOUT_L 0x7#define MPU9250_DLPF_BW_256 0x00
#define MPU9250_DLPF_BW_188 0x01
#define MPU9250_DLPF_BW_98 0x02
#define MPU9250_DLPF_BW_42 0x03
#define MPU9250_DLPF_BW_20 0x04
#define MPU9250_DLPF_BW_10 0x05
#define MPU9250_DLPF_BW_5 0x06#define MPU9250_GCONFIG_FS_SEL_BIT 4
#define MPU9250_GCONFIG_FS_SEL_LENGTH 2#define MPU9250_GYRO_FS_250 0x00
#define MPU9250_GYRO_FS_500 0x01
#define MPU9250_GYRO_FS_1000 0x02
#define MPU9250_GYRO_FS_2000 0x03#define MPU9250_ACONFIG_XA_ST_BIT 7
#define MPU9250_ACONFIG_YA_ST_BIT 6
#define MPU9250_ACONFIG_ZA_ST_BIT 5
#define MPU9250_ACONFIG_AFS_SEL_BIT 4
#define MPU9250_ACONFIG_AFS_SEL_LENGTH 2
#define MPU9250_ACONFIG_ACCEL_HPF_BIT 2
#define MPU9250_ACONFIG_ACCEL_HPF_LENGTH 3#define MPU9250_ACCEL_FS_2 0x00
#define MPU9250_ACCEL_FS_4 0x01
#define MPU9250_ACCEL_FS_8 0x02
#define MPU9250_ACCEL_FS_16 0x03#define MPU9250_DHPF_RESET 0x00
#define MPU9250_DHPF_5 0x01
#define MPU9250_DHPF_2P5 0x02
#define MPU9250_DHPF_1P25 0x03
#define MPU9250_DHPF_0P63 0x04
#define MPU9250_DHPF_HOLD 0x07#define MPU9250_TEMP_FIFO_EN_BIT 7
#define MPU9250_XG_FIFO_EN_BIT 6
#define MPU9250_YG_FIFO_EN_BIT 5
#define MPU9250_ZG_FIFO_EN_BIT 4
#define MPU9250_ACCEL_FIFO_EN_BIT 3
#define MPU9250_SLV2_FIFO_EN_BIT 2
#define MPU9250_SLV1_FIFO_EN_BIT 1
#define MPU9250_SLV0_FIFO_EN_BIT 0#define MPU9250_MULT_MST_EN_BIT 7
#define MPU9250_WAIT_FOR_ES_BIT 6
#define MPU9250_SLV_3_FIFO_EN_BIT 5
#define MPU9250_I2C_MST_P_NSR_BIT 4
#define MPU9250_I2C_MST_CLK_BIT 3
#define MPU9250_I2C_MST_CLK_LENGTH 4#define MPU9250_CLOCK_DIV_348 0x0
#define MPU9250_CLOCK_DIV_333 0x1
#define MPU9250_CLOCK_DIV_320 0x2
#define MPU9250_CLOCK_DIV_308 0x3
#define MPU9250_CLOCK_DIV_296 0x4
#define MPU9250_CLOCK_DIV_286 0x5
#define MPU9250_CLOCK_DIV_276 0x6
#define MPU9250_CLOCK_DIV_267 0x7
#define MPU9250_CLOCK_DIV_258 0x8
#define MPU9250_CLOCK_DIV_500 0x9
#define MPU9250_CLOCK_DIV_471 0xA
#define MPU9250_CLOCK_DIV_444 0xB
#define MPU9250_CLOCK_DIV_421 0xC
#define MPU9250_CLOCK_DIV_400 0xD
#define MPU9250_CLOCK_DIV_381 0xE
#define MPU9250_CLOCK_DIV_364 0xF#define MPU9250_I2C_SLV_RW_BIT 7
#define MPU9250_I2C_SLV_ADDR_BIT 6
#define MPU9250_I2C_SLV_ADDR_LENGTH 7
#define MPU9250_I2C_SLV_EN_BIT 7
#define MPU9250_I2C_SLV_BYTE_SW_BIT 6
#define MPU9250_I2C_SLV_REG_DIS_BIT 5
#define MPU9250_I2C_SLV_GRP_BIT 4
#define MPU9250_I2C_SLV_LEN_BIT 3
#define MPU9250_I2C_SLV_LEN_LENGTH 4#define MPU9250_I2C_SLV4_RW_BIT 7
#define MPU9250_I2C_SLV4_ADDR_BIT 6
#define MPU9250_I2C_SLV4_ADDR_LENGTH 7
#define MPU9250_I2C_SLV4_EN_BIT 7
#define MPU9250_I2C_SLV4_INT_EN_BIT 6
#define MPU9250_I2C_SLV4_REG_DIS_BIT 5
#define MPU9250_I2C_SLV4_MST_DLY_BIT 4
#define MPU9250_I2C_SLV4_MST_DLY_LENGTH 5#define MPU9250_MST_PASS_THROUGH_BIT 7
#define MPU9250_MST_I2C_SLV4_DONE_BIT 6
#define MPU9250_MST_I2C_LOST_ARB_BIT 5
#define MPU9250_MST_I2C_SLV4_NACK_BIT 4
#define MPU9250_MST_I2C_SLV3_NACK_BIT 3
#define MPU9250_MST_I2C_SLV2_NACK_BIT 2
#define MPU9250_MST_I2C_SLV1_NACK_BIT 1
#define MPU9250_MST_I2C_SLV0_NACK_BIT 0#define MPU9250_INTCFG_INT_LEVEL_BIT 7
#define MPU9250_INTCFG_INT_OPEN_BIT 6
#define MPU9250_INTCFG_LATCH_INT_EN_BIT 5
#define MPU9250_INTCFG_INT_RD_CLEAR_BIT 4
#define MPU9250_INTCFG_FSYNC_INT_LEVEL_BIT 3
#define MPU9250_INTCFG_FSYNC_INT_EN_BIT 2
#define MPU9250_INTCFG_I2C_BYPASS_EN_BIT 1
#define MPU9250_INTCFG_CLKOUT_EN_BIT 0#define MPU9250_INTMODE_ACTIVEHIGH 0x00
#define MPU9250_INTMODE_ACTIVELOW 0x01#define MPU9250_INTDRV_PUSHPULL 0x00
#define MPU9250_INTDRV_OPENDRAIN 0x01#define MPU9250_INTLATCH_50USPULSE 0x00
#define MPU9250_INTLATCH_WAITCLEAR 0x01#define MPU9250_INTCLEAR_STATUSREAD 0x00
#define MPU9250_INTCLEAR_ANYREAD 0x01#define MPU9250_INTERRUPT_FF_BIT 7
#define MPU9250_INTERRUPT_MOT_BIT 6
#define MPU9250_INTERRUPT_ZMOT_BIT 5
#define MPU9250_INTERRUPT_FIFO_OFLOW_BIT 4
#define MPU9250_INTERRUPT_I2C_MST_INT_BIT 3
#define MPU9250_INTERRUPT_PLL_RDY_INT_BIT 2
#define MPU9250_INTERRUPT_DMP_INT_BIT 1
#define MPU9250_INTERRUPT_DATA_RDY_BIT 0// TODO: figure out what these actually do
// UMPL source code is not very obivous
#define MPU9250_DMPINT_5_BIT 5
#define MPU9250_DMPINT_4_BIT 4
#define MPU9250_DMPINT_3_BIT 3
#define MPU9250_DMPINT_2_BIT 2
#define MPU9250_DMPINT_1_BIT 1
#define MPU9250_DMPINT_0_BIT 0#define MPU9250_MOTION_MOT_XNEG_BIT 7
#define MPU9250_MOTION_MOT_XPOS_BIT 6
#define MPU9250_MOTION_MOT_YNEG_BIT 5
#define MPU9250_MOTION_MOT_YPOS_BIT 4
#define MPU9250_MOTION_MOT_ZNEG_BIT 3
#define MPU9250_MOTION_MOT_ZPOS_BIT 2
#define MPU9250_MOTION_MOT_ZRMOT_BIT 0#define MPU9250_DELAYCTRL_DELAY_ES_SHADOW_BIT 7
#define MPU9250_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4
#define MPU9250_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3
#define MPU9250_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2
#define MPU9250_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1
#define MPU9250_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0#define MPU9250_PATHRESET_GYRO_RESET_BIT 2
#define MPU9250_PATHRESET_ACCEL_RESET_BIT 1
#define MPU9250_PATHRESET_TEMP_RESET_BIT 0#define MPU9250_DETECT_ACCEL_ON_DELAY_BIT 5
#define MPU9250_DETECT_ACCEL_ON_DELAY_LENGTH 2
#define MPU9250_DETECT_FF_COUNT_BIT 3
#define MPU9250_DETECT_FF_COUNT_LENGTH 2
#define MPU9250_DETECT_MOT_COUNT_BIT 1
#define MPU9250_DETECT_MOT_COUNT_LENGTH 2#define MPU9250_DETECT_DECREMENT_RESET 0x0
#define MPU9250_DETECT_DECREMENT_1 0x1
#define MPU9250_DETECT_DECREMENT_2 0x2
#define MPU9250_DETECT_DECREMENT_4 0x3#define MPU9250_USERCTRL_DMP_EN_BIT 7
#define MPU9250_USERCTRL_FIFO_EN_BIT 6
#define MPU9250_USERCTRL_I2C_MST_EN_BIT 5
#define MPU9250_USERCTRL_I2C_IF_DIS_BIT 4
#define MPU9250_USERCTRL_DMP_RESET_BIT 3
#define MPU9250_USERCTRL_FIFO_RESET_BIT 2
#define MPU9250_USERCTRL_I2C_MST_RESET_BIT 1
#define MPU9250_USERCTRL_SIG_COND_RESET_BIT 0#define MPU9250_PWR1_DEVICE_RESET_BIT 7
#define MPU9250_PWR1_SLEEP_BIT 6
#define MPU9250_PWR1_CYCLE_BIT 5
#define MPU9250_PWR1_TEMP_DIS_BIT 3
#define MPU9250_PWR1_CLKSEL_BIT 2
#define MPU9250_PWR1_CLKSEL_LENGTH 3#define MPU9250_CLOCK_INTERNAL 0x00
#define MPU9250_CLOCK_PLL_XGYRO 0x01
#define MPU9250_CLOCK_PLL_YGYRO 0x02
#define MPU9250_CLOCK_PLL_ZGYRO 0x03
#define MPU9250_CLOCK_PLL_EXT32K 0x04
#define MPU9250_CLOCK_PLL_EXT19M 0x05
#define MPU9250_CLOCK_KEEP_RESET 0x07#define MPU9250_PWR2_LP_WAKE_CTRL_BIT 7
#define MPU9250_PWR2_LP_WAKE_CTRL_LENGTH 2
#define MPU9250_PWR2_STBY_XA_BIT 5
#define MPU9250_PWR2_STBY_YA_BIT 4
#define MPU9250_PWR2_STBY_ZA_BIT 3
#define MPU9250_PWR2_STBY_XG_BIT 2
#define MPU9250_PWR2_STBY_YG_BIT 1
#define MPU9250_PWR2_STBY_ZG_BIT 0#define MPU9250_WAKE_FREQ_1P25 0x0
#define MPU9250_WAKE_FREQ_2P5 0x1
#define MPU9250_WAKE_FREQ_5 0x2
#define MPU9250_WAKE_FREQ_10 0x3#define MPU9250_BANKSEL_PRFTCH_EN_BIT 6
#define MPU9250_BANKSEL_CFG_USER_BANK_BIT 5
#define MPU9250_BANKSEL_MEM_SEL_BIT 4
#define MPU9250_BANKSEL_MEM_SEL_LENGTH 5#define MPU9250_WHO_AM_I_BIT 6
#define MPU9250_WHO_AM_I_LENGTH 6#define MPU9250_DMP_MEMORY_BANKS 8
#define MPU9250_DMP_MEMORY_BANK_SIZE 256
#define MPU9250_DMP_MEMORY_CHUNK_SIZE 16#define GYRO_ADDRESS 0xD0
#define MAG_ADDRESS 0x18
#define ACCEL_ADDRESS 0xD0
typedef struct MPU
{int16_t Accel[3];//Accel X,Y,Zint16_t Gyro[3];//Gyro X,Y,Zint16_t Mag[3]; //Mag X,Y,Z
}MPU;extern struct MPU mpu_value;void Init_MPU9250(void);
void MPU9250_Write_Reg(u8 reg,u8 value);//SPI写
u8 SPI1_ReadWriteByte(u8 TxData);
u8 MPU9250_Read_Reg(u8 reg);//SPI读
void READ_MPU9250_ACCEL(void);//读取加速度
void READ_MPU9250_GYRO(void);//读取陀螺仪
void READ_MPU9250_MAG(void);//读取地磁计
void delay_us(int m);
void delay_ms(int m);
需要包含ESP32 SPI的库。
有一点需要提醒,由于芯片和磁力计通讯采用I2C,初始化的时候比较复杂,需要延时一段时间等待磁力计启动,要不然会读不到磁力计的数值。
使用的是如下模块
还要提的一点是,SPI除了其高速的有点外,还有一个非常好的特性,对于4线SPI,也就是多了一条CS线,叫片选线。其作用相对于使能接收与发送,只有拉低CS线后,才能相应读取或发送信息,也就是说,我们可以实现一主机对多从机的通讯,大大节省了IO口,在产品中这一点也是我们选择SPI通讯的关键所在。
基于ESP32的SPI读取MPU9250数据相关推荐
- EtherCAT从站读取MPU9250数据并进行姿态解算
1.EtherCAT从站硬件设计 18年8月的时候,基于LAN9252.stm32.mpu9250芯片设计了一款EtherCAT从站,是我设计的第一款从站.手工焊芯片和元件,焊得我眼睛都快瞎了~~~~ ...
- ESP32通过SPI读取多个SPI Slave--6个MAX31865 RTD芯片
ESP32控制6个SPI设备 选通电路 软件编程 程序说明 有一个ESP32想要读取6个MAX31865的RTD电阻,采用一个74HC138的3-8译码器作为6个MAX31865的选通.这里选择了Ar ...
- linux串口读取mpu9250数据,模拟 I2C 读取 MPU9250 数据的测试笔记
硬件:STM32F103ZET6 + GY9250 软件:Keil MDK(v5.27)+ STM32CUBEMX(v5.2.1) 这里我在使用STM32CUBEMX最新版本(v5.5.0)生成Kei ...
- STM32L1系列I2C读取mpu9250数据
问题描述:I2C可以读取加速度和陀螺仪的6轴数据,不能读取到磁力计ID和数据,读取到磁力计ID为0x00或者0xFF. I2C读取9250按理应该挺简单.但是困扰了我三天,今天终于解决了.谷歌和百度有 ...
- arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据
撑腰会儿:I2C通信协议介绍zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...
- 驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动
目录 一.IIO 子系统简介 二.IIO子系统使用的一些相关的结构体.函数等 1.iio_dev 结构体 ①modes:是选择iio驱动设备支持的工作模式,模式分别有如下: ②dev:其是一个 ...
- 用GPIO模拟SPI接口读取传感器数据
本文基于平头哥开发板RVB2601,简要介绍了用GPIO模拟SPI时序逻辑,实现SPI协议,按照特定温度传感器的时序,读取其数据,及示例程序 一.概述 SPI(Serial Peripheral In ...
- FPGA_Verilog学习之旅(4)---基于SPI读取AD7606
基于SPI读取AD7606_Verilog 1. AD7606 SPI读取时,一些重要的引脚 2. AD7606 SPI读取时的一些时序 3. AD7606 SPI读取时的一些说明 4. AD7606 ...
- Esp32读取温湿度数据通过mqtt上传阿里云平台
目录 前言 一.esp32刷MicroPython固件库 二.创建阿里云产品 1.注册阿里云账号并登录控制台 2.找到物联网平台中的公共实例进入 3.创建产品及设备 4.编辑物模型并发布 5.最后找到 ...
最新文章
- luogu P3410 拍照(最大权闭合图转最小割)
- python-作用域
- JUnit 5中的测试执行顺序
- raspberry pi_如何将Raspberry Pi配置为微控制器
- 月薪3万的python程序员都看了这本书
- Bash脚本和/ bin / bash ^ M:错误的解释器:没有这样的文件或目录[重复]
- 光棍节程序员闯关秀-解密
- Android影院选座
- 二元函数对xy同时求导_2020.5.6 | 考研数学—多元函数微分学重要考点攻克
- 家庭作业 题解(C++)
- 第三章 集合的基本概念和运算
- Android跳转到手机自启动管理页面
- 视频教程-ps基础课程绝对初级,小白听得懂-Photoshop
- 删除excel中的分页符
- 地图数据的类型及编码方法
- mysql外键约束案例_详解MySQL中的外键约束问题
- Unity Atlas
- 颜色模型(color model)
- F28335_ECAP使用
- 小米电视ES65 2022款 评测
热门文章
- 水仙花数 matlab,matlab向量运算解决水仙花数问题
- VisualBasic使用CDO发送SSL加密邮件【我TM还是太年轻了】
- glDrawElements 绘制立方体共用顶点的法线和UV处理
- 关于微信公众号页面获取code进行微信授权登录
- 2017.7.27 计算机编程培训第二天
- 计算机网络里什么叫专线,专线和宽带的区别有哪些_专线网络和家庭宽带的具体区别介绍...
- Android P2P 通信方案探索
- 超级任天堂模拟器 bsnes 开发者自杀(文末附模拟器及ROM)
- 对付木马:空手入白刃谁动了我的电脑系统(转)
- mkconfig与Kconfig