使用STM32 MCU上的低电平(LL)api通过SPI读取可变长度消息

时间:2018-05-29 21:00:37

标签: interrupt stm32 spi variable-length

我的系统由STM32NUCLEO板和通过SPI连接的从设备组成。从设备发送可变长度的命令:可能的长度为4,8,10,14位。

我试图使用LL API和中断在我的核板上检测这些消息。

我目前正在研究的解决方案是基于将SPI设置为4位数据宽度( SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT ),然后计算字数(1我收到的字= 4位)。这样,如果我收到1个字,则意味着我收到了4位命令,2个字 - > 8位命令。如果我收到3个字,那就意味着我收到了一个10位命令(应该丢弃2位),依此类推。

不幸的是,我注意到LL API仅提供一次读取8位或16位的功能,目前我在接收4位命令时遇到问题,因为函数 LL_SPI_ReceiveData8 期望获得8位。

这是我对IRQ处理程序和回调的实现:

IRQ处理程序:

void SPI1_IRQHandler(void)
{
  /* Check RXNE flag value in ISR register */
  if(LL_SPI_IsActiveFlag_RXNE(SPI1))
  {
    /* Call function Slave Reception Callback */
    SPI1_Rx_Callback();
  }
  /* Check STOP flag value in ISR register */
  else if(LL_SPI_IsActiveFlag_OVR(SPI1))
  {
    /* Call Error function */
    SPI1_TransferError_Callback();
  }
}

回调

void SPI1_Rx_Callback(void)
{
  /* Read character in Data register.
  RXNE flag is cleared by reading data in DR register */
  aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);
}

正如我之前所说,问题似乎是我使用 LL_SPI_ReceiveData8 函数来阅读,因为我找不到类似 LL_SPI_ReceiveData4 的内容。

你有什么建议吗?

此外,是否可以将SPI设置为使用2位数据宽度而不是4位?像 SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_2BIT 这样的东西:这样就可以更容易地检测命令,因为4,8,10和14是2的倍数。

谢谢。

2 个答案:

答案 0 :(得分:0)

最小的可添加数据块是字节。因此,即使您收到4位,读取值也是8位。

BTW这个秘密的奴隶设备有多长的字长?

答案 1 :(得分:0)

使用有关所用控制器的新信息:

它支持SPI数据传输长度在4到16位之间。所以你的拳头尝试似乎并不那么糟糕。

您的“问题”是没有4位读取功能。这是由接收数据寄存器引起的,该寄存器总是包含16位,但在您的情况下只有4位有效数据。其他位为'0'。

您的回调功能

aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);

会将值从0..15写入aRxBuffer,而您不需要 ReceiveData4()以获得答案: - )

第1193页的STM32L4系列Reference Manual参考手册也是如此。