void accel_init() { int whoami = accel_get_reg(ACCEL_WHOAMI); if(whoami != ACCEL_WHOAMI_VALUE) { bufferPrintf("accel: incorrect whoami value\n"); return; } accel_write_reg(ACCEL_CTRL_REG2, ACCEL_CTRL_REG2_BOOT, FALSE); accel_write_reg(ACCEL_CTRL_REG1, ACCEL_CTRL_REG1_PM0 | ACCEL_CTRL_REG1_XEN | ACCEL_CTRL_REG1_YEN | ACCEL_CTRL_REG1_ZEN, FALSE); }
void imu_init(void) { printf("imu init\r\n"); RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; pin_set_output(GPIOE, PORTE_CS, 1); pin_set_alternate_function(GPIOA, PORTA_SCLK, 5); pin_set_alternate_function(GPIOA, PORTA_MISO, 5); pin_set_alternate_function(GPIOB, PORTB_MOSI, 5); pin_set_output_speed(GPIOA, PORTA_SCLK, 3); pin_set_output_speed(GPIOB, PORTB_MOSI, 3); pin_set_output_speed(GPIOE, PORTE_CS , 3); SPI1->CR1 = SPI_CR1_SSM | // software slave select management SPI_CR1_SSI | // assert software select state SPI_CR1_CPHA | // clock phase: cpha = 1, cpol = 1 SPI_CR1_CPOL | // ditto SPI_CR1_MSTR | // master mode SPI_CR1_BR_0 | // baud rate sel. need to calculate. SPI_CR1_BR_1 | // ditto SPI_CR1_SPE ; // enable SPI delay_us(100); accel_write_reg(0x20, 0x87); // set max beef (1600 Hz) delay_us(100); // wake up plz #ifdef PRINT_REGISTER_TABLE uint8_t info1 = accel_read_reg(0x0d); printf("info1 = 0x%02x\r\n", (unsigned)info1); #endif float test_accel[3] = {0}; for (int i = 0; i < 10; i++) { delay_ms(10); imu_poll_accels(test_accel); } }