Bosch Sensortec Community

    cancel
    Showing results for 
    Search instead for 
    Did you mean: 

    I can't get BMX160 CHIPID using STM32 SPI

    fish
    Community Moderator

    Re: I can't get BMX160 CHIPID using STM32 SPI

    The two fuctions are just SPI read/write by your platform.

    In fact, STM32 already provide SPI read/write fuction and examples, and you could just run the example.

    There are many resource to get the example, search 'STM32 SPI example' in google/bing...

    Best regards.

    BSTRobin
    Community Moderator

    Re: I can't get BMX160 CHIPID using STM32 SPI

    Hello,

    From data sheet: at reset/power-up, BMX160 was in I2C mode.It is recommend to perform SPI single read access to the address 0x7F befor the actual communication in order to use the SPI interface.

     

    Please refer the following example code, it worked well on STM32.

    bmx160.c

    #define BMX160_SPI_COMM_TEST_ADDR UINT8_C   (0x7F)

    BMX160_RETURN_FUNCTION_TYPE bmx160_init(struct bmx160_t *bmx160)
    {
    /* variable used to return the status of communication result*/
    BMX160_RETURN_FUNCTION_TYPE com_rslt = E_BMX160_COMM_RES;
    u8 v_data_u8 = BMX160_INIT_VALUE;
    u8 v_pmu_data_u8 = BMX160_INIT_VALUE;

    /* assign bmx160 ptr */
    p_bmx160 = bmx160;

    /* Dummy read of 0x7F register to enable SPI Interface
    * if SPI is used */
    bmx160_read_reg(BMX160_SPI_COMM_TEST_ADDR, &v_data_u8, 1);

    com_rslt = p_bmx160->BMX160_BUS_READ_FUNC(p_bmx160->dev_addr,
    BMX160_USER_CHIP_ID_REG,
    &v_data_u8,
    BMX160_GEN_READ_WRITE_DATA_LENGTH);

    /* store the chip id which is read from the sensor */
    p_bmx160->chip_id = v_data_u8;

    /* To avoid gyro wakeup it is required to write 0x00 to 0x6C*/
    com_rslt += bmx160_write_reg(BMX160_USER_PMU_TRIGGER_ADDR, &v_pmu_data_u8, BMX160_GEN_READ_WRITE_DATA_LENGTH);

    return com_rslt;
    }

    main.c

    struct bmx160_t bmx160dev;

    int main(void)
    {

    int8_t rslt = BMX160_SUCCESS;

    struct bmx160_t *dev;

    dev = &bmx160dev;


    dev->bus_read = SensorAPI_BMX160_SPIx_Read;
    dev->bus_write = SensorAPI_BMX160_SPIx_Write;
    dev->delay_msec = HAL_Delay;
    dev->mag_manual_enable = 0;

    PDEBUG("BMX160 initialize started\r\n");

    rslt = bmx160_init(dev);
    if (rslt != BMX160_SUCCESS)
    {
    PDEBUG("bmx160_init() failed, error code: %d\r\n", rslt);
    return rslt;
    }
    else
    {
    PDEBUG("bmx160_init success, read chip ID: %02X\r\n", dev->chip_id);
    }

    while(1)

    {

    ...

    }

    }

     

    uint8_t GTXBuffer[256], GRXBuffer[256];

    int8_t SensorAPI_BMX160_SPIx_Read(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint8_t ReadNumbr)
    {
    slave_address7 = slave_address7;
    GTXBuffer[0] = subaddress | 0x80;

    HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); // NSS low

    //HAL_SPI_TransmitReceive(&hspi2, pTxData, pRxData, ReadNumbr+1, BUS_TIMEOUT); // timeout 1000msec;
    HAL_SPI_TransmitReceive(&SPI_HANDLE, GTXBuffer, GRXBuffer, ReadNumbr + 1, BUS_TIMEOUT); // timeout 1000msec;
    while(SPI_HANDLE.State == HAL_SPI_STATE_BUSY); // wait for xmission complete

    HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); // NSS high
    memcpy(pBuffer, GRXBuffer + 1, ReadNumbr);

    return 0;
    }

    int8_t SensorAPI_BMX160_SPIx_Write(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint8_t WriteNumbr)
    {
    slave_address7 = slave_address7;
    GTXBuffer[0] = subaddress & 0x7F;
    memcpy(&GTXBuffer[1], pBuffer, WriteNumbr);

    HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); // NSS low

    //HAL_SPI_TransmitReceive(&hspi2, pTxData, pRxData, WriteNumbr+1, BUS_TIMEOUT); // send register address + write data
    HAL_SPI_Transmit(&SPI_HANDLE, GTXBuffer, WriteNumbr+1, BUS_TIMEOUT); // send register address + write data
    while(SPI_HANDLE.State == HAL_SPI_STATE_BUSY); // wait for xmission complete

    HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET); // NSS high

    return 0;
    }

    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