mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-25 17:25:20 +03:00
Add basic MPU6000 auto detection code. De-duplictate repeated code in
MPU6000.
This commit is contained in:
parent
0ba2933611
commit
715c175aad
2 changed files with 51 additions and 61 deletions
|
@ -125,6 +125,22 @@
|
||||||
void mpu6000SpiGyroRead(int16_t *gyroData);
|
void mpu6000SpiGyroRead(int16_t *gyroData);
|
||||||
void mpu6000SpiAccRead(int16_t *gyroData);
|
void mpu6000SpiAccRead(int16_t *gyroData);
|
||||||
|
|
||||||
|
static void mpu6000WriteRegister(uint8_t reg, uint8_t data)
|
||||||
|
{
|
||||||
|
ENABLE_MPU6000;
|
||||||
|
spiTransferByte(MPU6000_SPI_INSTANCE, reg);
|
||||||
|
spiTransferByte(MPU6000_SPI_INSTANCE, data);
|
||||||
|
DISABLE_MPU6000;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mpu6000ReadRegister(uint8_t reg, uint8_t *data, int length)
|
||||||
|
{
|
||||||
|
ENABLE_MPU6000;
|
||||||
|
spiTransferByte(MPU6000_SPI_INSTANCE, reg | 0x80); // read transaction
|
||||||
|
spiTransfer(MPU6000_SPI_INSTANCE, data, NULL, length);
|
||||||
|
DISABLE_MPU6000;
|
||||||
|
}
|
||||||
|
|
||||||
void mpu6000SpiGyroInit(void)
|
void mpu6000SpiGyroInit(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -136,20 +152,22 @@ void mpu6000SpiAccInit(void)
|
||||||
|
|
||||||
bool mpu6000SpiDetect(void)
|
bool mpu6000SpiDetect(void)
|
||||||
{
|
{
|
||||||
// FIXME this isn't working, not debugged yet.
|
uint8_t in;
|
||||||
return true; // just assume it's there for now
|
|
||||||
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||||
|
|
||||||
|
mpu6000ReadRegister(MPU6000_WHOAMI, &in, 1);
|
||||||
|
if (in != MPU6000_WHO_AM_I_CONST)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
#if 0
|
#if 0
|
||||||
|
// FIXME this isn't working, not debugged yet.
|
||||||
uint8_t product;
|
uint8_t product;
|
||||||
|
|
||||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
mpu6000ReadRegister(MPU6000_PRODUCT_ID, &product, 1);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_PRODUCT_ID);
|
|
||||||
spiTransfer(MPU6000_SPI_INSTANCE, &product, NULL, 1);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* look for a product ID we recognise */
|
/* look for a product ID we recognise */
|
||||||
|
|
||||||
|
@ -184,59 +202,36 @@ void mpu6000AccAndGyroInit() {
|
||||||
|
|
||||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Device Reset
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_PWR_MGMT_1); // Device Reset
|
mpu6000WriteRegister(MPU6000_PWR_MGMT_1, BIT_H_RESET);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, BIT_H_RESET);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delay(150);
|
delay(150);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
mpu6000WriteRegister(MPU6000_SIGNAL_PATH_RESET, BIT_GYRO | BIT_ACC | BIT_TEMP);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_SIGNAL_PATH_RESET); // Device Reset
|
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, BIT_GYRO | BIT_ACC | BIT_TEMP);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delay(150);
|
delay(150);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Clock Source PPL with Z axis gyro reference
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_PWR_MGMT_1); // Clock Source PPL with Z axis gyro reference
|
mpu6000WriteRegister(MPU6000_PWR_MGMT_1, MPU_CLK_SEL_PLLGYROZ);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU_CLK_SEL_PLLGYROZ);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Disable Primary I2C Interface
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_USER_CTRL); // Disable Primary I2C Interface
|
mpu6000WriteRegister(MPU6000_USER_CTRL, BIT_I2C_IF_DIS);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, BIT_I2C_IF_DIS);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
mpu6000WriteRegister(MPU6000_PWR_MGMT_2, 0x00);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_PWR_MGMT_2);
|
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, 0x00);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Accel Sample Rate 1kHz
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_SMPLRT_DIV); // Accel Sample Rate 1kHz
|
// Gyroscope Output Rate = 1kHz when the DLPF is enabled
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, 0x00); // Gyroscope Output Rate = 1kHz when the DLPF is enabled
|
mpu6000WriteRegister(MPU6000_SMPLRT_DIV, 0x00);
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Accel +/- 8 G Full Scale
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_ACCEL_CONFIG); // Accel +/- 8 G Full Scale
|
mpu6000WriteRegister(MPU6000_ACCEL_CONFIG, BITS_FS_8G);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, BITS_FS_8G);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Gyro +/- 1000 DPS Full Scale
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_GYRO_CONFIG); // Gyro +/- 1000 DPS Full Scale
|
mpu6000WriteRegister(MPU6000_GYRO_CONFIG, BITS_FS_2000DPS);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, BITS_FS_2000DPS);
|
delayMicroseconds(1);
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
initDone = true;
|
initDone = true;
|
||||||
}
|
}
|
||||||
|
@ -302,11 +297,8 @@ bool mpu6000SpiGyroDetect(gyro_t *gyro, uint16_t lpf)
|
||||||
|
|
||||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
// Accel and Gyro DLPF Setting
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_CONFIG); // Accel and Gyro DLPF Setting
|
mpu6000WriteRegister(MPU6000_CONFIG, mpuLowPassFilter);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, mpuLowPassFilter);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
delayMicroseconds(1);
|
delayMicroseconds(1);
|
||||||
|
|
||||||
mpu6000SpiGyroRead(data);
|
mpu6000SpiGyroRead(data);
|
||||||
|
@ -327,12 +319,10 @@ bool mpu6000SpiGyroDetect(gyro_t *gyro, uint16_t lpf)
|
||||||
void mpu6000SpiGyroRead(int16_t *gyroData)
|
void mpu6000SpiGyroRead(int16_t *gyroData)
|
||||||
{
|
{
|
||||||
uint8_t buf[6];
|
uint8_t buf[6];
|
||||||
|
|
||||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER); // 18 MHz SPI clock
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER); // 18 MHz SPI clock
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
mpu6000ReadRegister(MPU6000_GYRO_XOUT_H, buf, 6);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_GYRO_XOUT_H | 0x80);
|
|
||||||
spiTransfer(MPU6000_SPI_INSTANCE, buf, NULL, 6);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
gyroData[X] = (int16_t)((buf[0] << 8) | buf[1]);
|
gyroData[X] = (int16_t)((buf[0] << 8) | buf[1]);
|
||||||
gyroData[Y] = (int16_t)((buf[2] << 8) | buf[3]);
|
gyroData[Y] = (int16_t)((buf[2] << 8) | buf[3]);
|
||||||
|
@ -342,12 +332,10 @@ void mpu6000SpiGyroRead(int16_t *gyroData)
|
||||||
void mpu6000SpiAccRead(int16_t *gyroData)
|
void mpu6000SpiAccRead(int16_t *gyroData)
|
||||||
{
|
{
|
||||||
uint8_t buf[6];
|
uint8_t buf[6];
|
||||||
|
|
||||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER); // 18 MHz SPI clock
|
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER); // 18 MHz SPI clock
|
||||||
|
|
||||||
ENABLE_MPU6000;
|
mpu6000ReadRegister(MPU6000_ACCEL_XOUT_H, buf, 6);
|
||||||
spiTransferByte(MPU6000_SPI_INSTANCE, MPU6000_ACCEL_XOUT_H | 0x80);
|
|
||||||
spiTransfer(MPU6000_SPI_INSTANCE, buf, NULL, 6);
|
|
||||||
DISABLE_MPU6000;
|
|
||||||
|
|
||||||
gyroData[X] = (int16_t)((buf[0] << 8) | buf[1]);
|
gyroData[X] = (int16_t)((buf[0] << 8) | buf[1]);
|
||||||
gyroData[Y] = (int16_t)((buf[2] << 8) | buf[3]);
|
gyroData[Y] = (int16_t)((buf[2] << 8) | buf[3]);
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#define GYRO_SCALE_FACTOR 0.00053292f // (4/131) * pi/180 (32.75 LSB = 1 DPS)
|
#define GYRO_SCALE_FACTOR 0.00053292f // (4/131) * pi/180 (32.75 LSB = 1 DPS)
|
||||||
|
|
||||||
|
#define MPU6000_WHO_AM_I_CONST (0x68)
|
||||||
|
|
||||||
|
|
||||||
bool mpu6000SpiAccDetect(acc_t *acc);
|
bool mpu6000SpiAccDetect(acc_t *acc);
|
||||||
bool mpu6000SpiGyroDetect(gyro_t *gyro, uint16_t lpf);
|
bool mpu6000SpiGyroDetect(gyro_t *gyro, uint16_t lpf);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue