シリアル通信の速度(ボーレート)の設定を行う。

BRR は、SMRのCKS1、CKS0 ビットで選択されるボーレートジェネレータの動作クロックとあわせて、シリアル送信/受信のビットレートを設定する8 ビットのレジスタです。



BRR の設定値は以下の計算式で求められます。
(詳細はH8/3069Fのマニュアルの13.2.8節)

〔調歩同期式モード〕
N=(φ÷(64×2^(2n-1)×B)×10^6)-1

〔クロック同期式モード〕
N=(φ÷( 8×2^(2n-1)×B)×10^6)-1

B:ビットレート(bit/s)
N :ボーレートジェネレータのBRR の設定値(0≦N≦255)
φ :動作周波数(MHz)
n :ボーレートジェネレータ入力クロック(n=0、1、2、3)
 (n とクロックの関係は下表を参照してください)

n  クロック  SMRの設定値
         CKS1 CKS0
0  φ        0  0
1  φ/ 4    0  1
2  φ/16    1  0
3  φ/64    1  1


SCIのボーレートは、SCIに供給されるクロックにより決定。
CPUがI/O用に持っているクロックを分周することで得られるため、分周比をレジスタで設定するとのこと。
分周比はSMRのクロックセレクトで指定できますが、とりあえずは分周比は1で設定とのこと。

クロック:20MHz
分周比:1
ビットレート:9600bps

調歩同期式ッモードの方程式にあてはめたら「64.104166666666666666666666666667」になる。
ということでN=64。

ところで分周比とはここ
パルス信号送出をすることが目的の様で、それを他のパルス信号入力を基準にしてN回に1回の周期で出せるようにしたものみたい。おそらくCPUがI/O用にどんだけ資源を裂けるかを表しているのだろう。


/* デバイス初期化 */
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;
}


ボーレートは115200bpsもよく使われるようですがH8/3069FはDCIに供給できるクロック数がそれほど高くないためボーレートを高く設定するとうまく通信がいかないことがあるようです。
もし115200bpsを設定したければN=4(4.4253472222222222222222222222222)になると計算してみるもののマニュアルには115200bpsがのっていないなぁ。


う~む、ここもいろいろ突っ込みたいところだが今はやめて次に進んでおこう。