代码之家  ›  专栏  ›  技术社区  ›  Alexis

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

  •  0
  • Alexis  · 技术社区  · 6 年前

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

    我正在尝试使用ll API和中断检测核仁板上的这些消息。

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

    不幸的是,我注意到ll API提供的函数一次只能读取8位或16位,目前我在接收4位命令时遇到问题,因为函数 所有SPI接收数据8 期望接收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);
    }
    

    如前所述,在我看来,问题似乎是我正在使用 所有SPI接收数据8 因为我找不到

    你有什么建议吗?

    此外,是否可以将SPI设置为使用2位数据宽度而不是4位数据宽度?有点像 spi initstruct.datawidth=ll_spi_datawidth_2bit :这样应该更容易检测命令,因为4、8、10和14是2的倍数。

    谢谢您。

    2 回复  |  直到 6 年前
        1
  •  0
  •   theSealion    6 年前

    关于所用控制器的新信息:

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

    您的回调函数

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

    将0..15的值写入arxbuffer,您不需要 接收数据4() 要得到答案:—)

    因此,STM32L4系列的参考手册 Reference Manual 第1193FF页。

        2
  •  0
  •   0___________    6 年前

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

    顺便问一下,为什么这个秘密的从设备有可变的字长?