这个硬件递增寄存器如何通过通信总线逐一寻址 32 位值?

How does this hardware increment register addresses for 32-bit values only by one via communication bus?

我有一个关于硬件内存布局的问题。

我目前正在阅读设备 Ade7978 (Isolated Energy Metering Chipset) 的数据表。
在其用于通过 I²C 或 SPI 进行通信的寄存器列表中(Table 39,第 105 页),它列出了所有数据的寄存器地址。以下是前三个数字的摘录:

┌─────────┬─────────┬──────────────────────────────────┬─────────────────────────────────┐
│ Address │ Name    │ Description                      │ Bit Length During Communication │
├─────────┼─────────┼──────────────────────────────────┼─────────────────────────────────┤
│ 0x4380  │ AIGAIN  │ Phase A current gain adjust.     │ 32                              │
│ 0x4381  │ AVGAIN  │ Phase A voltage gain adjust.     │ 32                              │
│ 0x4382  │ AV2GAIN │ Phase A V2P channel gain adjust. │ 32                              │
└─────────┴─────────┴──────────────────────────────────┴─────────────────────────────────┘

为什么值是32位长,地址值只增长1?
寄存器没有直接映射到内存,怎么办?
它们是任意数字,只是被决定为任意数字并在内部映射到内存的不同部分吗?这是刚刚设置好的,所以我不会意外访问 32 位数字的中间部分,还是有硬件原因?

如果您有一个笼统的答案,当然可以。如果你碰巧知道Ade7978为什么专门这样做,那对我也有好处。
谢谢你的时间。

虽然看起来和普通的字节地址系统不同,但实际上地址的分配和地址指向的数据的位长是没有关系的。访问的数据称为 'word'。 ADE7978 的串行端口可以使用 32、16 或 8 位字。继续阅读寄存器 table,你会发现不同的寄存器有 32 或 16 或 8 位长度,它们的地址仍然增加 1。

程序员模型中的寄存器table有点像这样:

ADDR1  :  |-----REGISTER 1-----|
ADDR2  :  |--REGISTER 2--|
ADDR3  :  |-------REGISTER 3-------|

而在电路中,串口内部的寄存器地址译码逻辑收到一个合法的寄存器地址后,会置位其中一个寄存器select信号,然后只使能对应的寄存器为written/read。就像:

16-BIT_REG_ADDR --+---- =ADDR1? --ENABLE-->  |----16-BIT_REG1----|
                  +---- =ADDR2? --ENABLE-->  |--8-BIT_REG2--|
                  +---- =ADDR3? --ENABLE-->  |--------32-BIT_REG3--------|

每个寄存器都被视为(访问)一个整体,无论它有多少位。

当然,使用串口访问不同位长的寄存器时,controller端的程序要provide/read相应的位数,时序如串口操作图所示

总之,这是设计提供者与用户之间的协议。只要用户按照手册访问寄存器,就没有问题。