06-08-2020 06:23 AM
I tried to use STM32 MCU to use SPI to communicate with BMX160, but I can't get CHIPID, I already use github bmi.h and bmi.c files, please tell me which part is missing to read CHIPID normally
06-17-2020 03:20 AM
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.
06-17-2020 05:38 AM - edited 06-17-2020 07:47 AM
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;
}