Hello
I am currently trying to get sensor values via SPI communication with mpu9250, a 9-axis sensor.
Although the following settings were made,acceleration,gyro,and temperature could be measured , but geomagnetics can not be measured.
Is the setting for acquiring geomagnetism with mpu9250 SPI correct?
#define mpu_6axis_sleve_address 0x68 #define read_six_axis 0xBB//read data #define PWR_MGMT_1 0x6B #define USER_CTRL 0x6A #define AK8963_SLAVE_ADDR 0x03//mag #define I2C_MST_CTRL 0x24 #define I2C_SLV0_ADDR 0x25 #define I2C_SLV0_REG 0x26 #define I2C_SLV0_CTRL 0x27 #define I2C_SLV0_DO 0x63 #define I2C_SLV4_ADDR 0x31 #define I2C_SLV4_REG 0x32 #define I2C_SLV4_DO 0x33 #define I2C_SLV4_CTRL 0x34 #define ACCEL_XOUT_H 0x3B #define SMPLRT_DIV 0x19 #define GYRO_CONFIG 0x1B #define ACCEL_CONFIG 0x1C #define ACCEL_CONFIG2 0x1D #define SPI_INSTANCE 1; static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);//SPI_INSTANCE (spi1) static volatile bool spi_xfer_done; /**< Flag used to indicate that SPI instance completed the transfer. */ volatile static bool spi_tx_done = false; void nrf_drv_mpu_spi_event_handler(const nrf_drv_spi_evt_t *evt, void * p_context) { if(evt->type == NRF_DRV_SPI_EVENT_DONE) { spi_tx_done = true; } else { // Something is wrong } } void SPI_INIT() { uint32_t err_code; nrf_drv_spi_config_t config = { .sck_pin = sensor_SCK_PIN, .mosi_pin = sensor_MOSI_PIN, .miso_pin = sensor_MISO_PIN, .ss_pin = sensor_CS_PIN, .frequency = NRF_DRV_SPI_FREQ_4M, .mode = NRF_DRV_SPI_MODE_0, .bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST }; err_code = nrf_drv_spi_init(&spi,&config,nrf_drv_mpu_spi_event_handler,NULL);/////////////// } void MPU9250_setMODE() { uint8_t reg_chipreset[2] = {PWR_MGMT_1,0x80}; nrf_drv_spi_transfer(&spi,reg_chipreset,sizeof(reg_chipreset),NULL,0);//chip reset nrf_delay_ms(100); uint8_t reg_wakeup[2] = {PWR_MGMT_1,0x01}; nrf_drv_spi_transfer(&spi,reg_wakeup,sizeof(reg_wakeup),NULL,0);// wake up device uint8_t reg_userctrl[2] = {USER_CTRL,0x30}; nrf_drv_spi_transfer(&spi,reg_userctrl,sizeof(reg_userctrl),NULL,0);//Activate function uint8_t reg_accel[2] = {ACCEL_CONFIG,0x10}; nrf_drv_spi_transfer(&spi,reg_accel,sizeof(reg_accel),NULL,0);//±8g(accel) uint8_t reg_accel2[2] = {ACCEL_CONFIG2,0x08}; nrf_drv_spi_transfer(&spi,reg_accel2,sizeof(reg_accel2),NULL,0);//4kHz sampling uint8_t reg_gyro[2] = {GYRO_CONFIG,0x10}; nrf_drv_spi_transfer(&spi,reg_gyro,sizeof(reg_gyro),NULL,0);//±1000dps (gyro) uint8_t reg_mag100hz[2] = {SMPLRT_DIV,0x09}; nrf_drv_spi_transfer(&spi,reg_mag100hz,sizeof(reg_mag100hz),NULL,0);//100Hz sampling for mag nrf_drv_spi_transfer(&spi,reg_i2cclk,sizeof(reg_i2cclk),NULL,0);//I2C clock to 400kHz uint8_t reg_addr[2] = {I2C_SLV4_ADDR,0x0C}; nrf_drv_spi_transfer(&spi,reg_addr,sizeof(reg_addr),NULL,0);//AK8963 slave address uint8_t reg_ctrl2[2] = {I2C_SLV4_REG,0x0B}; nrf_drv_spi_transfer(&spi,reg_ctrl2,sizeof(reg_ctrl2),NULL,0);//CTRL2 uint8_t reg_reset[2] = {I2C_SLV4_DO,0x01}; nrf_drv_spi_transfer(&spi,reg_reset,sizeof(reg_reset),NULL,0);//reset enabled uint8_t reg_data[2] = {I2C_SLV4_CTRL,0x80}; nrf_drv_spi_transfer(&spi,reg_data,sizeof(reg_data),NULL,0);//send data nrf_delay_ms(20); uint8_t reg_ctrl1[2] = {I2C_SLV4_REG,0x0A}; nrf_drv_spi_transfer(&spi,reg_ctrl1,sizeof(reg_ctrl1),NULL,0);//ctrl1 uint8_t reg_100hz[2] = {I2C_SLV4_DO,0x16}; nrf_drv_spi_transfer(&spi,reg_100hz,sizeof(reg_100hz),NULL,0);//Continuous measurement mode 100Hz nrf_drv_spi_transfer(&spi,reg_data,sizeof(reg_data),NULL,0);//send data nrf_delay_ms(20); uint8_t reg_ak8963[2] = {I2C_SLV0_ADDR,0x8C}; nrf_drv_spi_transfer(&spi,reg_ak8963,sizeof(reg_ak8963),NULL,0);//AK8963 data read uint8_t reg_hxl[2] = {I2C_SLV0_REG,0x03}; nrf_drv_spi_transfer(&spi,reg_hxl,sizeof(reg_hxl),NULL,0);//hxl uint8_t reg_receive[2] = {I2C_SLV0_CTRL,0x87}; nrf_drv_spi_transfer(&spi,reg_receive,sizeof(reg_receive),NULL,0);//7byte data receive -> ext_sens_data_00 } uint8_t mag_axis[7] = {0}; nrf_drv_spi_xfer_desc_t xfer_spi = NRF_DRV_SPI_XFER_TRX(®_six,1,six_axis,21); uint32_t flags = NRF_DRV_SPI_FLAG_HOLD_XFER | NRF_DRV_SPI_FLAG_RX_POSTINC | NRF_DRV_SPI_FLAG_NO_XFER_EVT_HANDLER | NRF_DRV_SPI_FLAG_REPEATED_XFER;
ret_code_t ret = nrf_drv_spi_xfer(&spi,&xfer_spi,flags); uint32_t start_tsk_addr = nrf_drv_spi_start_task_get(&spi);
Thank you.