08-03-2020 10:50 PM
Hello all,
I am trying to migrate my project from BMI160 to BMI270 but so far I am unable to initialise the device.
I began with some code which works for BMI160 (ATSAM M0+, Atmel studio) and am trying to migrate using the reference API :https://github.com/BoschSensortec/BMI270-Sensor-API.
Hopefully someone can help point me in the right direction.
1) Firstly I should point out that SPI communication works with BMI270 using my user spi read/write functions directly:
static uint8_t read_test_buff[2] = {0, 0};
static uint8_t write_test_buff[2] = {0x11, 0x12}; // some random data
static uint8_t read_test_buff2[2] = {0, 0, 0};
// READ TEST //
user_spi_read(0, BMI2_CHIP_ID_ADDR, read_test_buff, 2);
//updates as expected: read_test_buff = {0, 0x24, 0}; // SUCCESS
// WRITE TEST //
user_spi_write(0, BMI2_ACC_OFF_COMP_0_ADDR, write_test_buff, 2); // write to accelerometer offset x & y registers
user_spi_read(0, BMI2_ACC_OFF_COMP_0_ADDR, read_test_buff2, 3); // read accelerometer offset x & y registers
//updates as expected: read_test_buff2 = {0, 0x11, 0x12}; // SUCCESS
QUESTION: Is this output format correct?
Or should I be getting something like read_test_buff={0x24, 0} and read_test_buff2={ 0x23, 0x24, 0},
or something else ?
2) Here's my code to initialise the sensor:
struct bmi2_dev bmi270_dev;
int8_t BMI270_sensor_init(void)
{
int8_t rslt = BMI2_OK;
// Set SPI interface parameters
bmi270_dev.chip_id = BMI270_CHIP_ID; // also tried chip_id =0
bmi270_dev.dummy_byte = 1;
bmi270_dev.read_write_len = 32; // also tried read_write_len= 8192 as in github arduino gist
bmi270_dev.intf = BMI2_SPI_INTF;
bmi270_dev.read = user_spi_read;
bmi270_dev.write = user_spi_write;
bmi270_dev.delay_us = user_delay_us;
bmi270_dev.config_file_ptr = NULL;
rslt = bmi270_init(&bmi270_dev);
return rslt;
}
Whilst debugging I have followed initiation through to bmi2_soft_reset(...). More specifically to the line:
/* Reset bmi2 device */
rslt = bmi2_set_regs(BMI2_CMD_REG_ADDR, &data, 1, dev);
This calls 'user_spi_write', however it throws an error.
There seems to be a similar issue when bmi2_get_regs(...) is called. (rslt = BMI2_E_COM_FAIL).
Any help would be much appreciated!
Solved! Go to Solution.
08-04-2020 04:28 AM
Hi
Please read chip id to confirm the SPI communication is ok. If you could read chip id success, and then to run the bmi270_init() success.
We offer COINES examples code to help customer learn how to run BMI270. Pleas install coines, refer to bmi270_read_accel.c.
(1) you need remap your spi read/write to API fucntion.
(2) I can't find out any issue.
(3) After run bmi270_read_accel.c, I log some SPI data from Logic
Time [s] | Packet ID | MOSI | MISO |
2.2E-06 | 0 | 0x7E | 0x00 |
5.5E-06 | 0 | 0xB6 | 0x00 |
0.007462 | 1 | 0x80 | 0x00 |
0.007463 | 1 | 0x00 | 0x00 |
0.007465 | 1 | 0x00 | 0x24 |
0.012867 | 2 | 0xFC | 0x00 |
0.012868 | 2 | 0x00 | 0x00 |
0.01287 | 2 | 0x00 | 0x03 |
0.017612 | 3 | 0x7C | 0x00 |
0.017615 | 3 | 0x02 | 0x00 |
0.023373 | 4 | 0xD9 | 0x00 |
0.023374 | 4 | 0x00 | 0x00 |
0.023376 | 4 | 0x00 | 0x00 |
0.029466 | 5 | 0x59 | 0x00 |
0.029469 | 5 | 0x00 | 0x00 |
0.033374 | 6 | 0x5B | 0x00 |
0.033379 | 6 | 0x00 | 0x00 |
0.033382 | 6 | 0x00 | 0x00 |
08-04-2020 03:57 PM - edited 08-04-2020 06:44 PM
Hi fish,
Indeed my SPI functions needed re-mapping. For anybody else who runs into the same issue:
BMI160 SPI in the format:
int8_t user_spi_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
int8_t user_spi_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
BMI270 SPI in the format:
int8_t user_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bmi2_dev *dev);
int8_t user_spi_write(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bmi2_dev *dev);
Many thanks