Rabbit2000のシリアル通信は、非同期シリアル通信4chと同期式シリアル通信2chが用意されているようです。
今回は非同期シリアル通信を行いますので、4chのうち1chだけ使用します。
ハード的にはC portに4chの端子が用意されており、それぞれRxA(PC7)/TxA(PC6)、RxB(PC5)/TxB(PC4)、RxC(PC3)/TxC(PC2)、RxD(PC1)/TxD(PC0)端子になります。
Cportはパラレルポートと兼用されており、奇数端子がInput(PC1,PC3,PC5,PC7)、偶数端子がOutput(PC0,PC2,PC4,PC6)に設定されています。単なるパラレルポートとして読み書きする場合は、PCDRレジスタを読み書きします。
ここでは、RxA(PC7-51pin)/TxA(PC6-54pin)のAチャンネルを使って通信します。前述のようにCportはパラレルポートと兼用していますので、このAチャンネルだけシリアル通信用に切り替える必要があります。
この切り替えには、PCFRレジスタを設定します。
PCFR(Parallel Port C Function Register)
7bit -
6bit (TxA) 0- Parallel output 1-Signal outoput
5bit-
4bit (TxB) 0- Parallel output 1-Signal outoput
3bit-
2bit (TxC) 0- Parallel output 1-Signal outoput
1bit-
0bit (TxD) 0- Parallel output 1-Signal outoput
ということで、TxAを使用するので、
PCFR=0x40 を設定します。(PC0-PC5まではパラレルポート)
ハード的なシリアル端子を設定したので、次はクロックを設定します。
非同期シリアル通信ではたぶん内部クロックの設定しかないような気がします。
(同期式は外部クロックで可能)
クロック源は、システムクロックをタイマーで分周します。
タイマーは2系統(A/B)あり、シリアルクロックにはTimer Aを使用します。
TimerAには1つのメインタイマーTimerA1 と4つのサブタイマー(TimerA4~TimerA7)があります。
サブタイマーTimerA4~A7のクロック源はメインタイマーTimerA1もしくは内部クロックを1/2にしたシステムクロックを与えます。
サブタイマーTimerA4~A7はシリアルクロックA-ch~D-chに対応しています。
ここでは、A-ch(RxA/TxA)を使用するので、サブタイマーTimerA4を使用します。また、TimerA4のクロック源はシステムクロックを1/2にしたPCLK/2を使用します。なお、シリアルクロックはボーレートの16倍のクロックが必要となります。
TimerA4の分周値は次の式で決まります
TimerA4 =(Sysclock/2/16/BaudRate)-1
ここでは、原発振19.6608MHzをそのままシステムクロックと使用し、ボーレートを38400bpsとすると
TimerA4=(19660800/2/16/38400)-1=15=0x0f
TimerA4の設定レジスタTAT4R=0x0fとなります。
シリアルポートのA-chコントロールレジスタSACRは非同期モード、Cポート使用、8bitキャラクター、割り込み禁止にするために0x00を書き込みます。
SACR=0x00
A-chのシリアルステータスレジスタSASRは受信時及び送信時にフラグをチェックしてます。
SASR(Serial A Port Status Registers)
受信時: bit7 0:受信データなし(空)
1:受信データあり
送信時:bit3 0:送信データなし(空)
1:送信データあり
送受信データはSADR(Serial A Port Data Registers)を読み書きします。
次回は実際にプログラムを作成して、シリアル通信を行っていきたいと思います。