Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 
    SOLVED

    BMI270 gyro scaling incorrect if using FIFO with prefiltered data

    BMI270 gyro scaling incorrect if using FIFO with prefiltered data

    etracer
    Established Member

    First let me start by saying in my application I'm not using the API and have implemented my own driver. Everything is working properly when not using the FIFO. However we want to utilize the 6.4KHz ODR and this requires using the FIFO and prefiltered data. The problem I'm seeing is that when we choose filtered data for the FIFO (FIFO_DOWNS = 0x88) the data is correct and the GYRO_RANGE of +=2000dps (GYRO_RANGE = 0x00) works as expected (and matches the behavior when doing direct register reads instead of using the FIFO).

    However when switching to prefiltered data (FIFO_DOWNS = 0x00) to get the 6.4KHz ODR the GYRO_RANGE seems to be ignored and the data behaves as if the range is +-250dps (as if GYRO_RANGE was set to 0x03) even though it's set to 0x00 (and verified by reading the register back). So instead of 16.4 LSB/dps it's behaving like 131.2 LSB/dps. This is unworkable in our application as we need the full +-2000dps scale.

    Everything else behaves as expected. The ODR in the FIFO is 3.2KHz when using filtered and 6.4KHz when prefilitered as it should. It's just the GYRO_RANGE and the full-range scaling that seems to be misbehaving.

    In this test case the FIFO was configured for headerless mode and only the gyro data was enabled (FIFO_CONFIG_1 = 0x80).

    So to recap, the gyro data in the FIFO behaves normally if it's configured to be filtered data. However when set to be prefiltered data the scaling is incorrect and seems to be behaving like GYRO_RANGE = 0x03 (+-250dps) even though it's set to 0x00 (+-2000dps).

    Any thoughts?

    9 REPLIES 9

    Vincent
    Community Moderator
    Community Moderator

    You can change the register 0x43 bit 3 to 1, then the gyro range is 2000 dps as expected.

    etracer
    Established Member

    Thank you, that seems to work. But I don't know why. According to the datasheet bit 3 of the GYR_RANGE register (0x43) is the ois_range. I'm not using OIS and it's disabled (by default). Is the datasheet wrong or is there something else going on here? I was setting GYR_RANGE to 0x0 (which is the default anyway) and this selects 2000dps for the gyro data. And this works properly if using register based reads or even the FIFO when filtered data is selected. However when prefiltered data is selected is seems to ignore bits 0-2 and only uses bit 3 (when 0 means 250dps). I can't find anything int he datasheet that documents this behavior.

     

    Vincent
    Community Moderator
    Community Moderator

    Yes, it is not in current datasheet yet.

    When you select the prefilter data then the OIS data channel will be used to fill into the FIFO. 

    We will udapte our spec later on to make it clear. 

    etracer
    Established Member

    Thank you. A couple of other suggestions for improvements in the datasheet for things that seemed confusing:

    • Better document the unusual SPI register read behavior where 16 bits must be read with the initial 8 bits ignored. There is only one small mention of this critical fact and it's embedded and not easily noticed. See page 141.

    Please note that the first byte received from the device via the SDO line correspond to a dummy byte and the 2nd byte correspond to the value read out of the specified register address. That means, for a basic read operation two bytes have to be read and the first has to be dropped and the second byte must be interpreted.


    • In the register detailed descriptions identity all the bits. There are numerous cases where only the funtional bits are identified and often it's not clear that some bits are skipped - leading to easy mistakes. For bits that are not valid identify them as "reserved" or "not used". For example INT1_IO_CTRL and INT2_IO_CTRL only define bits 1-4 but it's easy to misread this as the first nibble. Or INT_STATUS_1 which defines every bit but 3 and 4. So not saying the datasheet is incorrect in these cases, but it could be more clear and easier to interpret if all the bits were defined - even as "reserved".


    Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist