GNU/Linux >> Linux の 問題 >  >> Linux

SPI クロックのデューティ サイクルが変化するのは正常ですか?

クロック ジッタではなく、キャプチャにエイリアシングが見られます。これは、ジョブに不適切なツールが使用されている場合です。

2Mhz クロックの周期は 500ns であるため、250ns の間ハイになります。 16Mhz ロジック アナライザでは、62.5ns ごとにサンプルを取得しているため、理想的には、4 つの高サンプルと 4 つの低サンプルの繰り返しが見られます。

ここで、CPU オシレータのわずか 0.5% の周波数差の影響を考えてみましょう。したがって、SPI バスまでの分周器ネットワークは 251.25ns の周期で実行されます。注:周波数は時間の経過とともにドリフトしません。これは依然として理想的な水晶ですが、キャプチャしようとしている波形は、キャプチャ クロック 62.5ns の正確な倍数ではなくなりました。これにより、4/4、3/5、4/4、5/3、... のパターンでエイリアシングが得られ、2 つのクロック間の位相関係がドリフト インおよびドリフト アウトするのを観察しながら、キャプチャのハイ/ロー比として使用できます。

アナライザーは SPI 信号 (ナイキスト以上など) をキャプチャするのには適していますが、クロックの安定性を判断するには適していません。そのためには、一方のエッジでトリガーされたスコープを使用してもう一方のエッジの安定性を確認し、校正済みの周波数カウンターを使用して絶対周波数を確認してください。


SPI は同期プロトコルであるため、特定の時点での正確な周波数は問題ではありません。すべてがクロックのエッジに合わせられているため、エッジ間の正確なタイミングは実際には問題ではありません - もちろん、デバイスの制限内です.


SPI 信号を生成する方法はいくつかあります。場合によっては、プロセッサの介入なしに、特定の範囲のメモリの内容を SPI ポートに送信するように指示できるデバイスがハードウェアになります。このような場合、8 回ごとに「一時停止」が発生する可能性はありますが、通常はクロック パルスのシーケンスが均一になります。場合によっては、プロセッサは、シフトされるバイトの「事前に」少なくとも 1 バイトを受け入れることができるシフターに各バイトをロードする必要があります。これらの場合の出力は、多くの場合、純粋なハードウェアの場合と同じように見えますが、現在のバイトがシフトアウトされる前にソフトウェアが次のバイトのロードに失敗することがある場合、8 クロックの倍数の後にランダムなギャップが発生することがあります。発生しない可能性があるプロセッサのタイミング。上記の場合、スコープで遅延トリガー関数を使用すると、定期的にフォーマットされたデータを調べるときに役立つ場合があります。これは、すべてがフレームの開始に対して一貫した時間で常に (またはほぼ常に) 発生するためです。

ただし、物事は常にそれほど良いとは限りません。デバイスが 8 ビットを自動的に送信できるハードウェアを備えていることはかなり一般的ですが、8 ビットの 1 つのグループが送信されるまで待機してから次のグループをキューに入れる必要があります。これにより、一定の間隔で配置された 8 つのクロック パルスのグループが作成され、その間にランダムな間隔が空けられます。これにより、遅延スイープ機能の使用が妨げられることがよくありますが、逆に、すべてのパルスが均一である場合よりも、各バイトの開始と終了の識別が容易になることがよくあります。最後の可能性は、ソフトウェアが一連の「set port high」および「set port low」コマンドを使用して SPI 信号を生成している可能性があることです。上記のサンプルでは、​​それが起こっているように見えます。

ほとんどの場合、SPI バス上のマスター デバイス (この場合は RasPi) は、長パルスと短パルスを任意に組み合わせて自由に使用できます。多くの場合、最小値を数桁上回っています (たとえば、デバイスの最小パルス幅とパルス間隔はそれぞれ 250ns ですが、パルス間の最大時間は 1ms で、3 桁以上の差があります)。パルス時間が非常に広く描かれた制限内にとどまる場合 (多くの場合、最大制限はありません)、通信は信頼できるはずです。

SPI でデータ損失が発生する可能性があるのは、スレーブ デバイスがプロセッサの場合のみです。多くの CPU に組み込まれている SPI スレーブ ハードウェアでは、バイトが到着すると、プロセッサはマスターが起動する前に動作する必要があります。 データの損失を避けるために次のバイトを送信しますが、スレーブがマスターに準備ができていることを伝える手段を提供しません。その結果、スレーブは多くの場合、マスターと通信するために 5 つのライン (クロック、MOSI、MISO、CS、および手動で実装された「準備完了」ライン) を使用するか、マスターが各バイトの後に十分な遅延を追加する必要があります。スレーブの最悪の場合の応答時間。


Linux
  1. [解決済み]:仮想マシンのクロックがホストマシンと同期するのを防ぎ、独立したクロック時間を設定するにはどうすればよいですか?

  2. 「名前の変更」を使用して小文字の拡張子を持つようにファイルの名前を変更しますか?

  3. Linux – Ioniceは、同期されていない書き込み(つまり、通常の書き込み)に影響を与えませんか?

  1. Ddでバイナリにパッチを適用しますか?

  2. 指定されたファイル名のファイルが内部にないすべてのディレクトリを一覧表示しますか?

  3. Ubuntuはタッチスクリーン機能を備えたラップトップと互換性がありますか?

  1. C の clock() が 0 を返す理由

  2. パスワードなしの sudo を持つ ansible ユーザーを持つことは安全ではありませんか?

  3. RAM で rootfs を使用して Linux を起動するにはどうすればよいですか?