我的系统由一块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处理程序:
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_ReceiveData4.这样的东西,所以我使用了LL_SPI_ReceiveData8函数来读取
你有什么建议吗?
此外,是否可以将SPI设置为使用2位数据宽度而不是4位数据宽度?例如SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_2BIT:这样应该更容易检测到命令,因为4、8、10和14是2的倍数。
谢谢。
发布于 2018-05-30 16:27:37
使用有关所用控制器的新信息:
它支持4到16位之间的SPI数据传输长度。所以你的第一次尝试看起来还不错。
你的“问题”是没有4位读取功能。这是由于接收数据寄存器将始终包含16位,但在您的情况下只有4位有效数据。其他位是'0‘。
你的回调函数
aRxBuffer[ubReceiveIndex++] = LL_SPI_ReceiveData8(SPI1);
我会将0..15中的值写入aRxBuffer,您不需要使用ReceiveData4()即可获得答案:-)
也请参阅1193ff页上的STM32L4系列Reference Manual的参考手册。
发布于 2018-05-30 08:24:06
最小的可寻址数据块是字节。因此,即使您接收到4位,读取值也是8位。
顺便说一下,这个具有可变字长的秘密从属设备是什么?
https://stackoverflow.com/questions/50592861
复制相似问题