我有SMBus基地址寄存器, 并使用DIMM SMBus地址SMBBASE 04h对SMBus发送从地址寄存器进行编程。
然后使用要读取的DIMM的SPD数据偏移对SMBus主机命令寄存器进行编程,SMBBASE 03h。
但是主机命令寄存器(HCMD)-Offset 3h是大小:8位(255 / FF),
那么如何读取255个字节后的数据?
例如: DDR4串行存在检测(SPD)表:
字节320:模块制造商ID代码
我需要阅读Byte 320。
我的代码就像这样
unsigned ReadByte(unsigned SMBase_addr,unsigned i)
{
unsigned val;
outportb(SMBase_addr,0x1e);
outportb(SMBase_addr 0x04,0xa7);
outportb(SMBase_addr 0x03,i);
outportb(SMBase_addr 0x02,0x48);
while((inportb(SMBase_addr))&0x01){
delay(10);
}
val=inportb(SMBase_addr 0x05);
return val;
}
for(i=0;i<383;i )
{
data=ReadByte(SMBase_addr,i);
printf("%4x",data);
}
我改变了 outportb(SMBase_addr 0x03,i);
到
outportw(SMBase_addr 0x03,i); 主机状态寄存器返回0x44,设备错误(DERR)。
答案 0 :(得分:0)
试图读取DDR4 SPD? 它们有2页,每页256字节,你需要一个虚拟写入一个特殊的预定义地址0x6E来将所有SPD芯片切换到第1页(你的字节320所在的位置),然后写入0x6C将它们切换回第0页(防止下次启动时SPD读取失败)。 有关详情,请参阅第12页的this datasheet。
答案 1 :(得分:0)
至少在Linux PC中, 您需要先写SMBus地址0x37才能到达第1页。(让我们向SMbus addr 32写0) 比所有DDR4 RAM SPD切换到第1页。 只需使用常规函数进行编写和阅读所需地址。 然后通过写入SMBus地址0x36切换到第0页。