次に、先ほど説明したシリアル通信のモードや、通信速度を設定します。これらの設定は、シリアルモードレジスタ(SCSMR)に対して行います。このレジスタの設定は重要ですので、細かく説明していきます。
C/Āビットには、先ほど説明したシリアル通信のモードを設定します。今回は調歩同期式モードを利用するので、「0」をセットします。
SHRビットには、調歩同期式モードの場合のデータ長を設定します。今回は8ビットで利用しますので、「0」をセットします(ほとんどのケースでは8ビットです)。
PEビットには、調歩同期式モードの場合の「パリティチェック」の有無を設定します。パリティチェックとは、送信するデータにパリティビットを1ビット加えて、データ全体の「1」の個数を偶数または奇数にそろえ、受信側でデータの欠損や反転がないかどうかチェックする手法です。今回は使用しませんので、「0」をセットします。
O/Ēビットには、パリティチェックの際に「1」の数を偶数にそろえるか、奇数にそろえるかを設定します。今回はパリティチェックを使用しませんので、特に設定する必要はありません。
STOPビットには、ストップビットの長さを設定します。今回は1ビットで利用するので、「0」をセットします。
MPビットには、マルチプロセッサモードによる複数プロセッサでの通信を行うかどうか設定します。今回は利用しませんので、「0」をセットします。
CKS1とCKS0ビットには、内蔵ボーレートジェネレータのクロックソースを設定します。この設定は通信速度の設定に関係してきます。ここでは、ひとまず周辺クロックPΦをそのまま利用する設定にします。
SCI1.SCSMR.BIT.CA = 0; // 調歩同期式モード SCI1.SCSMR.BIT.CHR = 0; // キャラクタレングスは8ビット SCI1.SCSMR.BIT._PE = 0; // パリティチェック禁止 SCI1.SCSMR.BIT.OE = 0; // パリティチェック禁止のためこの設定は無効 SCI1.SCSMR.BIT.STOP = 0; // ストップビットレングスは1ビット SCI1.SCSMR.BIT.MP = 0; // マルチプロセッサモードを禁止 SCI1.SCSMR.BIT.CKS = 0; // クロックソースはPΦ(25MHz)
このレジスタには、DIRビットしかありません。DIRビットには、データ送信時にMSB(最上位ビット)とLSB(最下位ビット)のどちらから送信するかを設定します。多くの場合LSBファーストですので、DIRビットには「0」をセットすることにします。
SCI1.SCSDCR.BIT.DIR = 0; // LSBファースト
ここで、シリアル通信速度の設定を行います。通信速度は「bps」という単位で表されます。bpsは「bit per second」の略です。すなわち、1秒間に何ビットのデータを送信するか、という意味です。ひとまず、SH7125の調歩同期式モードで利用できる最大ビットレート「38400bps」を設定することにします。
データシートのビットレートレジスタのページを見ると、これまでに設定した値から、ビットレートレジスタにセットする値の計算方法が載っています。PΦ=25MHz、SCSMR.CKS=0、38400bpsを調歩同期式モードの場合の計算式に代入すると、N=19.34……となります。
SCI1.SCBRR = 19;
なお、データシートには、この後「1ビット期間待機する」と書かれていますが、今回は省略します。
シリアル通信に利用する端子のマルチプレクスと入出力を設定します。この設定は、前回の復習になりますので、データシートを見ながら設定してみてください。前回は、利用する端子が含まれるポートを全て初期化しましたが、今回は必要な端子だけを設定します。プログラムは、次のようになります。
PFC.PACRL2.BIT.PA4MD = 1; // PA4をTXD1出力に設定(送信に利用) PFC.PACRL1.BIT.PA3MD = 1; // PA3をRXD1入力に設定(受信に利用) PFC.PAIORL.BIT.B4 = 1; // PA4を出力に設定(送信に利用するため) PFC.PAIORL.BIT.B3 = 0; // PA3を入力に設定(受信に利用するため)
シリアル通信に関する設定が終わったので、これまで禁止していた通信を許可します。(3)で示したように、シリアルコントロールレジスタ(SCSCR)のTEビットとREビットにそれぞれ「1」をセットして、送信/受信を許可します。
SCI1.SCSCR.BIT.TE = 1; // 送信動作を許可 SCI1.SCSCR.BIT.RE = 1; // 受信動作を許可
以上でシリアル通信の初期化は完了です。関数にしてまとめておきましょう(プログラム1)。また、分かりやすいようにビット単位で値をセットしましたが、バイト単位で値をセットできますので、プログラム2のように省略して書いても構いません。
void initSCI1(void) { STB.CR3.BIT._SCI1 = 0; // SCI1にクロックを供給 SCI1.SCSCR.BIT.TE = 0; // 送信動作を禁止 SCI1.SCSCR.BIT.RE = 0; // 受信動作を禁止 SCI1.SCSCR.BIT.TIE = 0; // 送信データエンプティ割り込み要求を禁止 SCI1.SCSCR.BIT.RIE = 0; // 受信データフル割り込み要求、および受信エラー割り込み要求を禁止 SCI1.SCSCR.BIT.MPIE = 0; // マルチプロセッサインタラプトを禁止 SCI1.SCSCR.BIT.TEIE = 0; // トランスミットエンドインタラプトを禁止 SCI1.SCSCR.BIT.CKE = 0; // SCK端子は入力端子 SCI1.SCSMR.BIT.CA = 0; // 調歩同期式モード SCI1.SCSMR.BIT.CHR = 0; // キャラクタレングスは8ビット SCI1.SCSMR.BIT._PE = 0; // パリティチェック禁止 SCI1.SCSMR.BIT.OE = 0; // パリティチェック禁止のためこの設定は無効 SCI1.SCSMR.BIT.STOP = 0; // ストップビットレングスは1ビット SCI1.SCSMR.BIT.MP = 0; // マルチプロセッサモードを禁止 SCI1.SCSMR.BIT.CKS = 0; // クロックソースはPΦ(25MHz) SCI1.SCSDCR.BIT.DIR = 0; // LSBファースト SCI1.SCBRR = 19; // PΦ=25MHz、38400bps PFC.PACRL2.BIT.PA4MD = 1; // PA4をTXD1出力に設定 PFC.PACRL1.BIT.PA3MD = 1; // PA3をRXD1入力に設定 PFC.PAIORL.BIT.B4 = 1; // PA4を出力に設定(送信に利用) PFC.PAIORL.BIT.B3 = 0; // PA3を入力に設定(受信に利用) SCI1.SCSCR.BIT.TE = 1; // 送信動作を許可(送信に利用するため) SCI1.SCSCR.BIT.RE = 1; // 受信動作を許可(受信に利用するため) }
void initSCI1() { STB.CR3.BIT._SCI1 = 0; // SCI1にクロックを供給 SCI1.SCSCR.BYTE = 0x00; // SCSCRをクリア SCI1.SCSMR.BYTE = 0x00; // SCSMR、SCSDCRに送信/受信フォーマットを設定 SCI1.SCSDCR.BIT.DIR = 0; // LSBファースト SCI1.SCBRR = 19; // PΦ=25MHz、38400bps PFC.PACRL2.BIT.PA4MD = 1; // PA4をTXD1出力に設定 PFC.PACRL1.BIT.PA3MD = 1; // PA3をRXD1入力に設定 PFC.PAIORL.BIT.B4 = 1; // PA4を出力に設定 PFC.PAIORL.BIT.B3 = 0; // PA3を入力に設定 SCI1.SCSCR.BYTE = 0x30; // 送信/受信動作を許可 }
Copyright © ITmedia, Inc. All Rights Reserved.