MPU9250MOME
MSB firstと書かれている。
CPOLは見つけられなかったので、2種類試し、WHO_AM_Iが正しい方を選択。ロジックアナライザーで確認するべき。
CPOL(LOW)-->0
立ち上がりでラッチ、立ち下がりでシフトと書かれているので、
CPHA(1 Edge)-->0
/* USER CODE BEGIN 0 */
const uint8_t WHO_AM_I = 0x75;
const uint8_t PWR_MGMT_1 = 0x6B;
const uint8_t CONFIG = 0x1A;
const uint8_t GYRO_CONFIG = 0x1B;
const uint8_t GYRO_ZOUT_H = 0x47;
const uint8_t GYRO_ZOUT_L = 0x48;
const uint8_t ZG_OFFSET_H = 0x17;
const uint8_t ZG_OFFSET_L = 0x18;
uint8_t Tx = 0;
uint8_t Rx = 0;
int16_t GYRO_ZOUT = 0;
int16_t ZG_OFFSET = 0;
char buffer[1024];
void send_uart(char *s){
HAL_UART_Transmit(&huart2, (uint8_t *) s, strlen(s), 2000);
}
void write_spi(uint8_t Tx, uint8_t write_val){
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,(uint8_t *)&Tx,1,100);
HAL_SPI_Transmit(&hspi1,(uint8_t *)&write_val,1,100);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
}
void read_spi(uint8_t Tx){
Tx = Tx | 0b10000000;
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,(uint8_t *)&Tx,1,100);
HAL_SPI_Receive(&hspi1,(uint8_t *)&Rx,1,100);
HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
read_spi(WHO_AM_I);
sprintf(buffer, "I am %u\n", Rx);
send_uart(buffer);
write_spi(PWR_MGMT_1, 0b00000000);
write_spi(CONFIG, 0b00000000);
write_spi(GYRO_CONFIG, 0b00011000);
read_spi(GYRO_CONFIG);
sprintf(buffer, "GYRO CONFIG is %u\n", Rx);
send_uart(buffer);
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
read_spi(GYRO_ZOUT_H);
GYRO_ZOUT = Rx << 8;
read_spi(GYRO_ZOUT_L);
GYRO_ZOUT += Rx;
sprintf(buffer, "GYRO_ZOUT is %lf\n", (double)GYRO_ZOUT/16.384);
send_uart(buffer);
HAL_Delay(50);
}
/* USER CODE END 3 */
この記事が気に入ったらサポートをしてみませんか?