dsPIC30F4012のI2C設定(I2CBRGにはまる)
dsPIC30F4012でI2C設定を行いました。
ボーレート生成器のリロード値を設定するI2CBRGレジスタの値の計算は以下の式の方が実測値に近くなりました。
Microchip 日本語資料 -> リファレンス マニュアルの
dsPIC30F ファミリ リファレンスマニュアル 高性能デジタルシグナルコントローラー
(文書ID:70046B_JP、リリース日:2006/03/09)のp532より。
他の資料は多くが以下の式を記載しています。
dsPIC30F4012 - Microcontrollers and Processorsの
dsPIC30F4011/4012 Data Sheet (Documentationの一番上)のp118より。
他にも、同ページの
dsPIC30F Family Reference Manual (p562)や
秋月電子通商さんの販売ページのデータシートも同様です。
Fcy/1111111ってどうやってハードウェアを実装しているんでしょう?
えらく複雑な回路になりそうに思えます。補正値でしょうか。
1111111 = 239 * 4649 で239と4649は素数ですよ。
実際に計算してみます。(Fcy=20MHzとします)
◎100kHzのとき
(上式) I2CBRG = INT(20MHz/100kHz)-1 = 199
(下式) I2CBRG = (20MHz/100kHz - 20MHz/1111111)-1 = 181
10%くらいの違いなのでどちらでも通信できるかも。
◎400kHzのとき
(上式) I2CBRG = INT(20MHz/400kHz)-1 = 49
(下式) I2CBRG = (20MHz/400kHz - 20MHz/1111111)-1 = 31
随分違ってきます。
実際の波形を確認します。CH1(黄色)がSCL、CH2(緑色)がSDAです。
◎I2CBRG=44のとき。
1clock=約2.5usでだいたい400kHzです。
※I2CBRG=49のscreenshotではないのは、400kHzの時の値が知りたかったため。
I2CBRG=49のときの実測値は365kHzでした。10%近いズレがあります。
また、I2CBRG=45では393kHzでした。
◎I2CBRG=31のとき。
1clock=約1.85usで、540kHzをこえてしまいました。
また、100kHzに対してはscreenshotはありませんが、I2CBRG=199(上式) で98kHz、I2CBRG=181(下式)で107kHzでした。
というわけで、データシートも鵜呑みにはできないということでした。