CANバスが無料かどうかの確認方法


8

CANバスの調停について多くのことを読みましたが、私の質問には答えられませんでした。

あるノードがすでにバス上でデータを送信していて、別のノード間でデータ転送を開始したい場合、その「別のノード」はバスがビジーであることをどのようにして知るのでしょうか。

すべてのドキュメント(私が読んだ)は、両方のノードが同時に送信を開始し、最初のドミナントビットを持つバスがバスを取得するという条件を採用していますが、知りたい条件については誰も説明していません。


1
スワナンド、あなたが答えを受け入れるのにもう少し待てば、あなたはあなたの質問により良い答えを得るかもしれません。これは国際的なコミュニティであり、一部の専門家はすぐに対応できない場合があります。
W5VO 2011年

@ W5VO次回は覚えておきます!提案をありがとう!:)
スワナンド'31年

回答:


10

短い答えは、ノードが送信を試みる前に、ノードがCANラインを監視して一定時間アイドル状態にする必要があるということです。したがって、別のノードが送信している場合は、他のノードが完了するまで静かに保つ必要があります。

CANバスは差動信号に基づいています。CAN-High(CAN +)とCAN-Low(CAN-)の2つのラインは、バスがアイドル状態のときに同じ電位になります。ビットを送信するために、CANトランスミッターは約2ボルトのラインに差動電圧をかけます。

CANトランスミッターは、バスがアイドルかどうかを最初に確認し、アイドルの場合は送信を開始します。アービトレーションの仕組みは、トランスミッターがバスの送信を監視することです。伝送は、2つのラインを同じ電位または差動電位に保つことにより、上記のように行われます。したがって、トランスミッタがラインを同じ電位(sic)に保つことによってビットを送信するが、2つの送信ラインが差動電位を持っていることがわかる場合、他のノードが送信していて、最初のトランスミッタがアービトレーションを失ったことを意味します。その後、送信を停止する必要があります。

ノードが最初に送信を開始するとき、送信されるビットは、明らかに異なる送信ノードのアドレスまで同じです。2つのノードが一緒に送信を開始すると、アドレス部分に到達するまで同期して送信されます。アドレスが異なる場合、ノードはラインに電位差を付けていなくても、ラインの電位差に気づきます。次に、それが失われたことを認識し、再試行する必要があります。勝ったノードは、他のノードが同様に試みていることを知らずに送信を続けます。もちろん、このロジックは3つ以上のノードにも拡張されます。

これがお役に立てば幸いです。


1
いい答えです!私が正しく覚えているとすれば、「1」よりも「0」を送信するほうが優勢であり、その結果、最も低いアドレスが調停に勝ちます。これの優れた機能は、失われたノードが停止するはずのときに停止した場合、バス上のデータの破損がないことです。
W5VO 2011年

素晴らしい答え!これを片付けることができれば最も感謝します。3番目のビットに到達したときに、最初のトランスミッタが「1」を送信し、2番目のトランスミッタが「0」を送信しているときに、識別子が「1011001」と「1000110」であるとします。CANプロトコルに従って、ドミナントビットは0であり、リセッシブビットを上書きします。したがって、バスは「0」を保持します。最初のモジュールはこれを検出して送信を停止し、2番目のモジュールは送信を続けます。私の理解は正しいですか?
Febin Sunny、2016

@FebinSunnyはい...あなたの言ったことは正しいです!
スワナンド2017年

1
この答えは「良い」でも「素晴らしい」でもありません。実際、それは完全に間違っています。第1に、トランスミッタはリセッシブビットを送信するために「2つのラインを同じ電位に保ちませ」。それは単にラインを引き離すのをやめ、終端抵抗は電位を等しくします。第2に、送信ノードのアドレスはCAN仕様のアービトレーションフィールドの一部ではありませんが、一部の高レベルのCANベースのプロトコルはメッセージIDの一部として使用します。3番目に、これはアイドルバスの検出とは関係ありません
Maple

7

私はそれを解決する2つの方法を知っています:

まず、CANコントローラは常にバスを監視します。バス上でメッセージを検出すると、受信プロセスを開始します。これで受信状態になり、送信が要求されたときにバスが使用中であることがわかります。

第2に、ビットスタッフィングにより、CANトランシーバーは5ビット以上同じビットを持ちません(バスエラーが検出されない限り、その場合、最大12のドミナントビットが連続して表示されます)。これの例外は、パッシブビットが常に読み取られるときに、バス上で何も送信されていない場合です。開始したばかりのコントローラーは、「おそらく空いている」と宣言する前に、5サイクルバスをリッスンできます。

これらが実際のプロセスであることは保証しませんが、CANに関する私の(限られた)知識に基づいて、これらが機能することを保証します。


セカンドトリックが好き!それは純粋に論理的で素晴らしいです!
スワンナン、2011年

2
バスアービトレーションの主要なポイントを見逃しています。CANパケットの最初の要素はアドレスです。
W5VO 2011年

1
それは本当に彼の質問ではありませんでした。問題は、コントローラーがバス上にアクティビティがあるかどうかをどのように判断するか
でした

@ W5VO CANフレームには、一部の上位レベルのプロトコルがメッセージIDの一部にならない限り、アドレスはありませ
メープル

@CoderTaoビットスタッフィングはコントローラーがアイドルバスを検出する方法ではありませんが、送信されたデータをフレームの終わりと間違えないようにすることにより、このプロセスで重要な役割を果たすという点で正しいです
Maple

3

CoderTaoが言うように-CANコントローラはバスを継続的に監視しているため、送信がすでに進行中であることがわかります。したがって、衝突が発生する可能性があるのは、両方のノードが「同時」に送信を開始するとき、つまり互いのビット時間内(+バス伝搬のための追加の追加時間)だけです。したがって、それらはあなたがドキュメントで見つけた唯一のケースです:)


2

ノードアドレスは優先順位を決定し、下位のアドレスは優先順位が高くなります。送信は、ノードがそのアドレスをブロードキャストすることから始まります。送信と同時に聴く。ノード3と2が同時に送信するとします。アドレスの最後のビットとして、ノード3は1をブロードキャストし、ノード2は0をブロードキャストします。0のため、データラインは0状態にプルダウンされます。ノード3は、ブロードキャストする1ではなく、回線が0であり、送信を停止することを確認します。

CANは最初、自動車やトラックで使用されました。一部のセンサーは、他のセンサーよりもはるかに高い優先順位を持つ必要がありました。たとえば、アンチスキッドブレーキは、低風防ガラスのウォッシャー液よりも優先する必要がありました。


私はすでにこれを知っています。...私の質問は、開始時の仲裁についてではありませんでした...それは送信の合間にありました...
スワナンド

1

CANコントローラーには、アイドルバス状態を検出できるようにする4つの重要な要素があります。

  • ワイヤードANDシグナリングにより、ノードの1つによって送信されたドミナントビットが、リセッシブビットを同時に送信する他のすべてのノードによって検出されることが可能になります。したがって、リセッシブビットを送信するノードがバスのドミナント状態を検出すると、バスがビジーであることがわかります。

  • ビットスタッフィングにより、同一の連続ビットが5つ以下になるようにします。単独で、ビットスタッフィングは同期を維持するために使用されます。ただし、その副作用は、CRCデリミタまでのフレームビット内で5つ以下の連続劣性ビットが発生する可能性があることです。

  • フレームの終わりは、フレームの終わりにある一連の7つの劣性ビットです。これらはビットが詰め込まれていないため、コントローラで簡単に検出できます。EOFはフレームの一部と見なされるため、この期間中はバスはまだアイドル状態でないことに注意してください。

  • フレーム間スペースは、フレーム間の一連の3つの劣性インターミッションビットであり、その後にバスアイドル状態が続きます。エラーまたは過負荷のフレームを送信したくない場合を除き、ノードは、中断中に送信を開始することはできません。さらに、最後のフレームを送信したノードは、別の送信を開始する前に、中断後に8つのリセッシブサスペンド送信ビットも送信する必要があります。この最後の要件により、他のノードが保留中のメッセージの送信を開始できるため、ノードが無期限に「バスを占有」することはできません。

上記のすべてから、ノードがアイドルバス状態を検出する方法を次に示します。

  • 受信ノード は、EOFと中断を含む10個の連続したリセッシブビットを待つだけです。その後、彼らはバスがアイドルであると考えて、彼ら自身の送信を始めることを試みることができます。

  • 送信ノードは、 送信した最後のフレームのEOFの後に、11個の連続した劣性ビットを送信します。この間に他のノードが送信を開始しない場合、バスはアイドルであると見なされ、別の送信の開始を試みることができます。この間にドミナントビットが検出された場合、ノードはレシーバーになります。

上記の情報とビットタイミングに関する追加情報は、BOSCHが開発したCAN仕様に記載されています。


複数のアクティブノードを持つバスがあります。通信が行われていないときに新しいノードが接続されました。この新しいノードは、バスがアイドルであることをどのようにして知るのでしょうか。この新しいノードが表示されなかった場合、10個の連続した劣性ビットが送信されます。
スワナンド2018年

「ワイヤードANDシグナリング」は、劣性ビットが「送信」されないことを意味します。つまり、送信ノードがドミナントポテンシャルをアクティブに生成しないことを意味します。しかし、それらは受信されます。つまり、受信ノードはビット間隔でバスをサンプリングし、ライン上で劣性ビットを検出します。したがって、この新しいノードがバスを10回サンプリングし、バスがアイドルであると見なすたびにリセッシブビットが表示される場合。
Maple

「この新しいノードが表示されなかったときに送信された連続する10個の劣性ビット」と、その後のバスのアイドル状態との間に違いはありません。通信がない場合、バスの読み取りはリセッシブビット( "1")を返します。したがって、最後のドミナントビット中またはその後にサンプリングを開始するタイミングは重要ではありません。受信機が10ビットを見ている限り、送信を開始できます。ところで、誰も10ビットを送信しません。最後のトランスミッタは、11個の劣性ビット、3つの中断+ 8つの中断を「送信」します。待機中のノードが10日後に送信を開始すると、最後のトランスミッターはアービトレーションを失い、バスを新しいノードに譲ります。
Maple

0

特定のノードは送信期間の後にのみ送信を開始します(この期間はSUSPENDED期間とも呼ばれます。この期間では、バスへのDATA / REMOTEフレームの送信後に3つの劣性ビットがバスに送信されます。これは、BUSがIDLE状態の場合)、この期間中、どのノードも送信を開始しないためです。バスがアイドル状態になった後、バスに送信を要求するノードはアービトレーションに入ります。

バスへのフレーム間スペースの送信後、CANネットワークに存在するノードは送信を開始しようとします。したがって、特定のノードはバスがビジーかどうかを認識しています。


もしそれがバスの最初の送信になるとしたら?その場合、「休憩期間」はありません。詳細は@Docの回答を参照してください。
スワナンド2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.