首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有特定的方式或算法来解码协议?

是否有特定的方式或算法来解码协议?
EN

Software Engineering用户
提问于 2012-06-18 22:48:49
回答 1查看 1.1K关注 0票数 2

我正在设计一个简单的逻辑分析器,我知道解码像I2C、SPI、UART这样的协议的最好方法是类似于FPGA,但我现在想通过软件来实现它:)我是在OMAP4460 ARM处理器上运行的。

我想知道是否有一种特殊的方式来解码像I2C、SPI、UART这样的协议,或者仅仅是if()和标志作为通常的方式。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2012-08-18 01:25:22

很多人都在做你正在做的事情,并制造自己的逻辑分析器。一些逻辑分析器和作用域能够完成您所描述的解码,包括一些具有开放源代码的软件和硬件。

我的建议是,你和其他人一起做你想做的一些或大部分事情,或者把你的努力范围缩小到尽可能窄的范围,让一些简单的事情运行起来,然后从那里建立起来。

在现有项目上的重用/协作:

如果您正在使用Arduino,您可以为它购买硬件并下载软件,包括I2C、SPI和UART支持。

http://www.arduinolab.us/

这里还介绍了另一个类似的项目:

http://www.seeedstudio.com/depot/open-workbench-logic-sniffer-p-612.html?cPath=61_68

其他人正在sump.org从事这类工作。Sump似乎提供了一个硬件和两个部分的软件解决方案--一个在用于显示的PC上,另一个在目标上捕获。之间的RS232协议似乎被其他人使用,因此如果您喜欢他们所做的,您可以跳过PC端,只需实现目标端协议。

独自行动,启动简单的

我建议,为了使您的实现尽可能容易,让用户配置尽可能多的选项,而不是试图找出它们。根据协议,用户可能选择的一些项目包括:

  • 接口速度(波特率或预期时钟速率)。
  • 奇偶(无,标记,空格,奇数,偶数)。
  • 主从地址(Es)。
  • 输入做什么功能(UART: RX,TX,可能是DSR,DTR,CTS,I2C: CLK,DATA,SPI: MISo,MOSI,CLK,SPID/SSEL0N.
  • 如果任一引脚的输入可能与正常情况相反,则极性。
  • 地址大小。

使用前面部分中的链接,查看Arduino和Sump人员通过查看他们的示例代码和文档来获得一些想法的方法。

我怀疑UART将是最简单的实现。发送和接收都有相同的结构,因此您可以使一个状态机实现两者,并以一个分析器通道作为其参数。您将需要抽样这不少于波特率两倍(8倍或16倍可能更好)。通常,当空闲时,线路将由电阻器拉起,然后字节(8位)的开始由一个开始位(逻辑0)发出信号,后面跟着八个数据位,然后是一个可选的奇偶校验位和一个强制停止位(逻辑1)。此位模式的时序图,分别具有奇偶校验和不奇偶校验,可在以下链接中找到:

http://www.romux.com/tutorials/embedded-system/peripherals

http://www.commfront.com/RS232_协议_分析器_监视器/RS232 232_分析器_监视器_测试仪_TUTORIAL.HTM

第一个引用还讨论了DTC和DCE约定,以及如果您将UART串行连接到TX、RX和GND之外,可能需要监视的其他事情。

您可以使用计时器轮询输入级别,可以使用状态机(如UART_IDLE、UART_START_DETECTED、UART_D0、.、UART_D7、UART_PARITY、UART_STOP和UART_RECOVER )。UART_RECOVER可能是一种在检测异常之后的状态,其中奇偶校验不应该基于计算的奇偶校验、显示逻辑0的预期停止位或在过采样范围内发生变化的开始位(或其他位),这可能是因为噪声的影响,这种噪声与起始位一样低,但持续时间要短得多。使用多个恢复状态来计算出一定的时间,或者查找停止/空闲/开始序列可能是有益的。

I2C和SPI是同步串行协议,因此,如果您指示哪个输入是时钟,则可以对数据进行采样,如果需要,则在时钟转换时确定数据位是0还是1。您可能会显示地址、数据单词和方向(I2C主或从、读或写)或选定的设备。

Github和其他开源存储库可能已经编写了大量您需要编写的代码,而且维基百科的引用还包括一些可以修改(或至少是研究)具有很高效益的位重击代码。

http://en.wikipedia.org/wiki/I%C2%B2C

http://en.wikipedia.org/wiki/Serial_外设_接口_公共汽车

如果您从头开始编写这些代码,那么从一堆测试用例开始,这些测试用例包括主读、主写、从读、从写,最好是从规范或已知的良好实现中提取。能够循环您的硬件,甚至能够用表中的模拟输入来对状态机进行单元测试,这将加快您的调试速度,并使您在修改代码时能够快速地重新测试。

你需要更多的状态机。当然,I2C和SPI是分开的。您可能有嵌套的状态机,因为有面向位的识别和面向帧的识别。您可能会选择将事情分解,因此主要用例在代码中获得自己的解码功能。

I2C和SPI可能需要更灵活的时间安排。它们将根据时钟上的更改逐步完成一些状态转换,而另一些则基于数据中的更改,但您可能仍将使用计时器来驱动采样和状态机。异常处理将更加复杂,使用嵌套状态机会有所帮助。Grady (等人)在他的书“面向对象的设计和分析与应用程序”(第3版(c) 2007 )第5.11节中有关于状态机和嵌套状态机的很好的例子。

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

https://softwareengineering.stackexchange.com/questions/153351

复制
相关文章

相似问题

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