3

SMBus ベース アドレス レジスタを取得し、SMBus 送信スレーブ アドレス レジスタを DIMM SMBus アドレス、SMBBASE 04h でプログラムします。

次に、読み取る DIMM の SPD データ オフセット、SMBBASE 03h を使用して SMBus ホスト コマンド レジスタをプログラムします。

ただし、ホスト コマンド レジスタ (HCMD) - オフセット 3h はサイズ: 8 ビット (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); を変更します。

outportw(SMBase_addr 0x03,i); ホスト ステータス レジスタは 0x44、デバイス エラー (DERR) を返します。

4

2 に答える 2

0

少なくとも Linux PC では、最初に SMBus アドレス 0x37 を書き込んでページ 1 に到達する必要があります。 . その後、SMBus アドレス 0x36 を書き込んでページ 0 に切り替えます。

于 2017-11-22T01:26:33.547 に答える
0

DDR4 SPD を読み取ろうとしていますか? それらにはそれぞれ256バイトの2ページがあり、すべてのSPDチップをページ1(バイト320が配置されている場所)に切り替えるには、事前定義された特別なアドレス0x6Eへのダミー書き込みが必要であり、0x6Cに書き込むよりもページ0に戻します(次回の起動時に SPD の読み取りエラーが発生しないようにします)。詳細については、このデータシートの 12 ページを参照してください。

于 2016-03-04T18:45:01.720 に答える