CANバスの調停について多くのことを読みましたが、私の質問には答えられませんでした。
あるノードがすでにバス上でデータを送信していて、別のノード間でデータ転送を開始したい場合、その「別のノード」はバスがビジーであることをどのようにして知るのでしょうか。
すべてのドキュメント(私が読んだ)は、両方のノードが同時に送信を開始し、最初のドミナントビットを持つバスがバスを取得するという条件を採用していますが、知りたい条件については誰も説明していません。
CANバスの調停について多くのことを読みましたが、私の質問には答えられませんでした。
あるノードがすでにバス上でデータを送信していて、別のノード間でデータ転送を開始したい場合、その「別のノード」はバスがビジーであることをどのようにして知るのでしょうか。
すべてのドキュメント(私が読んだ)は、両方のノードが同時に送信を開始し、最初のドミナントビットを持つバスがバスを取得するという条件を採用していますが、知りたい条件については誰も説明していません。
回答:
短い答えは、ノードが送信を試みる前に、ノードがCANラインを監視して一定時間アイドル状態にする必要があるということです。したがって、別のノードが送信している場合は、他のノードが完了するまで静かに保つ必要があります。
CANバスは差動信号に基づいています。CAN-High(CAN +)とCAN-Low(CAN-)の2つのラインは、バスがアイドル状態のときに同じ電位になります。ビットを送信するために、CANトランスミッターは約2ボルトのラインに差動電圧をかけます。
CANトランスミッターは、バスがアイドルかどうかを最初に確認し、アイドルの場合は送信を開始します。アービトレーションの仕組みは、トランスミッターがバスの送信を監視することです。伝送は、2つのラインを同じ電位または差動電位に保つことにより、上記のように行われます。したがって、トランスミッタがラインを同じ電位(sic)に保つことによってビットを送信するが、2つの送信ラインが差動電位を持っていることがわかる場合、他のノードが送信していて、最初のトランスミッタがアービトレーションを失ったことを意味します。その後、送信を停止する必要があります。
ノードが最初に送信を開始するとき、送信されるビットは、明らかに異なる送信ノードのアドレスまで同じです。2つのノードが一緒に送信を開始すると、アドレス部分に到達するまで同期して送信されます。アドレスが異なる場合、ノードはラインに電位差を付けていなくても、ラインの電位差に気づきます。次に、それが失われたことを認識し、再試行する必要があります。勝ったノードは、他のノードが同様に試みていることを知らずに送信を続けます。もちろん、このロジックは3つ以上のノードにも拡張されます。
これがお役に立てば幸いです。
私はそれを解決する2つの方法を知っています:
まず、CANコントローラは常にバスを監視します。バス上でメッセージを検出すると、受信プロセスを開始します。これで受信状態になり、送信が要求されたときにバスが使用中であることがわかります。
第2に、ビットスタッフィングにより、CANトランシーバーは5ビット以上同じビットを持ちません(バスエラーが検出されない限り、その場合、最大12のドミナントビットが連続して表示されます)。これの例外は、パッシブビットが常に読み取られるときに、バス上で何も送信されていない場合です。開始したばかりのコントローラーは、「おそらく空いている」と宣言する前に、5サイクルバスをリッスンできます。
これらが実際のプロセスであることは保証しませんが、CANに関する私の(限られた)知識に基づいて、これらが機能することを保証します。
CoderTaoが言うように-CANコントローラはバスを継続的に監視しているため、送信がすでに進行中であることがわかります。したがって、衝突が発生する可能性があるのは、両方のノードが「同時」に送信を開始するとき、つまり互いのビット時間内(+バス伝搬のための追加の追加時間)だけです。したがって、それらはあなたがドキュメントで見つけた唯一のケースです:)
ノードアドレスは優先順位を決定し、下位のアドレスは優先順位が高くなります。送信は、ノードがそのアドレスをブロードキャストすることから始まります。送信と同時に聴く。ノード3と2が同時に送信するとします。アドレスの最後のビットとして、ノード3は1をブロードキャストし、ノード2は0をブロードキャストします。0のため、データラインは0状態にプルダウンされます。ノード3は、ブロードキャストする1ではなく、回線が0であり、送信を停止することを確認します。
CANは最初、自動車やトラックで使用されました。一部のセンサーは、他のセンサーよりもはるかに高い優先順位を持つ必要がありました。たとえば、アンチスキッドブレーキは、低風防ガラスのウォッシャー液よりも優先する必要がありました。
CANコントローラーには、アイドルバス状態を検出できるようにする4つの重要な要素があります。
ワイヤードANDシグナリングにより、ノードの1つによって送信されたドミナントビットが、リセッシブビットを同時に送信する他のすべてのノードによって検出されることが可能になります。したがって、リセッシブビットを送信するノードがバスのドミナント状態を検出すると、バスがビジーであることがわかります。
ビットスタッフィングにより、同一の連続ビットが5つ以下になるようにします。単独で、ビットスタッフィングは同期を維持するために使用されます。ただし、その副作用は、CRCデリミタまでのフレームビット内で5つ以下の連続劣性ビットが発生する可能性があることです。
フレームの終わりは、フレームの終わりにある一連の7つの劣性ビットです。これらはビットが詰め込まれていないため、コントローラで簡単に検出できます。EOFはフレームの一部と見なされるため、この期間中はバスはまだアイドル状態ではないことに注意してください。
フレーム間スペースは、フレーム間の一連の3つの劣性インターミッションビットであり、その後にバスアイドル状態が続きます。エラーまたは過負荷のフレームを送信したくない場合を除き、ノードは、中断中に送信を開始することはできません。さらに、最後のフレームを送信したノードは、別の送信を開始する前に、中断後に8つのリセッシブサスペンド送信ビットも送信する必要があります。この最後の要件により、他のノードが保留中のメッセージの送信を開始できるため、ノードが無期限に「バスを占有」することはできません。
上記のすべてから、ノードがアイドルバス状態を検出する方法を次に示します。
受信ノード は、EOFと中断を含む10個の連続したリセッシブビットを待つだけです。その後、彼らはバスがアイドルであると考えて、彼ら自身の送信を始めることを試みることができます。
送信ノードは、 送信した最後のフレームのEOFの後に、11個の連続した劣性ビットを送信します。この間に他のノードが送信を開始しない場合、バスはアイドルであると見なされ、別の送信の開始を試みることができます。この間にドミナントビットが検出された場合、ノードはレシーバーになります。
上記の情報とビットタイミングに関する追加情報は、BOSCHが開発したCAN仕様に記載されています。
特定のノードは送信期間の後にのみ送信を開始します(この期間はSUSPENDED期間とも呼ばれます。この期間では、バスへのDATA / REMOTEフレームの送信後に3つの劣性ビットがバスに送信されます。これは、BUSがIDLE状態の場合)、この期間中、どのノードも送信を開始しないためです。バスがアイドル状態になった後、バスに送信を要求するノードはアービトレーションに入ります。
バスへのフレーム間スペースの送信後、CANネットワークに存在するノードは送信を開始しようとします。したがって、特定のノードはバスがビジーかどうかを認識しています。