1 个不稳定版本
0.1.0 | 2023年7月15日 |
---|
#3 在 #power-management
每月 21 次下载
31KB
359 行
Neotron-BMC-协议
与 Neotron 板管理控制器 (NBMC) 通信的 SPI 协议。
简介
NBMC 是 Neotron 系统上使用的一种始终开启的微控制器。它具有非常低的空闲功耗,使其能够始终保持开启状态。这使得它可以监听来自电源和复位按钮的按钮事件,并控制系统 LED、主 ~RESET
信号以及打开和关闭主 5V 电源轨。这使得您的 Neotron 系统具有类似 'ATX PC' 风格的智能功能,如软电源按钮,并确保在系统退出复位之前所有电源轨都已启动。
NBMC 位于 SPI 总线上,接收 请求 并发送 响应 作为回复。它还可以激活一个中断线。
此包描述了 SPI 总线上运行的协议,并为在 Rust 中实现该协议提供了一些基本的辅助代码。
SPI 通信协议
要与 NBMC 通信,主机处理器必须首先将芯片选择线 (nCS
) 降至低电平,然后发送一个头。SPI 是一个全双工系统,但在这个系统中,在任何时候只有一侧实际上正在传输有用的数据,因此,当头正在发送时,主机将接收到 0xFF
的填充字节(可以丢弃)。
一个传输由三个阶段组成。
>
请求-
转换<
响应
一个 请求 是从 主机 发送到 NBMC 的字节序列。转换 是一个不确定时间长度的时期,在此期间,主机 输出虚拟字节,而 NBMC 以 0xFF
字节响应,这表明它尚未形成 响应。这个时期结束时,NBMC 将 响应 从 NBMC 发送到 主机。
可以发出不同类型的 请求。每个都有一个相应的 响应。
请求类型 | 包含 | 长度 | 响应类型 |
---|---|---|---|
读取 | 类型、寄存器编号、长度、CRC | 4 | 读取 |
短写 | 类型、寄存器编号、数据字节、CRC | 4 | 短 |
长写开始 | 类型、寄存器编号、长度、CRC | 4 | 短 |
长写有效载荷 | 长度 字节,CRC |
长度 + 1 |
短 |
响应类型 | 包含 | 长度 |
---|---|---|
短 | 结果,CRC | 2 |
读取 | 结果,长度 字节,CRC |
长度 + 2 |
为了使NBMC在SPI上接收数据时更高效,重要的是在nCS
引脚变为低电平后接收到的第一个请求具有固定长度。在这里,所有的初始请求都具有四个字节的大小。一个长写起始请求告诉NBMC,立即在之后期望一个长度不同的请求,这使得NBMC可以重新配置DMA以期望更长的长度请求。必须只在长写起始之后发送长写有效负载,并且在此之间不要重置nCS
信号。
请求类型
0xC0
:读取0xC1
:读取(备用)0xC2
:短写0xC3
:长写
响应结果
0xA0
:成功0xA1
:CRC错误0xA2
:错误的请求类型0xA3
:错误的寄存器号0xA4
:错误长度
读取请求/响应序列
一个读取请求由四个8位值组成
- 一个类型字节,可以是
0xC0
或0xC1
,将此标记为读取请求。 - 一个寄存器号,表示主机希望读取的NBMC中的哪个寄存器。
- 一个长度,表示要从给定的寄存器号中读取多少字节。
- 一个CRC,是前面三个字节的CRC-8。
类型字节应在0xC0
和0xC1
之间交替,以便NBMC可以判断读取请求是否是前一个请求的重复。例如,如果读取响应在到达主机时CRC检查失败,则可能发生这种情况。由于读取请求可能具有副作用(如从FIFO中删除字节),重复的读取请求应返回与之前完全相同的值,而不是从FIFO中获取更多新字节。这允许在SPI总线偶尔出现损坏的情况下以无损方式读取FIFO。
一个读取响应由可变数量的8位值组成
- 一个响应结果代码,指示读取操作是否成功。
- 一个有效负载,由读取操作请求的字节数组成(仅在结果字节指示成功时出现)
- 一个CRC,是所有前面的字节的CRC-8。
成功示例
sequenceDiagram
Host->>NBMC: ReadRequest(25, 5)
Note over Host, NBMC: Read 5 bytes from Register 25
NBMC->>NBMC: Reads from register
NBMC->>Host: Response(OK, [0, 1, 2, 3, 4])
Note over Host, NBMC: Host get the five bytes
失败示例
sequenceDiagram
Host->>NBMC: ReadRequest(25, 200)
Note over Host, NBMC: Read 200 bytes from Register 25
NBMC->>Host: Response(BadLength)
Note over Host, NBMC: NBMC says no.
短写请求/响应序列
一个短写请求由四个8位值组成
- 一个类型字节为
0xC2
或0xC3
,将此标记为短写请求。 - 一个寄存器号,表示主机希望写入的NBMC中的哪个寄存器。
- 一个数据字节,它将被写入给定的寄存器号。
- 一个CRC,是前面三个字节的CRC-8。
返回时发送一个包含两个字节的短响应
- 响应结果代码,指示读取操作是否成功。
- 一个 CRC,即所有独立进程字节的CRC-8。
同样可以将一个 短响应 视为一个单16位大端值,可以是以下之一:0xA069
、0xA16E
、0xA267
、0xA360
或 0xA475
。
成功示例
sequenceDiagram
Host->>NBMC: ShortWriteRequest(10, 0xAA)
Note over Host, NBMC: Write 0xAA to Register 10
NBMC->>NBMC: Writes to register
NBMC->>Host: Response(OK)
Note over Host, NBMC: NBMC is happy.
长写入请求/响应序列
一个 长写入请求 由四个8位值组成
- 一个 类型 字节为
0xC4
或0xC5
,标记为 长写入请求。 - 一个寄存器号,表示主机希望写入的NBMC中的哪个寄存器。
- 一个 长度,表示后续 长写入有效负载 中跟随后续的有效负载字节数。
- 一个CRC,是前面三个字节的CRC-8。
发送一个 短响应,按照 短写入请求
如果收到包含 响应结果 为 OK (0xA0
) 的 短响应,则 NBMC 准备接收一个 长写入有效负载。如果收到任何其他 响应结果,则不得发送 长写入有效负载,并且必须将 nCS
提升至指示事务结束。
一个 长写入有效负载 由可变数量的8位值组成
- 一个 有效负载,由在 长写入请求 中请求的字节数组成
- 一个CRC,是所有前面的字节的CRC-8。
此消息必须始终包含在 长写入请求 的 长度 字段中声明的字节数,以及一个额外的CRC字节。
然后发送第二个 短响应,按照 短写入请求。此时必须将 nCS
信号提升,以重新启动写入序列,无论发送的具体 响应结果 是什么。
成功示例
sequenceDiagram
Host->>NBMC: LongWriteRequest(16, 5)
Note over Host, NBMC: Prepare to write 5 bytes to Register 16
NBMC->>NBMC: Thinks for while
NBMC->>Host: Response(OK)
Note over Host, NBMC: NBMC is ready to take 5 bytes.
Host->>NBMC: LongWritePayload([0, 1, 2, 3, 4])
Note over Host, NBMC: Five bytes are sent
NBMC->>NBMC: Checks CRC
NBMC->>Host: Response(OK)
Note over Host, NBMC: NBMC is happy.
失败示例
sequenceDiagram
Host->>NBMC: LongWriteRequest(16, 5)
Note over Host, NBMC: Prepare to write 5 bytes to Register 16
NBMC->>NBMC: Thinks for while
NBMC->>Host: Response(OK)
Note over Host, NBMC: NBMC is ready to take 5 bytes.
Host->>NBMC: LongWritePayload([0, 1, 2, 3, 4])
Note over Host, NBMC: Five bytes are sent
NBMC->>NBMC: Checks CRC
NBMC->>Host: Response(CrcFailure)
Note over Host, NBMC: NBMC is sad. The five bytes<br/>must have been corrupted as their CRC didn't<br/>match. Host must raise `nCS` and try again.
取消
任何 请求 都可以通过在 请求 发送完成之前将 nCS
提升至高电平来取消。这允许 NBMC 适应意外的 主机 重启(在重启期间预计将提升 nCS
线)。
许可证
此代码根据 Blue Oak Model License 1.0.0 许可。请参阅
选择此许可证的意图是允许此代码在开源和商业许可产品中免费重用。
依赖关系
~1.5MB
~36K SLoC