home1.gif

next1.gif
back1.gif
 

External SRAM

 

基礎編
 PORT入出力
 シリアル通信
 タイマー機能
 A/Dコンバータ
 D/Aコンバータ
 外部割り込み
 液晶モニタ

応用編
 アウトプットコンペア
 インプットキャプチャ
 SRAM増設

Tips
 関数集
 シリアルEEPROM
 20桁×4行液晶モニタ
  (SC2004C)
 加速度センサを読む

SRAM増設

 イントロダクション
 そもそもSRAMの増設は必要なのか?ということですが、はっきり言って普通に使っている限りは問題有りません。たとえばモニターソフトを使ってRAMにプログラムを書き込む場合であるとか、大量にRAMを使用するプログラム(簡易なデータロガーなんかがこれにあたります)を作った場合には標準の4KBのRAMでは足りないことが予想されますので、「ある程度の知識が有れば使える物」なのか、それとも「想像を絶するほど難しい物」なのかくらいは知っておいて損はないと思います。

 概要
 まず、SRAMを増設するときにはハードウェア面とソフトウェア面の2方向からアプローチしなければいけません。ハードウェアの必要性は簡単に想像できると思いますが、ソフトウェアでは何が変わるのでしょう?

 HEWの「ビルド」ボタンを押すとMOTファイルまで勝手に作ってくれます。通常はこれで何の問題もなく使えるので「そういう物だ」くらいにしか認識していないと思いますが、実はこれにはフラッシュROMが128KBで、RAMが4KBであるという前提の元、それぞれのメモリのどのアドレスにどの命令を置くとか、どの変数領域を確保するとかを決めてくれているのです。だから仮に、

  char tmp[30000];

のように決して確保できない変数を確保しようとするとエラーが起きます。

 これからやろうとしていることは、この「RAMは4KB」という大前提を覆すわけですから、HEWにもそれなりの設定が必要です。

 ここからはまずハードウェアの設計を説明し、それからソフトウェアの設定について順に述べていきたいと思います。

 ハードウェアの設計
 まず、SRAMを制御するためには8種類存在する端子の意味を知ってください。メーカーによっても型番によっても仕様書に記載されている記号は微妙に異なるかも知れませんが、基本はここに述べる内容と変わりませんので、よほど突飛なチップを購入しない限りはその都度読み替えれば対応できるはずです。

仕様書表記

ピン名称

機能

A0〜A14

アドレス入力

アクセスするアドレスをパラレルで指定します

CS

チップセレクト

1つ以上の外部チップを使う場合、どのチップかを特定します

OE

アウトプットイネーブル

外部チップからH8にデータを転送する際にしようします

Vcc

電源

チップにより5V以外の場合もありますから注意してください

I/O0〜I/O7

データ入出力

実際のデータの入出力をパラレルで行います

WE

ライトイネーブル

チップに書き込む際に変化させます

NC

ノーコネクション

何も接続しません

Vss

グランド

H8のグランドと共通にしてください

 機能を紹介する中で「変化させます」とかいう表現を使ったりしていますが、実は、CS・OE・WEに関してはチップによってHighで有効な場合と、Lowで有効な場合で種類が違うことがあります。だいたいは問題なく使えるのですが、たまに違う物があるので知識として知っておく必要があります。

 どちらのタイプなのかを知るには仕様書のタイミング波形図を見れば良いわけですが、もっと簡単な見分け方として、ピンのところに、

  • Highで有効の場合には普通に表記
  • Lowで有効の場合にはバーを付けて表記

という約束になっているので覚えておいてください。なお、H8の方がリード・ライトの際にそれぞれの端子にどのような信号を出すのかについてはハードウェアマニュアル6章「バスコントローラ」にタイミング波形図が載っています。

 なお、ホームページではバー表記ができませんので、以降は「CS-」のように表現します。

 では、実際にSRAMとH8/3048Fの結線を次の表に示します。

SRAMの端子名称

H8の端子名称

AKI−H8でのコネクタ

A0

A0

CN3-15

A1

A1

CN3-16

A2

A2

CN3-17

A3

A3

CN3-18

A4

A4

CN3-19

A5

A5

CN3-20

A6

A6

CN3-21

A7

A7

CN3-22

A8

A8

CN3-23

A9

A9

CN3-24

A10

A10

CN3-25

A11

A11

CN3-26

A12

A12

CN3-27

A13

A13

CN3-28

A14

A14

CN3-29

I/O0

D8

CN3-07

I/O1

D9

CN3-08

I/O2

D10

CN3-09

I/O3

D11

CN3-10

I/O4

D12

CN3-11

I/O5

D13

CN3-12

I/O6

D14

CN3-13

I/O7

D15

CN3-14

CS-

CS1

CN1-06

OE-

RD

CN2-07

WE-

HWR

CN2-08

Vcc

5V

CN1-35

Vss

Vss

CN1-37

 ここで、アドレスバスが0〜14の15ビット分しかありませんが、私が実験に使用したSRAMがたまたま32KBの物であったためにこれで足りたのですが、もっと大きな容量のSRAMを使用する際には当然アドレスバスはさらに多くなります。H8/3048Fには20本のアドレスバスが存在しますので、普通に考えられる範囲の容量には対応できるはずです。

 また、データバスがH8では8〜15ビット目を使っています。これは3048Fの仕様で8ビット幅でアクセスする際にはデータバスの上位を使用するという決まりが有るためです。さらに、ライトイネーブルに対してHWRという端子を使っていますが、この「H」とはデータバスの上位を使っているという意味ですので、本質的には同じ役割を果たすLWRを間違って使うとまったくタイミングが合いませんので注意してください。

 最後に、うっかり忘れてはいけない配線ですが、今まで使うことの無かったAKI−H8のCN5を今回は使います。これはモードを設定するための端子で、今まではシングルチップモード(モード7)を使ってきましたが、今回は

  • 内蔵ROM/RAM有効
  • 外部RAM使用
  • アドレス空間は1MB(トータルメモリは1M以内)

という条件ですので、モード5を使います。したがって、MD1端子をGNDに落としてください。具体的にはCN5-3,4をショートさせます。

 以上でハードウェアのセッティングは完了です。

 ソフトウェアの設定
 SRAMを増設した場合、通常はデータの変数領域が足りないから増設したというパターンが多いでしょう。こういう場合は変数領域のセクションごと増設RAMの領域に持っていってしまうのが最も早い方法です。

 まず、HEWの[Options]の中にある[H8S / H8/300 IM OptLinker]を開いてください。さらにそのなかの[Section]というタブがこれから変更する設定です。初期の状態では次のような表示になっているはずです。

 ここからでは見えませんが、スクロールバーを下に動かしていけば「B」というセクションがH'000FEF10という領域に割り当てられていることが分かります。この番地は標準搭載のRAMが始まる番地で、この「B」というのはHEW付属マニュアルの一つ、リンケージエディタユーザーズマニュアル34ページによると「未初期化データ変数領域」となっています。これを新しいRAMの領域に引っ越しさせます。

 そもそも新しいSRAMがどこにマッピングされているかですが、ハードウェアマニュアル3章「MCU動作モード」8ページ目によると、モード5におけるCS1はエリア1番、つまりH'00020000からマッピングされていることが分かります。
 ですから、この画面の「Add」でこのH'00020000番地というのを新たに登録してやります。

 このままでは単にその番地にも何らかのセクションが設けれるようになっただけですので、実際にセクションを指定しますが、その前にあらかじめH'000FEF10に登録されいた「B」のセクションを「Remove」で削除しておきます。セクションがあちこちにマッピングされていると面倒ですから・・・

 そして、次の図に示すように新たにマッピングしたH'00020000のところに「B」のセクションを設定します。

 これでBのデータ変数領域は引っ越せました。疑わしければプログラムで一度内蔵RAMの容量(4KB)を超える配列なり変数なりを確保してみれば、確かにそこのメモリが使われていることが分かるはずです。

 なお、この使い方の場合にはプログラムそのものには何ら変更は必要有りません。単に使うRAMのアドレスを変更しただけですので、以降はHEWが今までと同じように領域の配分を考えてくれます。

 ユーザーが唯一気にしなければいけないのは、ビルド時に生成されるMAPファイルを時々確認して、増設したSRAMの容量を超えていないかどうかだけは念のためにチェックしておく方が無難です。

 

sign_attention.gif注意

 秋月電子で販売されているH8/3067Fボードを使う場合、標準で付属している32KBのSRAMならば付属説明書の通りにジャンパすれば配線的には何も難しいことはありません。
 しかし、
他のSRAM、たとえば日立のHM628512を使う場合などは注意が必要です。キットに入っているCDに基板の回路図がありますので、SRAM部分の配線をじっくりと眺めてみてください。よく見ると、あちこちに抵抗(実際には0Ωのチップ抵抗を使ってジャンパするようになっている)を使って各社の各種SRAMチップに対応できるように工夫がされています。ここで配線を間違うと、アドレスバスがちゃんと繋がっていないだとか、信号がぶつかってしまうといった不具合が生じます。電源を入れる前に一度チェックするようにしましょう。

 (はまやんさん、情報提供ありがとうございました)