STM32 SPI通信

时间:2018-11-02 17:00:53

标签: c stm32 spi stm32f4discovery

我正在尝试使用STM32F411VE进行SPI通信。 SPI通信出现一些问题。我正在按照此特定代码进行发送和接收

http://www.handsonembedded.com/stm32f103-spl-tutorial-5/

我正在使用SPI4。我对SPI的初始化是这样的:

/* SPI4 init function */
void MX_SPI4_Init(void)
{

  hspi4.Instance = SPI4;
  hspi4.Init.Mode = SPI_MODE_MASTER;
  hspi4.Init.Direction = SPI_DIRECTION_2LINES;
  hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi4.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi4.Init.NSS = SPI_NSS_SOFT;
  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi4.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi4) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

代码如下:

uint8_t SPISend(uint8_t data)
{
    SPI4->DR = data;
    while (!(SPI4->SR & SPI_SR_TXE));
    while (!(SPI4->SR & SPI_SR_RXNE));
    while (!(SPI4->SR & SPI_SR_BSY));
    return(SPI4->DR);
}

在这种特定的SPISend()方法中,控件永远不会到达终点。它卡在循环while (!(SPI4->SR & SPI_SR_TXE));中。

我的函数调用如下:

void write8(char reg, unsigned char data)
{
    uint8_t retVal;
    enableChip;
    reg|=0x80;
    retVal = SPISend(reg);
    retVal = SPISend(data);
    disableChip;
}

任何建议。

1 个答案:

答案 0 :(得分:1)

在我的脑海中,SPI_CR1_SPE中应启用SPI_CR1_SSI和/或SPI4->CR1HAL_SPI_Init()没有设置任何一项,但是HAL SPI传输功能设置了,如果您使用自己的传输代码,则应该自己进行设置。

更新

如果启用SPE中的SSIenableChip位,则将永远不会调用它,因为它不是没有括号的函数调用。

这两行

SPI4->DR = data;
while (!(SPI4->SR & SPI_SR_TXE));

的顺序错误。您首先要等待TXE != 0,这意味着发送器队列已准备好接收更多数据,然后再写入数据。

第二行在这里

while (!(SPI4->SR & SPI_SR_RXNE));
while (!(SPI4->SR & SPI_SR_BSY));

可能是一个无休止的循环,因为到SPI_SR_RXNE变成1时,或之后不久,SPI_SR_BSY将从1变为0