SDKの flexio_biss_polling_transfer例で、BiSS-C絶対エンコーダ(24ビットST + 16ビットMT)と通信 するために、この MIMXRT1186を使って います。
問題:
500 kHz では CRCが通過し位置データも正確です。
2.5 MHz では 、CRCは必ず失敗します。エンコーダのACK周期は約 11.8 µs で 、これは2.5 MHzでは約 30 MAクロック周期 に相当します 。
オシロスコープによる観測結果から、FlexIOマスターはACK期間を調整することなく、フレームの最初から一定数のMAクロックを送信していることが分かります。30ビットのACK低レベル信号が64ビット受信シフターにサンプリングされ、実際のSTART + SCDデータがシフトウィンドウの外に押し出されてしまいます。FLEXIO_BISS_CalFrameHeadLen()は 12 ~ 34 の値を返し、BISS_VerifyFrame() によるキャリブレーションが失敗します。
BiSS-Cについて私が理解していること:
このプロトコルでは、エンコーダが内部ステートマシンを進め、最終的にACKを終了してSTARTビットを送信するためにクロックが必要となるため、ACK中もMAが動作し続ける必要がある。したがって、正しいマスター振る舞いは次の通りです:
MAは、ACK中も含め、フレームの開始時からクロックを送信し続けます。
マスターモニターはSLを監視します。
マスターは、既に送信されたMAクロックの数を継続的にカウントします。SLがハイになると(ACKが終了し、STARTビットが到着すると)、マスターはACKによって消費されたクロック数を記録し、フレームを完了するために必要なクロック数を計算します。
質問:
FlexIOのタイマーは固定されたタイマーコンペア値を使い、あらかじめ決められたクロック数を一度に送信します。上記の適応動作、つまりフレーム中のSLエッジに基づいて残りのMAクロック数を動的に調整するFlexIOの仕組みはありますか?
具体的には:
FlexIOのタイマーはSLエッジをトリガーとして使い、タイマーを停止、リセット、または再ロードすることで、マスターがACK終了を判別し、残りのクロックを送信できるようにできますか?
もしFlexIOがこれをできない場合、NXPは長時間のACK対応をサポートするBiSS-Cマスター(例:eFlexPWM、LPSPI、またはFPGAベースのソリューション)をどのように実装することを推奨していますか?
設定:
MCUXpresso SDK for MIMXRT1186
ドライバ: fsl_flexio_biss.c / .h
オシロスコープでMA(D02)とSL(D00)をモニタリング
ご指導いただければ幸いです。
@rejust様、
追記:NXP社は、この問題を解決する公式サンプルを公開しました。
AN15161 — FlexIOがMCX A366上で実装したBiSS-Cインターフェース
プロジェクト:an-mcxa366-bissc-interface-using-flexio(NXPアプリケーションコードハブ)