以下のように設定する。
void init_sci3(void) { IO.PMR1.BIT.TXD = 1; /* TXD を出力にセット(PMR2 ではない) */ SCI3.SMR.BYTE = 0x00; /* 調歩、8Bits、NoParity、1Stop、Clk=φ */ SCI3.BRR = 0x0f; /* 20000000Hz÷(32×38400)- 1 */ SCI3.SCR3.BYTE = 0x30; /* TX Enable、RX Enable、内部ボーレートGEN */ { ubyte dmy; dmy = SCI3.SSR.BYTE; /* Dummy Read */ SCI3.SSR.BYTE = 0x80; /* TDRE ビットをセット */ } }
注意すべきは、1行目のTXDを出力にしているところ。
TXD出力は、PORT2にあるので、普通に考えるとPMR2で設定するように思えるが、
PMR1の中に、TXDとして使用するための設定ビットがあるという、ちょっとした罠が潜んでいる。
ちなみに、ボーレート設定値は、以下の式で求めることができる。
BRR設定値 = φ ÷ (ボーレート × 32) - 1
少数以下の値を切り捨てるか、切り上げるかは、本来のボーレートとの誤差を計算して、誤差の少ないほうを選ぶ。
誤差が大きいと、高速通信では致命的になってくるので、必要以上に高速通信を行いたい場合は、クリスタルをちょうど良い値のものに変更するか、同期通信にするのが良い。