【发布时间】: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