首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用STM32F1单片机处理损坏的SPI数据

使用STM32F1单片机处理损坏的SPI数据
EN

Stack Overflow用户
提问于 2015-08-20 00:04:47
回答 1查看 760关注 0票数 0

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

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

代码语言:javascript
复制
if (::ioctl(_fd, SPI_IOC_MESSAGE(2), &transaction) < 0) {
    warn("message not sent");
    return false;
}

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

在STM方面,我使用了DMA驱动的SPI驱动程序,它是以下面我将要编写的方式实现的。

我使用的是SPI2,它的时钟频率是36 MHz (HSE@24 MHz;AHB@72 MHz;apb1@36 MHz)。

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

一切都像魔咒一样工作,直到我以某种方式干预。我正在尝试恢复的情况是在传输时拔出SCLK线路。

我正在努力从这件事中恢复过来。我将列出我的想法,因为我不确定bug在哪里。

DMA被配置为处理固定长度的消息。这就是为什么当我以某种方式进行干预时,DMA控制器会等待,直到整个消息被处理完毕,缓冲区被移位。假设,当SCLK突然消失时,我收到了三分之一的消息。DMA将等待剩下的三分之二。主节点继续发送请求。因此,在SCLK返回后,下一条消息的2/3将被放入缓冲区。DMA中断发出,但最后一条消息的剩余尾部丢失。它肯定丢失了,但我可以检测到使用ERRIE标志在将要设置的OVR标志上发出中断。

我试着处理那个中断,但是没有用。

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

这不会有多大帮助。

我可能使用的另一个选择是一个专用的定时器,它在SCLK (AN3109应用笔记灵感解决方案)的上升沿被重置。这样我就可以实现DMA超时。如果我只得到了消息的一部分,如果SCLK不在我们身边很长一段时间,我可以在定时器溢出时产生中断。不过,这个解决方案也有问题。

我知道描述很模糊,但我已经尽了最大努力,希望有更有洞察力的人能帮上忙。

EN

回答 1

Stack Overflow用户

发布于 2015-08-20 13:52:04

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

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

https://stackoverflow.com/questions/32100565

复制
相关文章

相似问题

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