SPI makes stupid things
I'm new with the STM32F767ZI (Nucleo board) and tried to write a SPI driver with DMA access.
It works so far, but I have some stupid things on my log, I can't interprete. Is anybody there, who knows what there is going wrong?
I'd like to send three bytes and everythings works fine so far, but after the last byte the software/hardware added a additional signal on the MISO line.

My SPI configuration:
SPIConfig.Interface = CSPI_1;
SPIConfig.u32PortPinSCK = CONFIG_SPI_SCK;
SPIConfig.u32PortPinMOSI = CONFIG_SPI_MOSI;
SPIConfig.u32PortPinMISO = CONFIG_SPI_MISO;
SPIConfig.u32PortPinNSS = CONFIG_SPI_NSS;
SPIConfig.bMasterMode = true;
SPIConfig.bNSSSoft = true;
SPIConfig.bCPHA_1 = false;
SPIConfig.bCPOL_1 = false;
SPIConfig.u8ResponseBytesToIgnore = 1;
SPIConfig.pvDestLeadingBytes = &m_Param.u8Status;
if(m_SPI.Init(SPIConfig, GLOBALS_INITMODE_STD)
(.......)
uint32_t CSpi::InitSPI(bool_t bCPHA_1, bool_t bCPOL_1) /* Called by CSpi::Init() */
{
/* Variable declarations */
uint32_t u32RetVal;
/* End - Variable declarations */
/* Variable initialisations */
u32RetVal = __SAFETY_NO_ERROR__;
/* End - Variable initialisations */
/* Start user code here */
/* Enable the peripheral clock of SPIx */
if(m_Param.pSPIx == SPI1)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);
}
else if(m_Param.pSPIx == SPI2)
{
LL_APB2_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
}
else if(m_Param.pSPIx == SPI3)
{
LL_APB2_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3);
}
else if(m_Param.pSPIx == SPI4)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI4);
}
else if(m_Param.pSPIx == SPI5)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI5);
}
else if(m_Param.pSPIx == SPI6)
{
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI6);
}
else
{
u32RetVal = SAFETYERROR(__CSPI_FCT_INIT_SPI__,__CSPI_INDEX_INTERFACE__);
}
if(u32RetVal == __SAFETY_NO_ERROR__)
{
LL_SPI_SetBaudRatePrescaler(m_Param.pSPIx, LL_SPI_BAUDRATEPRESCALER_DIV32);
LL_SPI_SetBaudRatePrescaler(m_Param.pSPIx, LL_SPI_BAUDRATEPRESCALER_DIV256);
LL_SPI_SetTransferDirection(m_Param.pSPIx,LL_SPI_FULL_DUPLEX);
if(bCPHA_1 == false)
{
LL_SPI_SetClockPhase(m_Param.pSPIx, LL_SPI_PHASE_1EDGE); /* CPHA = 0 */
}
else
{
LL_SPI_SetClockPhase(m_Param.pSPIx, LL_SPI_PHASE_2EDGE); /* CPHA = 1 */
}
if(bCPOL_1 == false)
{
LL_SPI_SetClockPolarity(m_Param.pSPIx, LL_SPI_POLARITY_LOW); /* CPOL = 0 */
}
else
{
LL_SPI_SetClockPolarity(m_Param.pSPIx, LL_SPI_POLARITY_HIGH); /* CPOL = 1 */
}
LL_SPI_SetTransferBitOrder(m_Param.pSPIx, LL_SPI_MSB_FIRST);
LL_SPI_SetDataWidth(m_Param.pSPIx, LL_SPI_DATAWIDTH_8BIT);
if((m_Param.u16PortPinNSS != 0U)&&(m_Param.u16PortNSS != 0U))
{
if(m_Param.bMasterMode == false)
{
LL_SPI_SetNSSMode(m_Param.pSPIx, LL_SPI_NSS_HARD_INPUT);
}
else
{
if(m_Param.bNSSSoft == false)
{
LL_SPI_SetNSSMode(m_Param.pSPIx, LL_SPI_NSS_HARD_OUTPUT);
}
else
{
LL_SPI_SetNSSMode(m_Param.pSPIx, LL_SPI_NSS_SOFT);
}
}
LL_SPI_DisableNSSPulseMgt(m_Param.pSPIx);
}
LL_SPI_SetRxFIFOThreshold(m_Param.pSPIx, LL_SPI_RX_FIFO_TH_QUARTER);
if(m_Param.bMasterMode == true)
{
LL_SPI_SetMode(m_Param.pSPIx, LL_SPI_MODE_MASTER);
}
else
{
LL_SPI_SetMode(m_Param.pSPIx, LL_SPI_MODE_SLAVE);
}
/* Configure SPI1 DMA transfer interrupts */
/* Enable DMA RX Interrupt */
LL_SPI_EnableDMAReq_RX(m_Param.pSPIx);
/* Enable DMA TX Interrupt */
LL_SPI_EnableDMAReq_TX(m_Param.pSPIx);
}
/* End user code */
/* Return section */
SAFETY_RETURN(u32RetVal);
/* End return section */
}
Thanks for your help!
Michael
