Super Sylphide 進捗状況(62) -- CPLD で i2c Multiplex その2
オートパイロット装置Tiny Featherを改修しています。地磁気センサをHoneywell HMC5883Lから半田付けが容易なFreescale MAG3110へ変更し、また新規に絶対圧センサとしてMS5611-01BA01を搭載することにしました。いずれもすごいロガー(NinjaScan) Rev.Cで採用した部品です。
実装はこんな感じになりました。
この変更はいずれもi2cバス上のデバイスが置き換わったことになるのですが、少々問題が生じました。TinyFeatherでは以前の記事『Super Sylphide 進捗状況(62) -- CPLD で i2c MUX』にあるとおり、CPLDを介した特異な方法で本体のDSPとi2cデバイスを接続しています。今回導入したi2cデバイスのうちMAG3110は、介在しているCPLDがあらかじめ想定していた挙動とは異なる挙動をすることがわかり、CPLDのコードを変更する必要に迫られました。その挙動というのがクロックストレッチという機構です。
クロックストレッチというのは、スレーブデバイスがクロックをLOWレベルで固定することにより、マスタデバイスを待たせることが可能な機構です。MAG3110を例に出すと、下図のような挙動をします。
まずは、クロックストレッチが行われていない際のオシロスコープ画像です。クロック(黄色)が一定間隔で動いていることが見て取れると思います。
次にクロックストレッチが行われている際のオシロスコープ画像です。クロック(同じく黄色)がLOWで固定している時間帯があることが見て取れます。
クロックストレッチはスレーブデバイスからクロックラインに発生するもので、従前のCPLD内のi2c muxではクロックはマスタからスレーブへの一方通行にしてありました。クロックストレッチを正しく機能させるためには、スレーブからマスタへクロックラインの状態を伝える必要があります。現在のVHDLコード i2c_mux.vhdは次のような方法でこれに対応することにしました。
- マスタ側のクロックラインがLOWになる
- スレーブ側のクロックラインをLOWにすると同時にタイマー開始
- タイマー開始後、CPLDからマスタ側、スレーブ側双方のクロックラインがLOWになるようCPLDが率先してLOWを出力する
- 一定時間経過後、まずはスレーブ側のクロックラインについてCPLDがLOW出力するのをやめ、Hi-Zにする
- マスタ側のクロックラインにはスレーブ側の状態を逐一伝え、スレーブ側がHIGHになるまでマスタ側にはLOWを出力する
詳しくはコードを見てみてください。マスタ、スレーブとも確実にLOWを出力する一定時間はgenericパラメータで調整できるようにしてあります。僕が実際にこのコードを使う際は、今回はi2cのfast modeに対応する400KHzのLOW時間1.25 usを指定するようにしました。
※次の進捗として、OLED表示をつけてみました。こちらで紹介のi2c MUXも使った成果です。
コメント
>hegedoraさん
ご無沙汰しています、fenrirです。詳細はメールにてGW明けに連絡します!
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。
ご無沙汰してます.
Makeでお話させて頂いたhigeduraです.
その後TinyFeather販売の話は進んでいますでしょうか.
Posted by: higedura : May 1, 2013 01:58 PM急ぎではないのですが,研究室の後輩が研究用にオートパイロットを探しています.
予算次第ですが好きに選んでいいとのことなので,この機会にTinyFeatherを導入できればと思っています.
今の時点で見積もりをお願いすることは可能でしょうか.
よろしくお願いします.