シリアル入出力の制御を行う。
SCR は、SCIの送信/受信動作、調歩同期式モードでのシリアルクロック出力、割り込み要求の許可/禁止、および送信/受信クロックソースの選択を行うレジスタです。
とりあえず以下の内容がビットごとの設定内容のようです。
(詳細はH8/3069Fのマニュアルの13.2.6節)
0 クロックイネーブル0(CKE0):
SCIのクロックソースを選択するビットです。
1 クロックイネーブル1(CKE1):
SCIのクロックソースを選択するビットです。
※クロックイネーブル0,1ともに0でひとまず。
2 トランスミットエンドインタラプトイネーブル(TEIE):
送信終了割り込み(TEI)要求を許可/禁止するビットです。
(本では省略されていて紹介されていませんでした。)
3 マルチプロセッサインタラプトイネーブル(MPIE):
マルチプロセッサ割り込みを許可/禁止するビットです。
(本では省略されていて紹介されていませんでした。)
4 レシーブイネーブル(RE):
受信動作を許可/禁止するビットです。
(0:受信禁止 1:受信開始)
5 トランスミットイネーブル(TE):
送信動作を許可/禁止するビットです。
(0:送信禁止 1:送信開始)
6 レシーブインタラプトイネーブル(RIE):
受信データフル割り込み(RXI)要求と、受信エラー割り込み(ERI)要求を許可/禁止するビットです。
(0:受信割込み禁止 1:受信割込み有効)
7 トランスミットインタラプトイネーブル(TIE):
送信データエンプティ割り込み(TXI)要求を許可/禁止するビットです。
(0:送信割込み禁止 1:送信割込み有効)
コントローラのモードの設定などは、そのコントローラを無効化した状態で行い、設定かんりょうしたあとに有効かするのが一般的だとか。
下の初期化ソースのようにSCRにゼロを設定し、シリアル送受信と割込みをすべて無効化してしまいます。SMRとBRRの設定をした後、SCRの受信イネーブルと送信イネーブルを立てて、送受信を有効化しています。
/* デバイス初期化 */
int serial_init(int index)
{
volatile struct h8_3069f_sci *sci=regs[index].sci;
sci->scr = 0;
sci->smr = 0;
sci->brr = 64; /* 20MHZのクロックから9600BPSを生成(25MHZの場合は80にする) */
sci->scr = H8_3069F_SCI_SCR_RE | H8_3069F_SCI_SCR_TE; /* 送受信可能 */
sci->ssr = 0;
return 0;
}
う~む、ここもいろいろ突っ込みたいところだが今はやめて次に進んでおこう。
SCR は、SCIの送信/受信動作、調歩同期式モードでのシリアルクロック出力、割り込み要求の許可/禁止、および送信/受信クロックソースの選択を行うレジスタです。
とりあえず以下の内容がビットごとの設定内容のようです。
(詳細はH8/3069Fのマニュアルの13.2.6節)
0 クロックイネーブル0(CKE0):
SCIのクロックソースを選択するビットです。
1 クロックイネーブル1(CKE1):
SCIのクロックソースを選択するビットです。
※クロックイネーブル0,1ともに0でひとまず。
2 トランスミットエンドインタラプトイネーブル(TEIE):
送信終了割り込み(TEI)要求を許可/禁止するビットです。
(本では省略されていて紹介されていませんでした。)
3 マルチプロセッサインタラプトイネーブル(MPIE):
マルチプロセッサ割り込みを許可/禁止するビットです。
(本では省略されていて紹介されていませんでした。)
4 レシーブイネーブル(RE):
受信動作を許可/禁止するビットです。
(0:受信禁止 1:受信開始)
5 トランスミットイネーブル(TE):
送信動作を許可/禁止するビットです。
(0:送信禁止 1:送信開始)
6 レシーブインタラプトイネーブル(RIE):
受信データフル割り込み(RXI)要求と、受信エラー割り込み(ERI)要求を許可/禁止するビットです。
(0:受信割込み禁止 1:受信割込み有効)
7 トランスミットインタラプトイネーブル(TIE):
送信データエンプティ割り込み(TXI)要求を許可/禁止するビットです。
(0:送信割込み禁止 1:送信割込み有効)
コントローラのモードの設定などは、そのコントローラを無効化した状態で行い、設定かんりょうしたあとに有効かするのが一般的だとか。
下の初期化ソースのようにSCRにゼロを設定し、シリアル送受信と割込みをすべて無効化してしまいます。SMRとBRRの設定をした後、SCRの受信イネーブルと送信イネーブルを立てて、送受信を有効化しています。
/* デバイス初期化 */
int serial_init(int index)
{
volatile struct h8_3069f_sci *sci=regs[index].sci;
sci->scr = 0;
sci->smr = 0;
sci->brr = 64; /* 20MHZのクロックから9600BPSを生成(25MHZの場合は80にする) */
sci->scr = H8_3069F_SCI_SCR_RE | H8_3069F_SCI_SCR_TE; /* 送受信可能 */
sci->ssr = 0;
return 0;
}
う~む、ここもいろいろ突っ込みたいところだが今はやめて次に進んでおこう。