gpt4 book ai didi

linux - 使用 STM32F1 MCU 处理损坏的 SPI 数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:25 26 4
gpt4 key购买 nike

我正在为带有 STM32F1 MCU 的定制板开发一个应用程序,该板需要能够从意外数据损坏中恢复。

数据流程如下:主设备(Linux 机器)向从设备发送请求,从设备解析消息并准备发送回复。然后主人宣读答复。交换速度很快(@18MHz)并且实现如下:

if (::ioctl(_fd, SPI_IOC_MESSAGE(2), &transaction) < 0) {
warn("message not sent");
return false;
}

这两条消息之间的延迟约为 50us。消息长度是固定的。

在 STM 方面,我使用 DMA 驱动的 SPI 驱动程序,该驱动程序按照我将在下面编写的方式实现。

我使用的 SPI2 的时钟为 APB1@36MHz(HSE@24 MHz;AHB@72MHz;APB1@36MHz)。

在 SPI 配置为通过在 RXNEIE (CR2->RXDMAEN) 上发出 DMA 请求来读取消息(固定长度!)之后。处理消息后,答案将通过 DMA1 (CR2->TXDMAEN) 传输。

一切都很顺利,直到我以某种方式干预。我试图恢复的情况是在传输时拔掉 SCLK 线。

我正在努力从这件事中恢复过来。我将阐述我的想法,因为我不确定错误在哪里。

DMA 配置为处理固定长度消息。这就是为什么当我以某种方式干扰时,DMA Controller 会等待,直到整个消息被处理并且缓冲区被移动。假设,当 SCLK 突然消失时,我收到了三分之一的消息。 DMA 将等待剩下的三分之二。主站继续发送请求。因此,在 SCLK 回来后,下一条消息的 2/3 将被放入缓冲区。发出 DMA 中断,但最后一条消息的剩余踪迹丢失。它肯定丢失了,但我可以检测到使用 ERRIE 标志对要设置的 OVR 标志发出中断。

我尝试处理该中断,但无济于事。

我现在的中断处理程序检查 BSY 标志是否已设置(跟踪正在由 SPI Controller 进行处理)。如果已设置,我会终止 DMA(它已经开始处理下一条消息)并保留 OVR 标志。一旦 BSY 被清除,我就会清除 OVR 并重置 DMA 以进行接收。

这没有多大帮助。

我可能使用的另一个选项是一个专用定时器,它在 SCLK 的上升沿上复位(AN3109 应用笔记启发的解决方案)。这样我就可以实现 DMA 超时。如果我只收到消息的一部分,如果 SCLK 长时间不存在,我可以在定时器溢出时生成中断。不过,这个解决方案存在问题。

我知道描述很模糊,但我已经尽力了,希望有更深入见解的人可以提供帮助。

最佳答案

在 CS 线上安装中断处理程序。在上升沿,如果传输尚未完成,则中止所有操作并重新开始 DMA。使用SPI_CR1中的SSI位,上升沿置位,下降沿清零。

关于linux - 使用 STM32F1 MCU 处理损坏的 SPI 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com