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



我的系统由一个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 的倍数。

谢谢。

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

它支持 4 到 16 位之间的 SPI 数据传输长度。所以你的第一次尝试似乎还不错。

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

您的回调函数

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

会将 0..15 的值写入 aRxBuffer,你不需要LL_SPI_ReceiveData4((得到你的答案:-(

第1333f页的STM32L4系列参考手册也是如此。

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

顺便说一句,这个秘密从属设备是具有可变字长的吗?

最新更新