3

我有 SMBus 基地址寄存器,并使用 DIMM SMBus 地址 SMBBASE 04h 对 SMBus 发送从地址寄存器进行编程。

然后使用要读取的 DIMM 的 SPD 数据偏移量 SMBBASE 03h 对 SMBus 主机命令寄存器进行编程。

但是主机命令寄存器 (HCMD)—偏移量 3h 是 Size: 8 bits(255/FF),

那么如何读取 255 个字节之后的内容呢?

例如:DDR4 串行存在检测 (SPD) 表:

字节 320:模块制造商 ID 代码

我需要阅读字节 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);

输出端口(SMBase_addr 0x03,i);主机状态寄存器返回 0x44,设备错误 (DERR)。

4

2 回答 2

0

试图读取 DDR4 SPD?它们有 2 页,每页 256 字节,您需要对特殊的预定义地址 0x6E 进行虚拟写入,以将所有 SPD 芯片切换到第 1 页(字节 320 所在的位置),然后写入 0x6C 将它们切换回第 0 页(以防止在下次启动期间 SPD 读取失败)。阅读第 12 页的数据表了解更多信息。

于 2016-03-04T18:45:01.720 回答
0

至少在 Linux PC 中,您需要先写入 SMBus 地址 0x37 才能到达第 1 页。(让 0 写入 SMbus addr 32)比您的所有 DDR4 RAM SPD 切换到第 1 页。只需使用常规函数来写入和读取所需的地址. 然后通过写入 SMBus 地址 0x36 切换到第 0 页。

于 2017-11-22T01:26:33.547 回答