目次 目次 次へ
SCI3(シリアルコミュニケーションインタフェース)の初期化関数
 

 ここでは、シリアル通信を用いて、 マイコンからパソコンへデータを送受信することを考えましょう。

AKI-H8/3664 QFP版では、 プログラムを書き込むためにシリアル通信を利用しているので、 特に付け加える回路はありません。

ここでは、BestTechnologyの、 GCC Developer Liteに付属する sci.c(Linux用,EUC,LFに変換したものを置いておきます。 GCC Developer Liteにはすでに用意されているので不要です。)の関数を利用することにしましょう。

新しいGCC Developer Liteでは、 ボーレート設定リストが3664.hの中で定義されていました。

また、新しくsci3.cというファイルに、 シリアル通信用関数が追加されていました。

/* sci.cのSCI3初期化部分 */

typedef enum {        // ボーレート設定リスト
  br2400  = 207,
  br4800  = 103,
  br9600  = 51,
  br19200 = 25,
  br31250 = 15,
  br38400 = 12,
  br57600 = 8
} BaudRate;

/*-----------------------------------------------*/
/* 通信関係                                      */
/*-----------------------------------------------*/
// SCI初期化(調歩同期式)

void InitSCI3 (BaudRate b)
{
  volatile int     i;

  // RS232Cコミュニケーション設定
  IO.PMR1.BIT.TXD = 1 ;   // P22をTXD端子として使う設定
  SCI3.SCR3.BYTE = SCI3.SMR.BYTE = 0;
  SCI3.BRR = b;           // ボーレート設定
  for (i = 0; i < 5; i++) ; // ダミーウェイト
  SCI3.SCR3.BIT.RIE = 0;  // 受信割り込み禁止
  SCI3.SCR3.BIT.TE = 1;   // 送信許可
  SCI3.SCR3.BIT.RE = 1;   // 受信許可
  SCI3.SSR.BYTE &= 0x80;  // ステータスクリア
}

 
列挙型 enum
 

typedef enum {
  br2400  = 207,
  br4800  = 103,
  br9600  = 51,
  br19200 = 25,
  br31250 = 15,
  br38400 = 12,
  br57600 = 8
} BaudRate;

 

SCI3の通信速度は、いくつか選択可能なのですが、 通信速度と設定する数値の対応は複雑で、 一目見ただけでは簡単には分かりません。

コメントを付けてわかるようにしておく方法もあるのですが、 いろいろと思考錯誤しているうちに、 コメントというのは嘘になっていくことが往々にしてあります。

このように、名前と定数を対応させておくのに便利なのが、列挙型です。 ここの例では、typedefを使ってBaudRateという型を新たに定義しています。

BaudRate a;
a=br9600;

というふうに利用します。 ここでは、BaudRate型の変数aを定義し、 br9600を代入しています。 このとき、aの値は51になります。 BaudRate型の変数に代入できるのは、 型の宣言でおこなった br2400,br4800,br9600,br19200,br31250,br38400,br57600に限られます。

 
SCI3初期化関数 InitSCI3
 

IO.PMR1.BIT.TXD = 1

P22/TXD端子をTXD出力端子に設定します。 シリアルを用いてデータ送信を行うために必要です。


SCI3.SCR3.BYTE = 0

SCI3.SCR3.BYTE = SCI3.SMR.BYTE = 0は、 SCI3.SCR3.BYTE = 0とSCI3.SMR.BYTE = 0を一度に行ったものです。

SCI3.SCR3.BYTEはシリアルコントロールレジスタ3(SCR3)の設定を、 バイト単位でおこなったものです。 各ビットの意味は以下の通りです。

ビットビット名機能
7TIE0:送信割込み不可(1は可)
6RIE0:受信割込み不可(1は可)
5TE0:送信不可(1は可)
4RE0:受信不可(1は可)
3MPIE0:マルチプロセッサ割込み不可
2TEIE0:受信終了割込み不可(1は可)
1
0
CKE1
CKE0
調歩同期式の場合
00:内部ボーレートジェネレータをクロックソースとして用いる

全ての送受信を禁止する設定になっています。


SCI3.SMR.BYTE = 0

これも、シリアルモードレジスタ(SMR)の設定を、 バイト単位でおこなったものです。 各ビットの意味は以下の通りです。

ビットビット名機能
7COM0:調歩同期式モード(1:クロック同期式モード)
6CHR(調歩同期式モードの場合のみ)0:データ長8ビット(1:7ビット)
5PE(調歩同期式モードの場合のみ)0:パリティチェックなし(1:あり)
4PM(調歩同期式モードでPE=1の場合のみ)0:偶数パリティ(1:奇数パリティ)
3STOP(調歩同期式モードの場合のみ)0:ストップビットの長さ1(1:長さ2)
2MP0:マルチプロセッサモード不可(1は可)
1
0
CKS1
CKS0
調歩同期式の場合
00:内部ボーレートジェネレータがCPUの動作周波数(16MHz)

以上より、ここでは

  • 調歩同期式モード
  • データ長8ビット
  • パリティチェックなし
  • ストップビットの長さ1
という設定であることが分かります。


SCI3.BRR = b

通信速度を設定しています。 bはInitSCI3を呼び出すときの引数として指定し、 (BaudRate b)という記述から、 BaudRate型であることが分かります。 通信速度とbに代入する値との関係は以下の通りです。

通信速度(bit/s)bに代入する値実際にbに格納される値
2400 br2400207
4800 br4800103
9600 br9600 51
19200br19200 25
31250br31250 15
38400br38400 12
57600br57600 8


for (i = 0; i < 5; i++)

通信速度を設定したら、少なくとも「1ビット期間」待つのだそうです。 「1ビット期間」がどれだけの時間かわかりません(@@;)/ ここでは、何もしないループをまわして、 時間を稼いでいるようです。


  SCI3.SCR3.BIT.RIE = 0;
  SCI3.SCR3.BIT.TE = 1;
  SCI3.SCR3.BIT.RE = 1;

シリアルコントロールレジスタ3(SCR3)のビットごとの役割は、 上述した通りです。 ここでは、コメントにある通り、

  • 受信割り込み禁止
  • 送信許可
  • 受信許可
という設定をして、通信の準備をしています。 受信割り込み禁止は、上で設定したものを変更してはいないので、 なくても大丈夫でしょう。


SCI3.SSR.BYTE &= 0x80

シリアルステータスレジスタ(SSR)を初期化しています。 各ビットの意味は以下の通りです。

ビットビット名機能
7TDRE0:トランスミットデータレジスタ(送信用のレジスタ)が利用不可(1:利用可能)
6RDRF0:レシーブデータレジスタ(受信用のレジスタ)が利用可能(1:利用不可)
5OER0:オーバランエラー無し(1:発生)
4FER0:フレーミングエラー無し(1:発生)
3PER0:パリティエラー無し(1:発生)
2TEND(1送信終了)
1MPBR受信キャラクタ中のマルチプロセッサビットが格納される(今の場合無関係)
0MPBT送信キャラクタ中のマルチプロセッサビットを格納する(今の場合無関係)

今の場合には、送信用のレジスタの情報をそのまま残し、 その他をクリアしています。

 
SCI3初期化関数 InitSCI3の使い方
 

SCI3初期化関数 InitSCI3は、通信速度に対応する引数を与えて呼び出すだけです。

例(38400bit/sの場合)

InitSCI3(br38400);

通信速度(bit/s)指定する引数
2400 br2400
4800 br4800
9600 br9600
19200br19200
31250br31250
38400br38400
57600br57600

 
やってみよう
 
  • 受信割り込みフラグを指定できるようにInitSCI3を書きなおしましょう(InitSCI)。
 
2003/05/23(Fri)
AKI-H8/3664 QFP版のトップページへ
トップページへ
広告 万馬券 無料レンタルサーバー ブログ blog