我有一个关于硬件内存布局的问题。
我目前正在读取设备隔离能量计量芯片组( Ade7978 )的数据表。
它在其登记册清单中列出了所有数据的登记地址,以便通过I S.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为什么专门这样做,那对我也有好处。
耽误您时间,实在对不起。
发布于 2020-09-19 16:58:17
虽然它看起来与普通的字节地址系统不同,但实际上地址分配和地址指向的数据的位长之间没有什么可做的。访问的数据称为“word”。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--------|每个寄存器作为一个整体来处理(访问),不管它有多少位。
当然,当使用串行端口访问不同位长的寄存器时,控制器侧的程序应该提供/读取相应的位数和串口操作图中所示的时序。
总之,这是设计提供者和用户之间的协议。只要用户按照手册访问寄存器,就不会有任何问题。
https://stackoverflow.com/questions/63955305
复制相似问题