Hello !
I am trying to get data from sensor ( chip_id of bmi160 ), but i always get 0 .
Could someone tell me how to do?
I follow these steps :
1. I Declared SPI instance and bmi160 sensor struct like this :
static nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE( 0 ); // SPI instance. //宣告spi例子 struct bmi160_dev sensor ; // bmi160 sensor struct // 宣告bmi160感應器結構
2. Declare delay & read & write functions like this :
void user_delay_ms(uint32_t period) {
// delay time
//暫停幾毫秒
nrf_delay_ms( period ) ;
} // user_delay_ms()
int8_t spi1_read_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length){
// read data from sensor
// 從感應器讀取資料
ret_code_t ret;
nrf_drv_gpiote_out_clear(SPI_SS_PIN); /* To activate the sensor on the bus, i.e., set the chip/slave select low */
ret = nrf_drv_spi_transfer(&spi, ®_addr, 1, NULL, 0);
if(ret == NRF_SUCCESS)
ret = nrf_drv_spi_transfer(&spi, NULL, 0, reg_data, length);
nrf_gpio_pin_set(SPI_SS_PIN); /* To deactivate the sensor on the bus, i.e., set the chip/slave select high*/
return (int8_t)ret;
} // spi1_read_transfer()
int8_t spi1_write_transfer(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t length){
// write data to sensor
// 寫資料到感應器
ret_code_t ret;
nrf_drv_gpiote_out_clear(SPI_SS_PIN); /* To activate the sensor on the bus, i.e., set the chip/slave select low */
ret = nrf_drv_spi_transfer(&spi, ®_addr, 1, NULL, 0);
if(ret == NRF_SUCCESS)
ret = nrf_drv_spi_transfer(&spi, reg_data, length, NULL, 0);
nrf_gpio_pin_set(SPI_SS_PIN); /* To deactivate the sensor on the bus, i.e., set the chip/slave select high*/
return (int8_t)ret;
} // spi1_write_transfer()
3. init spi_config and bmi160 sensor and print result in main like this :
int main(void){
bsp_board_init(BSP_INIT_LEDS);
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
// init spi // 初始化接角
nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = SPI_SS_PIN;
spi_config.miso_pin = SPI_MISO_PIN;
spi_config.mosi_pin = SPI_MOSI_PIN;
spi_config.sck_pin = SPI_SCK_PIN;
APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
// init bmi160 sensor // 初始化感應器
sensor.id = 1 ;
sensor.interface = BMI160_SPI_INTF;
sensor.read = spi1_read_transfer;
sensor.write = spi1_write_transfer;
sensor.delay_ms = user_delay_ms;
int8_t rslt = BMI160_OK;
uint8_t reg_addr = BMI160_CHIP_ID_ADDR; // chip_id address // chip_id暫存器位置
uint8_t data;
uint16_t len = 1;
rslt = bmi160_get_regs(reg_addr, &data, len, &sensor); // read sensor chip_id // 讀取chip_id資料
// print result // 輸出結果
SEGGER_RTT_printf( 0, "rslt = %d \n", rslt ) ;
SEGGER_RTT_printf( 0, "data = %d \n", data ) ;
} // main()
4.result :
both of rslt and data are 0 .
I have referenced two websites :
1. BMI160 sensor API Introduction
2.How to initializate SPI user interface?
Thanks for help!