【问题标题】:Profibus synchronisation using Linux (Raspberry Pi)使用 Linux (Raspberry Pi) 进行 Profibus 同步
【发布时间】:2021-08-30 23:41:38
【问题描述】:

我计划在 Linux 中开发一个简单的 Profibus master(FDL 级别),更具体地说是在 Raspberry Pi 上。我有一个基于 MAX 481 的 RS485 收发器。主控必须在有多个主控的总线上工作。

根据 Profibus 规范,您必须计算总线上“1”位的数量以确定何时轮换访问令牌。特别是在 11 个“1”位之后,下一帧开始。 11 位也正好是一帧。

在 Linux 中,如何检测这 11 个“1”位?它们不会被驱动程序注册,因为没有起始位。所以我需要一个比特流,而不是解码字节。

最好的方法是什么?

【问题讨论】:

  • 11 位显然是一个字符的帧大小(即开始位、8 位数据、偶校验和停止位)。典型的 UART 将在非连续传输之间插入一帧间隔的倍数,请参阅stackoverflow.com/questions/64040912/…。在接收端检测这个空闲时间通常需要一个定时器,例如请参阅 TI 在ti.com/lit/wp/spry155b/… 中提供的对 Profibus 的硬件支持
  • industrial.softing.com/fileadmin/secure/Industrial/White_Papers/…3.1.3 基于软件的 PROFIBUS DP 主站实现 中似乎描述了您正在尝试做的事情,请参阅表 5 了解您认为的缺点列表脸。
  • 使用 UART 的receive timeout 功能来检测空闲间隔的开始,而不是在报文帧开始时尝试检测空闲间隔的结束。但是,除了中断之外,我找不到任何 BCM 文档。使用 Atmel USART,接收器超时是可编程的 N 位,但在 Linux 中被 at91 串行驱动程序劫持以终止 DMA 传输。

标签: raspberry-pi serial-port linux-device-driver rs485


【解决方案1】:

不幸的是,使用微控制器/微处理器 UART 是一个糟糕的选择

您可以在微控制器 UART 外设中生成 11 位设置 START_BIT、STOP_BIT 和 PARTITY_BIT(偶数)。也许您会很幸运地从数据报中接收到整个字节而不会丢失。

但是,PROFIBUS DP 数据报最多为 244 字节,并且 PROFIBUS DP 在数据报传输期间要求字节之间没有空闲位。 您需要一个 UART 硬件或 UART 微控制器外围设备,其 FIFO 或最多支持 244 字节的寄存器 - 这是非常少见的,一旦 PROFIBUS 对此要求非常具体。

另一个方面与波特率的兼容性有关。通常,PROFIBUS PD 波特率的整个范围在普通微控制器 UART 上并不完全可用

我的建议:

  1. 在 FPGA 上实现这个 UART 部分,并使用例如 Raspberry Pi 接口。 SPI。您可以决定可以“外包”给 FPGA 的 PROFIBUS 堆栈部分的扩展以及可以保留在 RPi 上的部分。

  2. 使用 ASIC(可能是 ASPC2,但已过时)并添加另一个兼容的处理器来实现堆栈的确定性部分。稍后您可以将此处理器与您的 RPi 连接。

  3. 使用工业通信专用处理器(如 TI Sitara am335x)实施。

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多