「AKI-H8/3069F LANボードのDRAM増設あまり」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
*AKI-H8/3069F LANボードのDRAM増設 あまり
詳しくは[[こっち>AKI-H8/3069F LANボードのDRAM増設]]で
DRAMを使うには3069のハードウェアマニュアルのP188にあるように
ABWCRの設定、RTCORの設定、RTMCSRのCKS2-0ビットの設定、DRCRBの設定、DRCRAの設定が順に必要になります
&bold(){ABWCR(バス幅コントロールレジスタ)}
エリア0〜1につながれたROM/RAMが8ビットアクセスであるか16ビットアクセスであるかを設定する。
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||ABW7|ABW6|ABW5|ABW4|ABW3|ABW2|ABW1|ABW0|
それぞれ8ビットアクセスの時1,16ビットアクセスの時0。
エリア3,4,5に16ビットアクセスのDRAMを増設したのでABWCR="11000111"=0xC7。
&bold(){RTCOR(リフレッシュタイムコンスタントレジスタ)}
RTMCSRで決められた周期でRTCNTがカウントアップし、RTCNTとRTCORとが毎回比較され、一致するとリフレッシュ要求が起こる。
&bold(){RTMCSR(リフレッシュタイマコントロール/ステータスレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||CMF|CMIE|CKS2|CKS1|CKS0|(1)|(1)|(1)|
CMF,CMIEは使わないので初期値の0にしておく。
CKSによってRTCNTのカウントするタイミングを設定する。
システムクロックφとすると、
|CKS||
|CENTER:0|カウントなし|
|CENTER:1|φ/2|
|CENTER:2|φ/8|
|CENTER:3|φ/32|
|CENTER:4|φ/128|
|CENTER:5|φ/512|
|CENTER:6|φ/2048|
|CENTER:7|φ/4096|
でRTCNTがカウントアップされる。
今回使うDRAMのデータシートからリフレッシュ周期は5117800=2048回/32mS,5118160=1024回/16msであるから最低でも1024/0.016=64kHzのリフレッシュ。
システムクロックは20MHzであるから、
CKS=6,RTCOR=7に設定し20MHz/2048*9=68.3kHzのリフレッシュ。
よって、RTCOR=7,RTMCSR="00110111"=0x37
&bold(){DRCRB(DRAMコントロールレジスタB)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||MXC1|MXC0|CSEL|RCYCE|(1)|TPC|RCW|RLW|
MXCはカラムアドレスのビット数を設定する。
|MXC||
|0|8ビット|
|1|9ビット|
|2|10ビット|
おまけのDRAMにA0-9、増設したDRAMにA1-10にそれぞれカラムアドレス10ビットのものを使っているのでMXC=2
CSELはUCAS,LCASの出力端子の設定。PB4,5を使うのでCSEL=0
RCYCEはCASビフォアRAS(CBS)リフレッシュをするかしないか。するのでRCYCE=1
TPCはCBSリフレッシュにおいてCAS,RASをHにしたときのウェイトを決める。ウェイト1にするのでTPC=0
RCWはリード、ライト時のRAS,CAS間にウェイトを入れるかどうかを決める。必要ないのでRCW=0
RLWはリフレッシュ時のCAS,RAS間にウェイトを入れるかどうかを決める。これも必要ないのでRLW=0
よって、DRCRB="10011000"=0x98
&bold(){DRCRA(DRAMコントロールレジスタA)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||DRAS2|DRAS1|DRAS0|(1)|BE|RDM|SRFMD|RFSHE|
DRASはエリア2〜5のそれぞれででDRAMを使うのかSRAMなどを使うのかを設定する。
|DRAS|DRAMを使う空間|
|0|DRAMは使わない|
|1|エリア2(CS2)のみ|
|2|エリア2(CS2),3(CS3)|
|3|エリア2,3をCS2だけで4Mの空間として使う?|
|4|エリア2(CS2),3(CS3),4(CS4)|
|5|エリア2(CS2),3(CS3),4(CS4),5(CS5)|
|6|エリア2,3をCS2、エリア4,5をCS4で使う|
|7|エリア2〜5をCS2で使う|
エリア2におまけDRAM,エリア3,4,5にDRAMを増設したのでDRAS=5
BEはDRAMが高速ページモードを使える場合は1で使うようにすると連続でメモリを読む場合は早くなる。このDRAMは使えるのでBE=1
RDMはBE=1のときにされるバーストアクセス時にRASアップモードを使うかRASダウンモードを使うか。おまけDRAMはRASダウンモード出ないといけないようなのでRDM=0
SRFMDはセルフリフレッシュをするかどうか。おまけDRAMは対応していないので禁止のSRFMD=0
RFSHEはRFSH端子からリフレッシュ信号を出すかどうか。今回接続していないので出力禁止のRFSHE=0
よって、DRCRA="10111000"=0xB8
こうしてDRAMの設定が終わると次はバスの設定をします。
モード5ではアドレスバスなどのバス関係のピンをバス用として使うのために
それぞれのポートのDDRを出力モードにしないと使えないので
P1DDR = 0xff アドレスA0-A7
P2DDR = 0x07 アドレスA8-A10
P8DDR = 0x0E CS1〜3
で有効にします
&bold(){WCRH,WCRL(ウェイトコントロールレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
|WCRH|W71|W70|W61|W60|W51|W50|W41|W40|
|WCRL|W31|W30|W21|W20|W11|W10|W01|W00|
W7-W0はそれぞれのエリアのウェイトステートを決める。
H8は20MHz動作なので1クロック50ns,DRAMのCASからのアクセス時間(tCAC)がmax15nsなので余裕で大丈夫・・・なはず
ということでDRAMを接続したCS2〜5のウェイトステートは0からW2〜5=0
よってWCRH="11110000"=0xF0,WCRL="00001111"=0x0F
&bold(){ASTCR(アクセスステートコントロールレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||AST7|AST6|AST5|AST4|AST3|AST2|AST1|AST0|
それぞれのエリアのアクセスステート数を決める。
前述のように(多少違うが)DRAMは速いので最小で十分。
よってASTCR="110000011"=0xC3
まとめると(ヘッダファイルはルネサスのからDLできるものを使用)
BSC.ABWCR.BYTE = 0xC7;
BSC.RTCOR = 7;
BSC.RTMCSR.BYTE = 0x37;
BSC.DRCRB.BYTE = 0x98;
BSC.DRCRA.BYTE = 0xB8;
P1DDR = 0xff;
P2DDR = 0x07;
P8DDR = 0x0E;
BSC.WCR.BYTE.H = 0xF0;
BSC.WCR.BYTE.L = 0x0F;
BSC.ASTCR.BYTE = 0xC3;
これで使えるはずです
#right{最終更新&date()}
----
- 20MHz/2048*7=68.3kHzのリフレッシュ。 -- 町工場のおじさん (2009-10-21 19:20:45)
- 20MHz/2048*7=68.3kHzのリフレッシュ ではなくて /7 = 1.39Khz になりませんか? -- 町工場のおじさん (2009-10-21 19:22:19)
#comment
*AKI-H8/3069F LANボードのDRAM増設 あまり
詳しくは[[こっち>AKI-H8/3069F LANボードのDRAM増設]]で
DRAMを使うには3069のハードウェアマニュアルのP188にあるように
ABWCRの設定、RTCORの設定、RTMCSRのCKS2-0ビットの設定、DRCRBの設定、DRCRAの設定が順に必要になります
&bold(){ABWCR(バス幅コントロールレジスタ)}
エリア0〜1につながれたROM/RAMが8ビットアクセスであるか16ビットアクセスであるかを設定する。
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||ABW7|ABW6|ABW5|ABW4|ABW3|ABW2|ABW1|ABW0|
それぞれ8ビットアクセスの時1,16ビットアクセスの時0。
エリア3,4,5に16ビットアクセスのDRAMを増設したのでABWCR="11000111"=0xC7。
&bold(){RTCOR(リフレッシュタイムコンスタントレジスタ)}
RTMCSRで決められた周期でRTCNTがカウントアップし、RTCNTとRTCORとが毎回比較され、一致するとリフレッシュ要求が起こる。
&bold(){RTMCSR(リフレッシュタイマコントロール/ステータスレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||CMF|CMIE|CKS2|CKS1|CKS0|(1)|(1)|(1)|
CMF,CMIEは使わないので初期値の0にしておく。
CKSによってRTCNTのカウントするタイミングを設定する。
システムクロックφとすると、
|CKS||
|CENTER:0|カウントなし|
|CENTER:1|φ/2|
|CENTER:2|φ/8|
|CENTER:3|φ/32|
|CENTER:4|φ/128|
|CENTER:5|φ/512|
|CENTER:6|φ/2048|
|CENTER:7|φ/4096|
でRTCNTがカウントアップされる。
今回使うDRAMのデータシートからリフレッシュ周期は5117800=2048回/32mS,5118160=1024回/16msであるから最低でも1024/0.016=64kHzのリフレッシュ。
システムクロックは20MHzであるから、
CKS=6,RTCOR=7に設定し20MHz/2048*9=68.3kHzのリフレッシュ。
よって、RTCOR=7,RTMCSR="00110111"=0x37
&bold(){DRCRB(DRAMコントロールレジスタB)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||MXC1|MXC0|CSEL|RCYCE|(1)|TPC|RCW|RLW|
MXCはカラムアドレスのビット数を設定する。
|MXC||
|0|8ビット|
|1|9ビット|
|2|10ビット|
おまけのDRAMにA0-9、増設したDRAMにA1-10にそれぞれカラムアドレス10ビットのものを使っているのでMXC=2
CSELはUCAS,LCASの出力端子の設定。PB4,5を使うのでCSEL=0
RCYCEはCASビフォアRAS(CBS)リフレッシュをするかしないか。するのでRCYCE=1
TPCはCBSリフレッシュにおいてCAS,RASをHにしたときのウェイトを決める。ウェイト1にするのでTPC=0
RCWはリード、ライト時のRAS,CAS間にウェイトを入れるかどうかを決める。必要ないのでRCW=0
RLWはリフレッシュ時のCAS,RAS間にウェイトを入れるかどうかを決める。これも必要ないのでRLW=0
よって、DRCRB="10011000"=0x98
&bold(){DRCRA(DRAMコントロールレジスタA)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||DRAS2|DRAS1|DRAS0|(1)|BE|RDM|SRFMD|RFSHE|
DRASはエリア2〜5のそれぞれででDRAMを使うのかSRAMなどを使うのかを設定する。
|DRAS|DRAMを使う空間|
|0|DRAMは使わない|
|1|エリア2(CS2)のみ|
|2|エリア2(CS2),3(CS3)|
|3|エリア2,3をCS2だけで4Mの空間として使う?|
|4|エリア2(CS2),3(CS3),4(CS4)|
|5|エリア2(CS2),3(CS3),4(CS4),5(CS5)|
|6|エリア2,3をCS2、エリア4,5をCS4で使う|
|7|エリア2〜5をCS2で使う|
エリア2におまけDRAM,エリア3,4,5にDRAMを増設したのでDRAS=5
BEはDRAMが高速ページモードを使える場合は1で使うようにすると連続でメモリを読む場合は早くなる。このDRAMは使えるのでBE=1
RDMはBE=1のときにされるバーストアクセス時にRASアップモードを使うかRASダウンモードを使うか。おまけDRAMはRASダウンモード出ないといけないようなのでRDM=0
SRFMDはセルフリフレッシュをするかどうか。おまけDRAMは対応していないので禁止のSRFMD=0
RFSHEはRFSH端子からリフレッシュ信号を出すかどうか。今回接続していないので出力禁止のRFSHE=0
よって、DRCRA="10111000"=0xB8
こうしてDRAMの設定が終わると次はバスの設定をします。
モード5ではアドレスバスなどのバス関係のピンをバス用として使うのために
それぞれのポートのDDRを出力モードにしないと使えないので
P1DDR = 0xff アドレスA0-A7
P2DDR = 0x07 アドレスA8-A10
P8DDR = 0x0E CS1〜3
で有効にします
&bold(){WCRH,WCRL(ウェイトコントロールレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
|WCRH|W71|W70|W61|W60|W51|W50|W41|W40|
|WCRL|W31|W30|W21|W20|W11|W10|W01|W00|
W7-W0はそれぞれのエリアのウェイトステートを決める。
H8は20MHz動作なので1クロック50ns,DRAMのCASからのアクセス時間(tCAC)がmax15nsなので余裕で大丈夫・・・なはず
ということでDRAMを接続したCS2〜5のウェイトステートは0からW2〜5=0
よってWCRH="11110000"=0xF0,WCRL="00001111"=0x0F
&bold(){ASTCR(アクセスステートコントロールレジスタ)}
|ビット|CENTER:7|CENTER:6|CENTER:5|CENTER:4|CENTER:3|CENTER:2|CENTER:1|CENTER:0|
||AST7|AST6|AST5|AST4|AST3|AST2|AST1|AST0|
それぞれのエリアのアクセスステート数を決める。
前述のように(多少違うが)DRAMは速いので最小で十分。
よってASTCR="110000011"=0xC3
まとめると(ヘッダファイルはルネサスのからDLできるものを使用)
BSC.ABWCR.BYTE = 0xC7;
BSC.RTCOR = 7;
BSC.RTMCSR.BYTE = 0x37;
BSC.DRCRB.BYTE = 0x98;
BSC.DRCRA.BYTE = 0xB8;
P1DDR = 0xff;
P2DDR = 0x07;
P8DDR = 0x0E;
BSC.WCR.BYTE.H = 0xF0;
BSC.WCR.BYTE.L = 0x0F;
BSC.ASTCR.BYTE = 0xC3;
これで使えるはずです
#right{最終更新&date()}
----
- 20MHz/2048*7=68.3kHzのリフレッシュ。 -- 町工場のおじさん (2009-10-21 19:20:45)
- 20MHz/2048*7=68.3kHzのリフレッシュ ではなくて /7 = 1.39Khz になりませんか? -- 町工場のおじさん (2009-10-21 19:22:19)
- 20MHz(50ns)を2048分周したクロックは50*2048=102400nsで、これを7個カウントすると102400*7=716800ns=1.4kHzですね。クロックの周期が7倍になるところを周波数を7倍にたところが勘違いと思います。 -- マイコン読解中 (2010-06-01 19:36:02)
#comment