2014年1月25日土曜日

SPIとI2C

SPIとI2Cの通信速度の差について

I2Cは標準モードで100kHz 高速モードで400kHzまでクロック周波数を設定できます
しかし400kHzでは信号がかなり鈍ってしまうため、実際には200kHzが限界と考えたほうがいいです
(ちゃんと動く環境なら400kHzでも動きますが)

対してSPIは、基本的に周波数の上限はなく、それぞれ適当に決めてやる必要があります
例えば、ST社のL3GD20というジャイロセンサでは10MHzまで可能です

そしてSPIでは1バイト8クロックですが、I2CはACKがあるため1バイト9ビットです
しかもSPIはスレーブ選択信号がありますが、I2Cはそれが無いのでスレーブ選択のために追加で1バイト必要です

3軸センサのデータを読む場合、手順としてはステータスレジスタを読んでから、ステータスの内容に応じてデータを読み込みます
ステータスは1バイトでデータは6バイトです

I2Cで読む場合は
→スレーブアドレスを送信
→レジスタアドレスを送信
←レジスタデータを受信

→スレーブアドレスを送信
→レジスタアドレスを送信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
の手順で、11バイトのやりとりが必要です
1バイトは9クロック 1クロックは5uSなので、495マイクロ秒の時間が必要です
スタートコンディションやストップコンディション等があるため、更に追加時間が必要で、がんばっても500マイクロ秒を切ることはできません


次にSPIで読む場合ですが
→レジスタアドレスを送信
←レジスタデータを受信

→レジスタアドレスを送信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
←レジスタデータを受信
の手順で読むことができ、9バイトになります
1バイト8クロックで、1クロックは0.1uSのため、7.2uSで終えることができます

単純に比較した場合、I2CはSPIの68倍の時間が必要になります
SPIを10MHzでウエイト無しに実行できるマイコンも少ないので、実際にはSPIはこの倍以上の時間が必要な場合もありますが、それでもI2Cに比べて十分に高速です


なお、I2Cは200kHzを超えるとかなりアナログ的になりますが、SPIも同様で、10MHzとかになるとかなり滑らかな正弦波に見えたりします
必要な速度と、回路を考えた上で選択する必要があるでしょう

2 件のコメント:

  1. 興味をもちましたので始めてコメントさせていただきます。私も実は最初400kHzで行なったところ、駄目で、100kHzに落としてしかもプルアップを2.2kにしてなんとかという感じになりました。400kHzでは転送にこぼれがでました。バス仕様ですが、100kHzでは1000ns、400kHzでは300nsとありますが、200kHzではどの程度の速度なのでしょうか。マニュアル等では100kHzと400kHzの記述しかないもので・・・

    返信削除
  2. 返信遅くなって申し訳ないです

    I2Cはデジタル回路とはいえ相当にアナログな回路なので、プルアップ抵抗はレベルを安定させる以上の動作が求められます 5V系では1.5kOhm以上 3.3V系では1kOhm以上を目安にプルアップ抵抗を設定します
    5V系であれば2.2kOhmは妥当な値だと思います

    バス仕様についてですが、1000nsや300nsはどこの時間ですか?
    クロック・データの立ち上がりでしょうか?
    200kHzは100kHzより高く、400kHzより低いので、400kHzの値を使用すればいいと思います
    ただこの立上り時間はバスの寄生容量とプルアップ抵抗 それからバス電圧が影響してくるので、計算だけでは難しいかもしれません
    できればオシロスコープで確認した方がいいでしょう

    I2CやSPIが上手く動かない場合は、ロジアナやオシロで正常な信号かどうかを確認するのが手っ取り早いと思います
    信号が正常ならセンサ等の不具合を疑えますし、不正なら該当するプログラムを修正するべきです

    だらだらと書いてしまいましたが、電子工作の不具合を質問する場合、使っているマイコンとセンサを書いておくとより的確な回答が得られるはずです
    I2Cバスの仕様は共通でも、ACKの処理だとか読みだすデータサイズだとかがセンサ固有の場合があります
    (NACKを最後に送らないと次のデータ転送を開始できないセンサだとか、変換結果を全て読み出さないとデータ変換を開始しないセンサというのもあります)
    未解決の場合はその辺りを追加で、解決済みの場合はそれ以外に原因の予想も含めてコメントしていただけると幸いです

    返信削除