Closed
Description
This sketch illustrates a failure of SPI.transfer with a NUCLEO-H743ZI2. The sketch use a SCLK rate of 400kHz.
#include "SPI.h"
const uint8_t CS_PIN = 10;
void setup() {
SPI.begin();
pinMode(CS_PIN, OUTPUT);
}
void loop() {
SPI.beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0));
digitalWrite(CS_PIN, LOW);
SPI.transfer(0x55);
digitalWrite(CS_PIN, HIGH);
SPI.endTransaction();
delay(1);
}
The problem is shown in this trace of SCLK in yellow and MOSI in green. The eighth clock pulse and data are chopped.
I looked at the SPI library code and found where the problem occurs, SPI is disabled before the last bit is complete.
The file is: STM32/hardware/stm32/1.9.0/libraries/SPI/src/utility/spi_com.c
If you add a delay here at about line 443:
#if defined(STM32H7xx) || defined(STM32MP1xx)
/* Close transfer */
/* Clear flags */
HAL_Delay(1); // <<-------------- added by WHG to delay call LL_SPI_Disable()
LL_SPI_ClearFlag_EOT(_SPI);
LL_SPI_ClearFlag_TXTF(_SPI);
/* Disable SPI peripheral */
LL_SPI_Disable(_SPI);
#endif
The SPI frame is correct.
I tried to find a SPI status check to replace the delay but was not successful when I looked at the STM32H743/753 Reference Manual.