dsPIC30F4012のI2C設定(I2CBRGにはまる)

dsPIC30F4012でI2C設定を行いました。

ボーレート生成器のリロード値を設定するI2CBRGレジスタの値の計算は以下の式の方が実測値に近くなりました。

f:id:ma2-tech:20170410215034p:plain

 

Microchip 日本語資料 -> リファレンス マニュアル

dsPIC30F ファミリ リファレンスマニュアル 高性能デジタルシグナルコントローラー

(文書ID:70046B_JP、リリース日:2006/03/09)のp532より。

 

他の資料は多くが以下の式を記載しています。

f:id:ma2-tech:20170410220759p:plain

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でした。

f:id:ma2-tech:20170410214434p:plain

 

◎I2CBRG=31のとき。

 1clock=約1.85usで、540kHzをこえてしまいました。

f:id:ma2-tech:20170410214433p:plain

 

また、100kHzに対してはscreenshotはありませんが、I2CBRG=199(上式) で98kHz、I2CBRG=181(下式)で107kHzでした。

 

というわけで、データシートも鵜呑みにはできないということでした。