P/ECE研究室〜S1C33分室
* Mon Jun 10 15:30:00 JST 2002 Naoyuki Sawa
今回は、シリアルコントローラとLCDCのやりとりの部分に注目してみたいと思います。
+−−−−−+ RESETB +−−−+
| +−−−−−−−→+ |
| | CSB | |
| +−−−−−−−→+ |
| C | RS | L |
| P +−−−−−−−→+ C |
| U +−+ | D |
| |シ| SCLK | C |
| |リ+−−−−−−−→+ |
| |ア| SID | |
| |ル+−−−−−−−→+ |
+−−−+−+ +−−−+
CPUとLCDCは、五本の信号線でつながっています。
CPUからLCDCへのコマンド・データ送信に直接関わるのは、RS・SCLK・SIDの三本です。
まず、コマンド・データ送信に直接関わらない、RESETBとCSBから見ていきます。
RESETBは、LCDC全体の設定をリセットするために使います。
RESETBを使わなくても、リセットコマンドを送信することによってリセットすることもできるのですが、
何かの拍子で「いま何ビット目を送っているか?」がCPUとLCDC側でズレてしまうと、コマンドの送信自体ができなくなってしまいます。
そのような場合でも、RESETBを使ってLCDCの設定を完全に初期化し、コマンドの送信を0ビット目からやり直すことができます。
CSBは、この信号が0の場合のみ、CPUからLCDCにコマンドやデータを送ることができます。
言い換えると、CSBが1になっている間、LCDCはRS・SID・SCLKを無視するので、CPUとLCDCは接続されていないのと同じです。
P/ECEの場合、CPUとLCDCは専用の信号線でつながれていて、他のチップと信号線を共有していないので、CSBはあまり重要ではありません。
現在のP/ECEカーネルでは、送信開始〜送信終了のたびに、
CSB=0(接続) → 送信 → CSB=1(切断)
を行っていますが、初期化後ずっとCSB=0(接続)のままにしても大丈夫だと思います。
実験プログラムでは、CSB=0(接続)のままにしてみましたが、特に問題は起こりませんでした。
それでは次に、RS・SCLK・SIDを見ていきます。
CPUからLCDCへのコマンドやデータは、バイト(8ビット)単位で構成されています。
コマンド・データの各バイトは、ビット7〜0の順に分解されてLCDCに送信されます。
前回、グレイスケールレジスタを操作するコマンドとして、「8E,00,8F,00」を送信する様子を図示しました。
今回は、そのうちの1バイト「8E」を送信するときの、各信号線の変化の様子を図示します。
ビット0 ビット7
↓ ↓
8E=01110001
+−−−+ +−−−+
| |RS | |
| +−−−−+−0−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−→+ |
| | +−1−+−1−+−1−+ +−1−+ | L |
| C |SID | | | | | C |
| P +−−−−+−0−+ +−0−+−0−+−0−+ +−−→+ D |
| U | +−+ +−+ +−+ +−+ +−+ +−+ +−+ +−+ | C |
| |SCLK| | | | | | | | | | | | | | | | | |
| +−−−−+ +−+ +−+ +−+ +−+ +−+ +−+ +−+ +−−−−→+ |
| | : : : : : : : : | |
+−−−+ : : : : : : : : +−−−+
: : : : : : : ビット7送信
: : : : : : ビット6送信
: : : : : ビット5送信
: : : : ビット4送信
: : : ビット3送信
: : ビット2送信
: ビット1送信
ビット0送信。LCDCがビット0を受信した時、同時にRSを調べる。
RS=0なので、受信したビット7〜0をまとめて、コマンドとみなす。
LCDCは、SIDが0から1に変化した瞬間に、SIDから1ビット取り込みます。
これを8回繰り返して、8ビット全体を取り込みます。
最後のビット(=8ビット目=ビット0)を取り込むとき、RS信号を調べます。
RS=0なら、いま受信完了した8ビット全体は、コマンドとして解釈されます。
RS=1なら、いま受信完了した8ビット全体は、データとして解釈されます。
RSを調べるのは最後のビットを受信した瞬間だけで、途中のビットを受信しているときのRSの状態は関係ありません。
現在のP/ECEカーネルでは、RSの制御はCPUが汎用ポートを直接操作して切り替えています。
SIDとSCLKの制御はシリアルコントローラが行っています。
シリアルコントローラを使っているので、各ビットを送り出す間隔は一定になっていますが、実際には一定間隔である必要はありません。
LCDCが各ビットを取り込むタイミングの規定は、SCLKが0から1に変化した瞬間、というルール以外ありませんので、
ばらばらの間隔で各ビットを送り出しても構いません。
よって、SIDとSCLKを制御するためにシリアルコントローラを使う必要はなく、CPUが直接操作しても構わないのです。
(シリアルコントローラを使った方が効率がいいですが、実験用途としてはCPUで直接操作した方がわかりやすいので)
幸い、S1C33のシリアル入出力端子は、設定を切り替えて汎用入出力ポートとして使うこともできます。
SID・SCLK信号を、シリアルコントローラ経由でなく、CPUが直接制御できる汎用入出力ポートとして操作します。
プログラムの流れは、だいたい次のようになります。
[開 始]
↓
SID・SCLKにつながっているシリアル入出力端子の機能を、
汎用入出力ポートに変更
|
|←−−−−−−−−−−−−−−−−+
↓ |
送信するコマンドまたはデータは、まだある? |
| | |
|ない |ある |
| ↓ |
| [1バイト送信する]−+
↓
SID・SCLKにつながっている汎用入出力ポートの機能を、
シリアルシリアル入出力に戻す
↓
[終 了]
[1バイト送信サブルーチン]
↓
送信するのはコマンド?それともデータ?
| |
|コマンド |データ
↓ ↓
RS=0にする RS=1にする
| |
|←−−−−−−−−−+
↓
+→FOR i=7 TO 0−−−−−−+
| ↓ 完了 |
| SCLK=0にする |
| ↓ |
| ビットiは0?それとも1? |
| | | |
| |0 |1 |
| ↓ ↓ |
| SID=0にする SID=1にする |
| | | |
| |←−−−−−−−+ |
| ↓ |
| SID=1にする |
| | |
+−−−+ |
|
+−−−−−−−−−−−−−−−−−+
↓
[終 了]
RS信号の切り替えは、最後のビットを送る直前(i=0)でも構わないのですが、
最初に切り替えておく方が簡単なので、最初のビット(i=7)を送る前に切り替えます。
サンプルプログラムはこちら
5月29日の「シリアルコントローラ?#5」の最後で紹介したのと同じものです。
Mon Jun 26 12:30:00 JST 2002 Naoyuki Sawa 追記
プログラムの中でP15,16の入出力方向を設定しなければいけない理由について、lcd5.cにコメントを追加しました。
サンプルプログラムはこちら
Wed Jul 27 04:58:00 JST 2002 Naoyuki Sawa 追記
シリアルI/F→入出力ポートへの端子機能切替前に、初期出力値の設定を追加。
端子機能切替より先に、入出力方向を設定するように順番入替え。
サンプルプログラムはこちら
次回は、LCDコントローラの設定方法や、コマンドを見ていきたいと思います。
(続きます...)
nsawa@piece-me.org