-
MPU9250
的
SPI
读取例程,
由一个忘了什么来源的程序改成,
只需要改
SPI
和
CS
的宏定
义,
加上延时函数,
就可以使用,亲测可用,
< br>发上来给那些找不到例程的朋友,
配置后的状态在
另一个
文档里,名为
MPU9250
刷新速率和单位,程序如有侵权等
,请联系
…
//MPU9250
的陀螺仪单位转换系数:
//#define MPU9250_Gyro_FS1000 32.8
//MPU9250
的加速度计单位
转换系数:
//#define Acc_FS2g
1671.84//to m/ss
//MPU9250
磁力计的单位转换系数:
//#define Mega_FS16BIT_Ga
6.83
/*1uT-10mGass*/
static s16
MPU9250_AK8963_ASA[3] = {0, 0, 0};//1T=10000GASS
1uT=0.01GASS
//
定义
MPU9250
内部地址
////
//////////////////////////////////////////////////
////////////////////
//Register Map for
Gyroscope and Accelerometer
#define
MPU9250_SELF_TEST_X_GYRO
0x00
#define
MPU9250_SELF_TEST_Y_GYRO
0x01
#define
MPU9250_SELF_TEST_Z_GYRO
0x02
#define MPU9250_SELF_TEST_X_ACCEL
0x0D
#define MPU9250_SELF_TEST_Y_ACCEL
0x0E
#define MPU9250_SELF_TEST_Z_ACCEL
0x0F
#define MPU9250_XG_OFFSET_H
0x13
#define
MPU9250_XG_OFFSET_L
0x14
#define MPU9250_YG_OFFSET_H
0x15
#define
MPU9250_YG_OFFSET_L
0x16
#define MPU9250_ZG_OFFSET_H
0x17
#define
MPU9250_ZG_OFFSET_L
0x18
#define MPU9250_SMPLRT_DIV
0x19
/
/
陀螺仪采样率,典型值:
0x07(125Hz)
#define MPU9250_CONFIG
0x1A
//
低通滤波频率,
典型值:
0x06(5Hz)
#define MPU9250_GYRO_CONFIG
0x1B
//
陀螺仪自检及测量范围
,典型值:
0x18(
不自检,
200
0deg/s)
#define MPU9250_ACCEL_CONFIG
0x1C
//
加速计自检、
测量范围及高通滤波
频率,典型值:
0x01(
不自检,
2G
,
5Hz)
#define MPU9250_ACCEL_CONFIG2
0x1D
#define MPU9250_LP_ACCEL_ODR
0x1E
#define MPU9250_WOM_THR
0x1F
#define
MPU9250_FIFO_EN
0x23
#define MPU9250_I2C_MST_CTRL
0x24
#define
MPU9250_I2C_SLV0_ADDR
0x25
#define
MPU9250_I2C_SLV0_REG
0x26
#define
MPU9250_I2C_SLV0_CTRL
0x27
#define
MPU9250_I2C_SLV1_ADDR
0x28
#define
MPU9250_I2C_SLV1_REG
0x29
#define
MPU9250_I2C_SLV1_CTRL
0x2A
#define
MPU9250_I2C_SLV2_ADDR
0x2B
#define
MPU9250_I2C_SLV2_REG
0x2C
#define
MPU9250_I2C_SLV2_CTRL
0x2D
#define
MPU9250_I2C_SLV3_ADDR
0x2E
#define
MPU9250_I2C_SLV3_REG
0x2F
#define
MPU9250_I2C_SLV3_CTRL
0x30
#define
MPU9250_I2C_SLV4_ADDR
0x31
#define
MPU9250_I2C_SLV4_REG
#define MPU9250_I2C_SLV4_DO
#define
MPU9250_I2C_SLV4_CTRL
#define
MPU9250_I2C_SLV4_DI
#define MPU9250_I2C_MST_STATUS
#define
MPU9250_INT_PIN_CFG
#define MPU9250_INT_ENABLE
#define
MPU9250_INT_STATUS
#define
MPU9250_ACCEL_XOUT_H
#define
MPU9250_ACCEL_XOUT_L
#define
MPU9250_ACCEL_YOUT_H
#define
MPU9250_ACCEL_YOUT_L
#define
MPU9250_ACCEL_ZOUT_H
#define
MPU9250_ACCEL_ZOUT_L
#define
MPU9250_TEMP_OUT_H
#define MPU9250_TEMP_OUT_L
#define MPU9250_GYRO_XOUT_H
#define MPU9250_GYRO_XOUT_L
#define MPU9250_GYRO_YOUT_H
#define MPU9250_GYRO_YOUT_L
#define MPU9250_GYRO_ZOUT_H
#define MPU9250_GYRO_ZOUT_L
#define MPU9250_EXT_SENS_DATA_00
#define MPU9250_EXT_SENS_DATA_01
#define MPU9250_EXT_SENS_DATA_02
#define MPU9250_EXT_SENS_DATA_03
#define MPU9250_EXT_SENS_DATA_04
#define MPU9250_EXT_SENS_DATA_05
#define MPU9250_EXT_SENS_DATA_06
#define MPU9250_EXT_SENS_DATA_07
#define MPU9250_EXT_SENS_DATA_08
#define MPU9250_EXT_SENS_DATA_09
#define MPU9250_EXT_SENS_DATA_10
#define MPU9250_EXT_SENS_DATA_11
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x3A
0x3B
0x3C
0x3D
0x3E
0x3F
0x40
0x41
0x42
0x43
0x44
0x45
0x46
0x47
0x48
0x49
0x4A
0x4B
0x4C
0x4D
0x4E
0x4F
0x50
0x51
0x52
0x53
0x54
#define MPU9250_EXT_SENS_DATA_12
0x55
#define
MPU9250_EXT_SENS_DATA_13
0x56
#define
MPU9250_EXT_SENS_DATA_14
0x57
#define
MPU9250_EXT_SENS_DATA_15
0x58
#define
MPU9250_EXT_SENS_DATA_16
0x59
#define
MPU9250_EXT_SENS_DATA_17
0x5A
#define
MPU9250_EXT_SENS_DATA_18
0x5B
#define
MPU9250_EXT_SENS_DATA_19
0x5C
#define
MPU9250_EXT_SENS_DATA_20
0x5D
#define
MPU9250_EXT_SENS_DATA_21
#define MPU9250_EXT_SENS_DATA_22
#define
MPU9250_EXT_SENS_DATA_23
#define MPU9250_I2C_SLV0_DO
#define MPU9250_I2C_SLV1_DO
#define
MPU9250_I2C_SLV2_DO
#define MPU9250_I2C_SLV3_DO
#define
MPU9250_I2C_MST_DELAY_CTRL
#define
MPU9250_SIGNAL_PATH_RESET
#define
MPU9250_MOT_DETECT_CTRL
#define MPU9250_USER_CTRL
#define MPU9250_PWR_MGMT_1
#define MPU9250_PWR_MGMT_2
#define MPU9250_FIFO_COUNTH
#define MPU9250_FIFO_COUNTL
#define
MPU9250_FIFO_R_W
#define MPU9250_WHO_AM_I
#define MPU9250_XA_OFFSET_H
#define MPU9250_XA_OFFSET_L
#define MPU9250_YA_OFFSET_H
#define MPU9250_YA_OFFSET_L
#define MPU9250_ZA_OFFSET_H
#define MPU9250_ZA_OFFSET_L
//
#define MPU9250_I2C_READ 0x80
//Magnetometer register
maps
#define MPU9250_AK8963_WIA
#define MPU9250_AK8963_INFO
#define MPU9250_AK8963_ST1
#define MPU9250_AK8963_XOUT_L
0x5E
0x5F
0x60
0x63
0x64
0x65
0x66
0x67
0x68
0x69
0x6A
0x6B
//
电源管理,
典型值:
0x00(
正常启用
)
0x6C
0x72
0x73
0x74
0x75
//ID
寄存器
(
默认数值
0x71
,只读
)
0x77
0x78
0x7A
0x7B
0x7D
0x7E
0x00
0x01
0x02
0x03
#define MPU9250_AK8963_XOUT_H
0x04
#define
MPU9250_AK8963_YOUT_L
0x05
#define
MPU9250_AK8963_YOUT_H
0x06
#define
MPU9250_AK8963_ZOUT_L
0x07
#define
MPU9250_AK8963_ZOUT_H
0x08
#define
MPU9250_AK8963_ST2
0x09
#define MPU9250_AK8963_CNTL
0x0A
#define MPU9250_AK8963_CNTL2
0x0B
#define
MPU9250_AK8963_RSV
0x0B
//DO
NOT
ACCESS
#define MPU9250_AK8963_ASTC
0x0C
#define MPU9250_AK8963_TS1
0x0D //DO NOT ACCESS
#define
MPU9250_AK8963_TS2
0x0E //DO NOT
ACCESS
#define MPU9250_AK8963_I2CDIS
0x0F
#define
MPU9250_AK8963_ASAX
0x10
#define
MPU9250_AK8963_ASAY
0x11
#define
MPU9250_AK8963_ASAZ
0x12
#define MPU9250_AK8963_I2C_ADDR 0x0C
#define MPU9250_AK8963_POWER_DOWN 0x10
#define MPU9250_AK8963_FUSE_ROM_ACCESS
0x1F
#define
MPU9250_AK8963_SINGLE_MEASUREMENT 0x11
#define
MPU9250_AK8963_CONTINUOUS_MEASUREMENT 0x16
//MODE2
刷新速率
100Hz
#define MPU9250_AK8963_DATA_READY
(0x01)
#define
MPU9250_AK8963_DATA_OVERRUN
(0x02)
#define MPU9250_AK8963_OVERFLOW
(0x80)
#define
MPU9250_AK8963_DATA_ERROR
(0x40)
#define
MPU9250_AK8963_CNTL2_SRST 0x01
//
#define
MPU9250_I2C_SLV4_EN 0x80
#define
MPU9250_I2C_SLV4_DONE 0x40
#define
MPU9250_I2C_SLV4_NACK 0x10
//
#define MPU9250_I2C_IF_DIS (0x10)
#define MPU9250_I2C_MST_EN (0x20)
#define MPU9250_FIFO_RST (0x04)
#define MPU9250_FIFO_ENABLE (0x40)
//
#define MPU9250_RESET
0x80
#define MPU9250_CLOCK_MASK 0xF8
#define MPU9250_CLOCK_INTERNAL 0x00
#define MPU9250_CLOCK_PLL 0x01
#define MPU9250_CLOCK_PLLGYROZ 0x03
#define MPU9250_FS_SEL_MASK 0xE7
#define MPU9250_SLEEP_MASK 0x40
//
#define MPU9250_XYZ_GYRO
0xC7
#define MPU9250_XYZ_ACCEL 0xF8
//
#define
MPU9250_RAW_RDY_EN (0x01)
#define
MPU9250_RAW_DATA_RDY_INT (0x01)
#define
MPU9250_FIFO_OVERFLOW (0x10)
//
#define MPU9250_INT_ANYRD_2CLEAR (0x10)
#define MPU9250_LATCH_INT_EN (0x20)
//
#define MPU9250_MAX_FIFO
(1024)
#define MPU9250_FIFO_SIZE_1024
(0x40)
#define
MPU9250_FIFO_SIZE_2048
(0x80)
#define
MPU9250_FIFO_SIZE_4096
(0xC0)
#define
MPU9250_TEMP_OUT (0x80)
#define
MPU9250_GYRO_XOUT (0x40)
#define
MPU9250_GYRO_YOUT (0x20)
#define
MPU9250_GYRO_ZOUT (0x10)
#define
MPU9250_ACCEL (0x08)
//////////////////
//////////////////////////////////////////////////
//////
#define SMPLRT_DIV 0
#define MPU9250_SPIx_ADDR 0x00
< br>/********************************************** ********************************
/
#define MPU9250_SPI_ReadWriteByte(x)
SPI1_ReadWriteByte(x)
#define MPU9250_CS_L
GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define MPU9250_CS_H
GPIO_SetBits(GPIOA,GPIO_Pin_4)
< br>/********************************************** ********************************
/
//////////////////////////////////////////// //////////////////////////////
enum
MPU9250_GYRO_DLPF
{
MPU9250_GYRO_DLPF_250HZ = 0,
MPU9250_GYRO_DLPF_184HZ,
MPU9250_GYRO_DLPF_92HZ,
MPU9250_GYRO_DLPF_41HZ,
MPU9250_GYRO_DLPF_20HZ,
MPU9250_GYRO_DLPF_10HZ,
MPU9250_GYRO_DLPF_5HZ,
MPU9250_GYRO_DLPF_3600HZ,
NUM_GYRO_DLPF
};
enum MPU9250_GYRO_FSR
{
MPU9250_FSR_250DPS = 0,
MPU9250_FSR_500DPS,
MPU9250_FSR_1000DPS,
MPU9250_FSR_2000DPS,
MPU9250_NUM_GYRO_FSR
};
enum MPU9250_ACCEL_DLPF
{
MPU9250_ACCEL_DLPF_460HZ =
0,
MPU9250_ACCEL_DLPF_184HZ,
MPU9250_ACCEL_DLPF_92HZ,
MPU9250_ACCEL_DLPF_41HZ,
MPU9250_ACCEL_DLPF_20HZ,
MPU9250_ACCEL_DLPF_10HZ,
MPU9250_ACCEL_DLPF_5HZ,
MPU9250_ACCEL_DLPF_460HZ2,
MPU9250_NUM_ACCEL_DLPF
};
enum MPU9250_ACCEL_FSR
{
MPU9250_FSR_2G = 0,
MPU9250_FSR_4G,
MPU9250_FSR_8G,
MPU9250_FSR_16G,
MPU9250_NUM_ACCEL_FSR
};
enum MPU9250_CLK
{
MPU9250_CLK_INTERNAL = 0,
MPU9250_CLK_PLL,
MPU9250_NUM_CLK
};
//MPU9250_SPI_Write
//MPU925
0
的
SPI
写一个字节函数
//reg_addr
寄存器地址
data
要写入的数据
void
MPU9250_SPI_Write(u8 reg_addr, u8 data)
{
MPU9250_CS_L;
MPU9250_SPI_ReadWriteByte(reg_addr);
MPU9250_SPI_ReadWriteByte(data);
MPU9250_CS_H;
}
//MPU9250_SPI_Writes
//MPU92
50
的
SPI
写多个字节函数
//reg_addr
寄存器地址
len
字节数
*data
要写入的数据存放的数组
void MPU9250_SPI_Writes(u8 reg_addr, u8
len, u8* data)
{
u32i = 0;
MPU9250_CS_L;
MPU9250_SPI_ReadWriteByte(reg_addr);
while(i
{
MPU9250_SPI_ReadWriteByte(data[i++]);
}
MPU9250_CS_H;
}
//MPU9250_SPI_Read
//MPU9250
的读一个字节函数
//reg_addr
寄存器地址
u8 MPU9250_SPI_Read(u8 reg_addr)
{
u8 dummy = 0;
u8 data = 0;
MPU9250_CS_L;
MPU9250_SPI_ReadWriteByte(0x80 |
reg_addr);
data =
MPU9250_SPI_ReadWriteByte(dummy);
MPU9250_CS_H;
return data;
}
//MPU9250_SPI_Reads
//MPU9250
的读多个字节函数
//reg_addr
寄存器地址
le
n
读取字节数
*data
数据存放数组
void MPU9250_SPI_Reads(u8 reg_addr, u8
len, u8* data)
{
u32i = 0;
u8
dummy = 0x00;
MPU9250_CS_L;
MP
U9250_SPI_ReadWriteByte(MPU9250_I2C_READ |
reg_addr);
while(i
data[i++] =
MPU9250_SPI_ReadWriteByte(dummy);