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(>XBuffer[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; }
... View more