1 个不稳定版本

0.1.0 2024年7月7日

#300嵌入式开发

MIT 许可证

30KB
552

一种简单的跨各种传输手段访问数据的协议。

通用寄存器访问协议(URAP),简称URAP,是一种轻量级、快速且简单的协议,通过多种数据传输标准(Unix套接字、UART、RS-485、IP以太网或USB串行)访问寄存器。URAP易于实现,对所有用户开放。

协议概述

URAP是一种数据通信协议,其中主客户端读取并写入从服务器数据,允许访问多达2^15个32位宽的寄存器。它假定它在一个一对一的流中传输,没有其他可能的进程或设备可以监听或解释数据包;换句话说,当通过多设备RS-485或以太网进行通信时,需要另一种传输协议,例如IPv4。它并不安全,也没有打算使其安全。

有5种类型的包,它们都非常简单

  • 读取包,其中写入位设置为0,包含写入位、15位寄存器地址和CRC
  • 写入包,其中写入位设置为1,包含写入位、15位寄存器地址、要写入的数据和CRC
  • 读取ACK包,包含ACK字节、读取的数据和CRC
  • 写入ACK包,包含ACK字节
  • NAK包,包含NAK字节

通过这5种包,您可以几乎拥有所有简单嵌入式和非嵌入式应用所需的几乎所有功能,您只需要在变量之间交换。

包结构

读取包

  1. 位8:写入位,由于我们正在读取,因此设置为0
  2. 位0-7,9-15:要读取的寄存器编号(小端序)
  3. 位16-23:位0-15的CRC

读取-ACK包

  1. 位0-7:ACK字节,等于0xAA
  2. 位8-39:寄存器中包含的数据
  3. 位40-47:位8-39的CRC

写入包

  1. 位8:写入位,由于我们正在写入,因此设置为1
  2. 位0-7,9-15:要写入的寄存器编号
  3. 位16-47:要写入寄存器的数据
  4. 位48-55:位0-47的CRC

写入-ACK包

  1. 位0-7:ACK字节,等于0xAA

NAK包

  1. 位0-7:NAK代码。任何值不为0xAA的字节都是NAK,然而建议您使用以下代码来告诉主设备失败的原因。
NAK代码
  • 0x00:未知,强烈建议避免故意发送此代码
  • 0x01:SecondaryFailure,基本上任何非由于传输或主设备故障的计算错误
  • 0x02:BadCrc,当发送的CRC和计算的CRC不匹配时
  • 0x03:OutOfBounds,当主设备尝试访问在从设备上不存在的寄存器时
  • 0x04:IncompletePacket,当发送给从设备的包缺少某些内容时
  • 0x05:IndexWriteProtected,当从设备尝试写入写保护寄存器时

字节序

所有超过8位的整数、浮点数等都是小端字节序,因为所有现代架构都是小端字节序。这包括寄存器地址。

注意这会使位布局看起来很奇怪,但它避免了在99%的处理器上进行任何转换。这导致写位实际上是包中的第9位,但在编程时是最高的位。

例如,以下代码中的数组data实际上包含的字节是[0b0000_0000, 0b1000_0000]

let register: u16 = 0b1000_0000_0000_0000;
let data: [u8; 2] = register.to_le_bytes();

当你查看传输的数据时,这似乎很令人困惑,但对于处理器和编写的代码来说,这很简单。

CRC

URAP使用8位CRC,其多项式为0x1D,与OBD使用相同的多项式。它不使用任何奇怪的初始化值,它不是反射的,并且计算后不与任何内容进行XOR运算。有关其工作原理的更多信息,请参阅此链接

应注意的是,ACK和NAK字节不进行CRC校验。

检查连接的健康状况

要检查连接的健康状况,通常读取从设备的寄存器0并等待健康响应。建议URAP从设备至少有一个寄存器,否则此检查将不会起作用。还请确保如果您实现了任何形式的读取保护,寄存器零仍然可读。

写保护

鼓励URAP从设备在寄存器上使用写保护,这些寄存器打算为只读,以防主设备发送错误的命令。如果尝试写入写保护寄存器,从设备应响应NAK,表示没有写入提交,并且应该更改代码以解决这个问题。

示例事务

写入寄存器0

主设备 -> 从设备,将寄存器零写入值42

          1                                                             Write Bit
0000 0000  000 0000                                                     Register
                    0010 1010 0000 0000 0000 0000 0000 0000             Value
                                                            0000 1111   CRC

从设备 -> 主设备,写入-ack

1010 1010   ACK

或者,如果寄存器0是写保护的,您将得到一个NAK

从设备 -> 主设备,nak

0000 0101   NAK, IndexWriteProtected

读取寄存器0

主设备 -> 从设备,读取寄存器零

          1                     Write Bit
0000 0000  000 0000             Register
                    0000 0000   CRC

从设备 -> 主设备,读取-ack,值为42

1010 1010                                                       ACK
          0010 1010 0000 0000 0000 0000 0000 0000               Value
                                                  0100 1111     CRC

这些规范受CC BY许可。此存储库中的源代码受MIT许可证的约束,您可以在LICENSE文件中查看更多详细信息。

依赖项

~31KB