- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在为带有 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/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我目前正在尝试制作一个非常简单的应用程序,它会根据一天中的时间问候。我的代码是: open System let read() = Console.Read() let readLine() = Co
我已经运行Elasticsearch服务很长时间了,但是突然遇到了以下情况 由以下原因导致:org.elasticsearch.index.translog.TranslogCorruptedExce
我对执行以下操作的 php 重定向脚本有一个奇怪的问题: 在用户的浏览器中植入 Cookie,或者读取现有 Cookie(如果有)。 将用户重定向到另一个网址(重定向的网址是原始网址中的参数,例如 h
我正在使用 iText 7.0.0(Java 风格),似乎表格单元格 HorizontalAlignment 被忽略,因为 CENTER 和 RIGHT 都不起作用。你能重现这个吗? see th
简而言之: 我有一个可以从多个线程访问的计数器变量。尽管我已经实现了多线程读/写保护,但该变量似乎仍然以不一致的方式同时写入,导致计数器结果不正确。 深入杂草: 我使用的“for 循环”会在后台触发大
我有一个 REST 项目,在访问控制服务类中保存用户的ArrayList。一切都工作正常,直到 REST Web 服务突然抛出 java.util.NoSuchElementException。单步查
已关闭。此问题不符合Stack Overflow guidelines 。它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
当我刷新页面时,我无法显示 voteUp/Down,因为如果我执行 voteUp/Down(+1 或 -1) 并刷新页面,这会再次返回 voteUp/Down (0)。过去我使用 JSON,但社区推荐
我正在为离散时间 CPU 调度模拟器编写代码。它只是生成流程并相应地安排它们。我目前正在实现 FCFS 计划。我理解离散时间模拟器的本质,但我在用 C++ 实现时遇到了麻烦。 问题出现在handleN
尝试使用 yum 部署包时出现错误: 2016-07-07 14:14:31,296 - ERROR - error: rpmdb: BDB0113 Thread/process 6723/1
我有一个简单的同步队列 template class SynchronisedQueue { public: void Enqueue(const T& d
我正在使用 hadoop 0.20.append 和 hbase 0.90.0。我将少量数据上传到 Hbase,然后出于评估目的杀死了 HMaster 和 Namenode。在此之后,我向 Hbase
我使用 symfony 框架 1.4 创建了一个网站。我正在使用 sfguard 进行身份验证。 现在,这在 WAMP (windows) 上运行良好。我可以在不同的浏览器上登录多个帐户并使用该网站。
目前我已经实现了 HashMap private static Map cached = new HashMap(); 和 Item 是一个具有属性的对象 Date expireTime 和 byte
我试图将 2 个不同的 WPF 控件绑定(bind)到 ViewModel 中的同一属性,即 CheckBox.IsChecked 和 Expander.IsExpanded。我想要实现的行为是让 C
我希望这是一个简单的问题,但我没有找到答案。 我想让 build.gradle 文件通过替换某些变量来设置我的 Spring Boot 应用程序中的版本。这与广告一样有效: def tokens =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
这个问题在这里已经有了答案: In a fragment shader, why can't I use a flat input integer to index a uniform array o
我已经下载了 OSM 世界地图。解析时出现异常: osm bound changeset (...) changeset Exception in thread "main" org.xml.sax.
我是一名优秀的程序员,十分优秀!