For a personal project, I am looking into upgrading some firmware for the BMI160 to the BMI270 (integrated on a PCB). There, I am struggling with reading the correct CHIP_ID of the BMI270 over SPI communication.
To test my hypotheses, I turned to COINES and the App2.0 board with shuttle boards of the two sensors and had an in-depth look at the differences in the start-up procedure. I found out that I can read the CHIP_ID of the BMI270 with minor alterations to the bmi160_read_chip_id.c script and some of the functions it calls. The most interesting insight came from the differences in the employed *get_regs() functions, which also caused a big question as to why it even works in the case of the BMI160:
To read from registers of the BMI270, bmi2_get_regs() is used. In SPI mode, this function receives data that is one byte longer than the relevant data, that one byte is referred to as the dummy_byte.
To read from registers of the BMI160, bmi160_get_regs() is used. This function has no notion of a dummy_byte and when trying to use it to read registers from a BMI270 it actually returns zeros, i.e., the dummy_byte.
So my question is: How come the SPI communication of the two sensors has such a fundamental difference? From the datasheets, I followed that both sensors receive a dummy_byte over SDO, but only the code for the BMI270 reflects this. Moreover, I thought this was a fundamental concept of SPI, but since I am rather new to this world, I am happy for corrections to this view. Lastly, if there is such a thing like a dummy_byte in the SPI communication with the BMI160, how is it handled by bmi160_get_regs()?
I am very grateful for all pointers and help!
EDIT: Just realized that the latest version of the BMI160_driver incorporates the notion of a dummy_byte. However, the latest version of COINES still features the code I linked above without any notion of a dummy_byte, so my question as to why it works remains.
In fact, BMI2xy(BMI270/BMI260) have dummy byte in SPI read regs. If review BMA4xy API code, you could also find the dummy byte in SPI read function.
For BMI160, there is no dummy byte in SPI read function.