1 下图是IDT 8A3xxx系列时钟芯片的寄存器空间范围说明:
(只看SPI的访问,不看IIC的访问,因为我项目只用SPI)
-
首先,整个寄存器的寻址空间是0x0000 ~ 0xFFFF,故需要16bit的地址。
- 从图中看到0x0000 ~ 0x7FFF空间是预留的,故实际可用的地址是0x8000 ~ 0xFFFF。
-
其次,16bit地址由页寄存器内页地址(高地址)和串口发来的偏移(低地址)组成2部分组成,
- 高地址与低地址的组合有2种模式。
- 1B模式的地址分配是:高地址占9bit,低地址占7bit。
- 2B模式的地址分配是:高地址占1bit,低地址占15bit。
- 为什么要拆成高地址和地址?
- 猜测可能的原因是:spi的第一个bit代表了R/W,剩下只有15bit,不够16bit,
- 故新增一个页寄存器,来提前分担一部分地址,类似于间接访问。
- 为什么又拆成2种模式?–不太清楚,可能是为了兼容什么?
- 高地址与低地址的组合有2种模式。
-
最后,如何设置1B模式的页地址?
* 1B模式的页地址寄存器的地址是0x7C-0x7F,必须连续初始化这4个地址。
* 假设我想访问:ADDR[15:0] = 0xCBE4- 7C 80 CB 10 20 —这 5 Byte 设置页地址;
- DPLL芯片可以实现匹配到7C + 2Byte+ 10 20 就认为是写1B寄存器。
- 7C :页寄存器基地址
- (ADDR[15:0]&0xFF80)=0xCB80 : 页地址,低地址先发送,因为7c就是存低地址
- 10 20 :固定值
- 写内容访问,0x50写入地址0xCBE4
- 64 50
- ADDR[7:0]&0x7F=0x64—写:msb=0
- 读内容访问,读地址0xCBE4
- E4 00
- ADDR[7:0]|0x80=0xE4—读:mab=1
-
下图如何设置2B模式也地址?
- 2B模式页地址寄存器的地址是:0x7FFD~7FFF;假设我想访问:ADDR[15:0] = 0xCBE4
- 7F FD 80 10 20 // DPLL可以匹配到7F FD 80 10 20 就认为是写2B寄存器。因为高地址只能是写80
- 7F FD : 页寄存器基地址
- 80 ; 必须是80,bit15必须是1
- 10 20 : 固定值
- 写内容访问,0x50写入地址0xCBE4的操作:
4B E4 50 (ADDR[15:0]|0x7FFF)=4be4—写:msb=0 - 读内容访问,读地址0xCBE4
CB E4 00
ADDR[7:0]|0x8000=0xCBE4—读:mab=1