0

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

我目前正在阅读设备Ade7978(隔离电能计量芯片组)的数据表。
在通过 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 专门这样做,那对我也有好处。
谢谢你的时间。

4

1 回答 1

1

虽然看起来和普通的字节地址系统不同,但实际上地址分配和地址所指向的数据的位长没有任何关系。访问的数据称为“字”。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--------|

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

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

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

于 2020-09-19T16:58:17.977 回答