Is there a maximum time from SPI_CS going LOW to SPI_SCK/SPI_MOSI starting?
The datasheet shows a minimum of 40ns for the tCSB_setup, but no maximum.
I ask because in one configuration
:: SPI_CS goes LOW and within 1us the SPI_SCK starts. The data read is correct.
A seperate configuration
:: SPI_CS goes LOW then waits 4us before SPI_SCK starts. The data read is incorrect.
Is it possible the device is going to low power mode or something due to the SPI_SCK not running within a certain window from SPI_CS going LOW?
This may not break the SPI interface, but it may cause data corruption?
Or, should what is happening above unexpected, and should not happen?
Could we know which SPI you used, HW SPI or IO simulation SPI?
Thanks for the reply, when it works the MCU's SPI HW with automated CS support is used. This has the CS and SCK interaction within 1us. Due to some performance limitations though, a 2nd configuration was tested which requires this "automated CS" to be disabled and replaced with a manual control of the CS via sim IO. In this case, the delta between the CS LOW and SCK starting can be > 4us. When this happens the BMI270 data gets corrupted. All other pins besides the CS are still SPI HW controlled in both instances. The other sensors on the same SPI bus can still function properly, only the BMI270 seems to be effected.
CSB seteup only had minmum value requirement, no maxmum value requirement. You could check SPI master and slave device from their data sheet.
I used GPIO to control CSB like this code:
int8_t SensorAPI_SPIx_Read(uint8_t slave_address7, uint8_t subaddress, uint8_t *pBuffer, uint16_t ReadNumbr)
slave_address7 = slave_address7;
GTXBuffer = subaddress | 0x80;
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET); // NSS low
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);
I captured the following SPI waveform, it worked well. I suggest you could capture SPI waveform to check if it works.