该硬件增量寄存器如何仅通过通信总线将一个32位值地址寻址?

问题描述

我对硬件中的内存布局有疑问。

我目前正在阅读设备Ade7978 (Isolated Energy Metering Chipset)的数据表。
在通过I²C或SPI进行通信的寄存器列表中(表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为何专门这样做,那对我也有好处。
谢谢您的时间。

解决方法

尽管它看起来与公共字节地址系统不同,但是实际上地址分配和地址所指向的数据的位长之间没有任何关系。被访问的数据称为“字”。 ADE7978的串行端口可以使用32位,16位或8位字。继续阅读寄存器表,您会发现长度为32位,16位或8位的不同寄存器,但它们的地址仍增加1。

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

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

在电路中,串行端口内的寄存器地址解码逻辑接收到合法的寄存器地址后,它将声明那些寄存器选择信号之一,然后仅使相应的寄存器能够被写入/读取。就像:

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

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

当然,当使用串行端口访问具有不同位长的寄存器时,控制器端的程序应按照串行端口操作表中所示的时序提供/读取相应的位数。

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