This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Initial_MPU6050(void) | |
{ | |
// Reset to defalt | |
MPU6050_WriteBit(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_DEVICE_RESET_BIT, ENABLE); | |
// SetClockSource(MPU6050_CLOCK_PLL_XGYRO) | |
MPU6050_WriteBits(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, MPU6050_CLOCK_PLL_XGYRO); | |
// SetFullScaleGyroRange(MPU6050_GYRO_FS_250) | |
MPU6050_WriteBits(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, MPU6050_GYRO_FS_250); | |
// SetFullScaleAccelRange(MPU6050_ACCEL_FS_2) | |
MPU6050_WriteBits(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, MPU6050_ACCEL_FS_2); | |
// interupt(Enable) | |
MPU6050_WriteBit(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, ENABLE); | |
// SetSleepModeStatus(DISABLE) | |
MPU6050_WriteBit(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, DISABLE); | |
// SetDLPF(MPU6050_DLPF_BW_5) | |
MPU6050_WriteBits(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_CONFIG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, MPU6050_DLPF_BW_98); | |
MPU6050_WriteBit(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, DISABLE); | |
HAL_Delay(50); // for stability | |
} | |
void MPU6050_WriteBits(uint8_t slaveAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) | |
{ | |
// 010 value to write | |
// 76543210 bit numbers | |
// xxx args: bitStart=4, length=3 | |
// 00011100 mask byte | |
// 10101111 original value (sample) | |
// 10100011 original & ~mask | |
// 10101011 masked | value | |
uint8_t tmp; | |
HAL_I2C_Mem_Read(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |
data <<= (bitStart - length + 1); // shift data into correct position | |
data &= mask; // zero all non-important bits in data | |
tmp &= ~(mask); // zero all important bits in existing byte | |
tmp |= data; // combine data with existing byte | |
HAL_I2C_Mem_Write(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
} | |
void MPU6050_WriteBit(uint8_t slaveAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) | |
{ | |
uint8_t tmp; | |
HAL_I2C_Mem_Read(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
tmp = (data != 0) ? (tmp | (1 << bitNum)) : (tmp & ~(1 << bitNum)); | |
HAL_I2C_Mem_Write(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
} | |
void MPU6050_ReadBits(uint8_t slaveAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data) | |
{ | |
// 01101001 read byte | |
// 76543210 bit numbers | |
// xxx args: bitStart=4, length=3 | |
// 010 masked | |
// -> 010 shifted | |
uint8_t tmp; | |
HAL_I2C_Mem_Read(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |
tmp &= mask; | |
tmp >>= (bitStart - length + 1); | |
*data = tmp; | |
} | |
void MPU6050_ReadBit(uint8_t slaveAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data) | |
{ | |
uint8_t tmp; | |
HAL_I2C_Mem_Read(&hi2c1,slaveAddr,regAddr,1,&tmp,1,1); | |
*data = tmp & (1 << bitNum); | |
} | |
void MPU6050_GetRawAccelGyro(int16_t* AccelGyro) | |
{ | |
uint8_t tmpBuffer[14]; | |
HAL_I2C_Mem_Read(&hi2c1,MPU6050_DEFAULT_ADDRESS,MPU6050_RA_ACCEL_XOUT_H,1,tmpBuffer,14,1); | |
/* Get acceleration */ | |
for (int i = 0; i < 3; i++) | |
AccelGyro[i] = ((int16_t) ((uint16_t) tmpBuffer[2 * i] << 8) + tmpBuffer[2 * i + 1]); | |
/* Get Angular rate */ | |
for (int i = 4; i < 7; i++) | |
AccelGyro[i - 1] = ((int16_t) ((uint16_t) tmpBuffer[2 * i] << 8) + tmpBuffer[2 * i + 1]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment