问题描述
我对硬件中的内存布局有疑问。
我目前正在阅读设备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--------|
每个寄存器都被视为一个整体(无论有多少位)。
当然,当使用串行端口访问具有不同位长的寄存器时,控制器端的程序应按照串行端口操作表中所示的时序提供/读取相应的位数。
总而言之,这是设计提供者与用户之间的协议。只要用户按照手册访问寄存器,就不会有问题。