#include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" /* TWI instance ID. */ #define TWI_INSTANCE_ID 0 #define BMM150_SLAVE_ADDRESS 0x13 #define BMM150_REGISTER_X_MAG_LSB 0x42 //´Å³¡XÖáµÍλ #define BMM150_REGISTER_X_MAG_MSB 0x43 #define BMM150_REGISTER_Y_MAG_LSB 0x44 #define BMM150_REGISTER_Y_MAG_MSB 0x45 #define BMM150_REGISTER_Z_MAG_LSB 0x46 #define BMM150_REGISTER_Z_MAG_MSB 0x47 #define BMM150_REGISTER_0x4B 0x4B //Default:0x01 #define BMM150_PWR_SUSPEND_MODE 0x00 //¹ÒÆðģʽ #define BMM150_PWR_OTHER_MODE 0x01 //ÆäËû¹¤×÷ģʽ #define BMM150_SOFT_RESET 0x82 //Èí¼þ¸´Î» #define BMM150_REGISTER_0x4C 0x4C //Default:0x06 #define BMM150_DATA_RATE_10HZ (0x00 << 3) //´Å³¡Êý¾Ý¸üÐÂÂÊ Ä¬ÈÏ10hz #define BMM150_DATA_RATE_2HZ (0x01 << 3) #define BMM150_DATA_RATE_6HZ (0x02 << 3) #define BMM150_DATA_RATE_8HZ (0x03 << 3) #define BMM150_DATA_RATE_15HZ (0x04 << 3) #define BMM150_DATA_RATE_20HZ (0x05 << 3) #define BMM150_DATA_RATE_25HZ (0x06 << 3) #define BMM150_DATA_RATE_30HZ (0x07 << 3) #define BMM150_PWR_NORMAL_MODE (0x00 << 1)//Õý³£¹¤×÷ģʽ #define BMM150_PWR_FORCAD_MODE (0x01 << 1) #define BMM150_PWR_SLEEP_MODE (0x03 << 1)//ÐÝÃßģʽ #define BMM150_OPEN_SELF_TEST 0x01 #define BMM150_CLOSE_SELF_TEST 0x00 #define BMM150_REGISTER_0x4D 0x4D #define BMM150_REGISTER_0x4E 0x4E //Default:0x07 #define BMM150_READY_EN 0x80 //DATA READY PINʹÄÜ #define BMM150_XYZ_CHANNEL_EN (0x0 << 3) #define BMM150_XY_CHANNEL_EN (0x4 << 3) #define BMM150_Z_CHANNEL_EN (0x3 << 3) #define BMM150_REGISTER_0x51 0x51 //Default:0x00 (nXY=1+RepXY*2) #define BMM150_REPXY_LOWPWR 0x01 //3 #define BMM150_REPXY_REGULAR 0x04 //9 #define BMM150_REPXY_ENHANCED_REGULAR 0x07 //15 #define BMM150_REPXY_HIGH_ACCURACY 0x17 //47 #define BMM150_REGISTER_0x52 0x52 //Default:0x00 (nZ=1+RepZ) #define BMM150_REPZ_LOWPWR 0x02 //3 #define BMM150_REPZ_REGULAR 0x0E //15 #define BMM150_REPZ_ENHANCED_REGULAR 0x1A //27 #define BMM150_REPZ_HIGH_ACCURACY 0x52 //83 /* Mode for LM75B. */ #define NORMAL_MODE 0U /* Indicates if operation on TWI has ended. */ static volatile bool m_xfer_done = false; /* TWI instance. */ static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); /** * @brief Function for setting active mode. */ void BMM150_set_mode(void) { BMM150_write(BMM150_REGISTER_0x4B, 0x01); BMM150_write(BMM150_REGISTER_0x4C, 0x06); // Turn on the sensor with ODR = 100Hz normal mode. //BMM150_write(BMM150_REGISTER_0x4E, 0x4C); BMM150_write(BMM150_REGISTER_0x52, 0x00); BMM150_write(BMM150_REGISTER_0x51, 0x00); // BMM150_write(BMM150_REGISTER_0x4F, 0x02);// High-pass filter (HPF) enabled with 0.2Hz cut-off frequency for INT1 (AOI1) interrupt generation only. // BMM150_write(BMM150_REGISTER_0x4D, 0x3F); // ACC AOI1 interrupt signal is routed to INT1 pin. // //BMM150_write(BMM150_REGISTER_0x51, 0x40); nrf_delay_ms(300); } /** * @brief TWI events handler. */ void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) { switch (p_event->type) { case NRF_DRV_TWI_EVT_DONE: if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX) { } m_xfer_done = true; break; case NRF_DRV_TWI_EVT_ADDRESS_NACK: printf("\n\rNRF_DRV_TWI_EVT_ADDRESS_NACK\r\n"); break; case NRF_DRV_TWI_EVT_DATA_NACK: printf("\n\rNRF_DRV_TWI_EVT_DATA_NACK\r\n"); break; default: break; } } /** * @brief TWI initialization. */ void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_lm75b_config = { .scl = 11, .sda = 12, .frequency = NRF_DRV_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_HIGH, .clear_bus_init = false }; err_code = nrf_drv_twi_init(&m_twi, &twi_lm75b_config, twi_handler, NULL); if(err_code==NRF_SUCCESS){ printf("okieee"); } APP_ERROR_CHECK(err_code); printf("twi"); nrf_drv_twi_enable(&m_twi); } void BMM150_write(uint8_t addr, uint8_t wdata) { ret_code_t ret; uint8_t tx_data[2] = {addr, wdata}; ret=nrf_drv_twi_tx(&m_twi, BMM150_SLAVE_ADDRESS, tx_data, sizeof(tx_data), false); } /*Read */ uint8_t BMM150_read(uint8_t addr) { ret_code_t ret; uint8_t receive_data; ret = nrf_drv_twi_tx(&m_twi, BMM150_SLAVE_ADDRESS, &addr, 1, true); nrf_delay_ms(100); ret = nrf_drv_twi_rx(&m_twi, BMM150_SLAVE_ADDRESS,&receive_data, 1); return receive_data; } /** * @brief Function for main application entry. */ int main(void) { printf("\r\nTWI sensor example started."); uint8_t rx_buffer[5]={}; int16_t *x_value,*x,*y,*z; twi_init(); BMM150_set_mode(); while (true) { rx_buffer[0]=BMM150_read(BMM150_REGISTER_X_MAG_LSB); rx_buffer[1]=BMM150_read(BMM150_REGISTER_X_MAG_MSB); rx_buffer[2]=BMM150_read(BMM150_REGISTER_Y_MAG_LSB); rx_buffer[3]=BMM150_read(BMM150_REGISTER_Y_MAG_MSB); rx_buffer[4]=BMM150_read(BMM150_REGISTER_Z_MAG_LSB); rx_buffer[5]=BMM150_read(BMM150_REGISTER_Z_MAG_MSB); *x_value = (rx_buffer[1]<<8)|rx_buffer[0]; *y_value = (rx_buffer[3]<<8)|rx_buffer[2]; *z_value = (rx_buffer[5]<<8)|rx_buffer[4]; printf("%d\n",*x_value); nrf_delay_ms(250); } } /** @} */Hi
i m using Bmm150 magnetometer sensor. i m trying to read x y z values.However, im not able to obtain the correct magnetometer values. I'm getting 0000 as values in all directions.
here is my code