首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在STM32单片机上使用低电平(LL)接口读取SPI上的可变长度消息

在STM32单片机上使用低电平(LL)接口读取SPI上的可变长度消息
EN

Stack Overflow用户
提问于 2018-05-30 05:00:37
回答 2查看 1.3K关注 0票数 0

我的系统由一块SPI板和一个通过STM32NUCLEO连接的从设备组成。从设备发送长度可变的命令:可能的长度为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只提供一次读取8位或16位的函数,目前我在接收4位命令时遇到问题,因为函数LL_SPI_ReceiveData8期望接收8位。

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

IRQ处理程序:

代码语言:javascript
复制
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();
  }
}

回调

代码语言:javascript
复制
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_ReceiveData4.这样的东西,所以我使用了LL_SPI_ReceiveData8函数来读取

你有什么建议吗?

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-30 16:27:37

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

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

你的“问题”是没有4位读取功能。这是由于接收数据寄存器将始终包含16位,但在您的情况下只有4位有效数据。其他位是'0‘。

你的回调函数

代码语言:javascript
复制
aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);

我会将0..15中的值写入aRxBuffer,您不需要使用ReceiveData4()即可获得答案:-)

也请参阅1193ff页上的STM32L4系列Reference Manual的参考手册。

票数 0
EN

Stack Overflow用户

发布于 2018-05-30 08:24:06

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50592861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档