Classical CANのビットスタッフィング
受信側がペイロードとスタッフビットを区別する仕組み
スタッフィング適用領域では、送信側はバス上で同じ値のビットが5個続くと、反対の値のビットを挿入します。受信側は各フィールドを解釈する前に、そのビットを確認して除去します。まずフレーム境界を特定し、次にバス上の波形とデコードされたフレームを比較します。
挿入する
送信側は、バス上で同じ値のビットが5個続くと、反対の値のビットを挿入します。
境界を特定する
受信側は、CRCシーケンスの後で動的スタッフィングの適用を終了します。
両端で測定する
2つの銅線セグメントで同じテストフレームを比較します。
Classical CANであること、フレーム種別、公称ビットレートを確認します。
同値ビットの連続区間がスタッフィング適用領域内にあるか確認します。
生波形の遷移を、アナライザーのフレーム表示およびコントローラーのエラーと対応付けます。
トレース検証チェックリスト — 展開
| 確認項目 | 確認する内容 | 検証方法 |
|---|---|---|
| バス上のビット | 同一状態の連続 | 適用領域の先頭から数える |
| フィールド境界 | CRCシーケンスの終端 | デリミタ、ACK、EOFを特定する |
| 光ファイバーによる延長 | 観測位置 | 2つの銅線側のキャプチャを対応付ける |
CANデータをコントローラーに書き込んだ後、オシロスコープ上では、論理フレームの各フィールドの合計から想定されるよりも多くのビットが見えることがあります。この追加ビットはビットスタッフィングによるものです。Classical CANフレームの適用領域内では、同じ値のビットが5個連続すると、送信側は反対の値のビットを挿入します。受信側は同じ規則でそのビットを識別して除去し、その後に元のフィールドを解釈します。この処理は受信側によるビットタイミングの補正を助けるものであり、同じ長さのメッセージでもバス占有時間が異なる理由でもあります。
平坦な信号にもビットは存在する
高速CANの銅線バスでは、トランシーバーがコントローラーのビットをCAN_HとCAN_L間の差動状態に変換します。ドミナントビットは論理0を、リセッシブビットは論理1を表します。あるノードがドミナント状態を駆動すると、他のノードが送信するリセッシブ状態に優先できます。電気的な状態が一定でも、受信コントローラーは各ビット時間内のサンプルポイントで判定を行います。ドミナント状態の平坦部には複数のゼロが含まれることがあり、それぞれが1ビット時間を占めます。
各ノードは独自の発振器を備えています。公称ビット時間は同じ値に設定できますが、実際にはわずかな偏差が残ります。受信側はフレームの開始時にタイミングを合わせ、フレーム内では条件を満たすエッジを使って位相を補正します。適切なエッジが長時間現れないと、受信側のサンプリングと送信側のビット境界とのずれが大きくなります。スタッフィングは同値ビットの長い連続区間内に遷移を作り、同期の機会を与えます。正しくサンプリングできるかどうかは、伝搬遅延、サンプルポイントの設定、信号品質にも依存します。

送信側はバス上に送信済みのビットを数える
動的スタッフィング適用領域内の単純化したシーケンスを、連続数がゼロの状態から考えます。論理シーケンスは、5個のゼロに続いて1が1個となっています。5個目のゼロを送信した後、送信側は1を挿入し、続いて元の1を送信します。バス上には、5個のゼロ、スタッフビットの1、元の1が現れます。挿入位置はバイトの途中になることも、フィールドの終端直後になることもあります。コントローラーは連続したビットストリームを追跡し、バイト境界をまたいでカウントを継続します。
挿入されたビット自体も送信シーケンスの一部となり、新しい連続区間の起点になります。元のシーケンスで、5個のゼロの後に4個の1が続くとします。この4個の1と挿入された1によって1が5個連続するため、送信側はその後にゼロを挿入します。この規則は、元のビット5個につき1回挿入するという単純なものではありません。隣接するフィールドや、それ以前に挿入されたビットも、次の挿入タイミングに影響します。
同じ値のビットが5個続くと、受信側は次のビットが反対の状態になることを期待します。期待した値をサンプリングすると、それをスタッフビットと認識し、受信した同値ビットの連続状態を更新しますが、そのビットはフィールド解析には渡しません。その後に続く元の1は保持されます。この2個の1は、バス上では1つの連続した平坦部に見えることがあります。受信側は、位置とそれまでの連続履歴から両者の役割を区別します。

連続数のカウントが終了する位置
動的スタッフィングは、Classical CANのリモートフレームでも対象フィールドに適用されます。そのDLCは要求するデータ長を示すことができますが、フレームにはデータフィールドがありません。トレースを手作業で確認する際は、CRCシーケンスの位置を特定する前にフレーム種別を確認してください。リモートフレームのDLCを、後続するデータバイト数と解釈すると、それ以降の境界がすべてずれてしまいます。
Classical CANのデータフレームでは、動的スタッフィングはフレーム開始から始まり、アービトレーション、コントロール、データの各フィールドを経て、CRCシーケンスの終端まで適用されます。受信側は、この領域を処理しながら各フィールドの長さを追跡します。スタッフビットはバス上の所要時間を増やします。データ長コード(DLC)の本来の意味は変わりません。フィールドの論理的な配置は、オシロスコープで観測される物理的な時間区分とは異なる場合があります。
CRCシーケンスの後では、CRCデリミタ、ACKフィールド、フレーム終端はそれぞれ固有の規則に従います。それまでの動的スタッフィングのカウントは、もはや適用されません。例えば、Classical CANのフレーム終端には7個のリセッシブビットが連続して含まれます。この連続だけでスタッフエラーを示すわけではありません。平坦部がどの領域に含まれるかを判断する前に、フレーム境界とエラーフラグの有無および位置を確認してください。
送信側は、フレーム開始からデータフィールドの終端までの、スタッフィング前の論理ビットからClassical CANのCRCシーケンスを計算します。その後、送信時にはCRCシーケンスもスタッフィング対象領域に含めます。受信側は動的スタッフビットを除去し、対応するCRCチェックを実行します。したがって、符号化に伴うオーバーヘッドとフィールドの完全性チェックは、それぞれ異なる目的を持ちます。CAN FDでは、CRCフィールドに異なる規則が適用されます。適用される仕様に照らして、フレームフォーマットとコントローラー設定を確認してください。
同じデータ長でも占有時間は異なる
フレーム自体の送信時間と、メッセージが送信を待つ時間は分けて考えてください。スタッフィングは、フレーム自体がバス上で占有する時間に影響します。アービトレーションによる遅延は、その時点で他のノードが何を送信しているかによって決まります。周期メッセージでは、連続するフレーム開始ビット間の間隔と、1つのフレームの開始から終了までの時間を別々に記録してください。2つの測定値の変化は、それぞれ異なる原因を示します。
同じデータバイト数で正常に送信された、2つのClassical CANデータフレームを考えます。識別子やデータパターンは異なる場合があります。一方のフレームでは同値ビットの長い連続が繰り返され、もう一方ではゼロと1が頻繁に交互に現れることがあります。前者ではより多くのスタッフビットが必要になる可能性があり、CRCシーケンスの具体的な値もその数に影響します。同じ公称ビットレートでは、スタッフビット1個につき1ビット時間が追加されます。負荷の見積もりには、実測したバス上の長さ、または安全側に見積もった長さを使用してください。
プロトコルアナライザーのデコード表示には、通常、識別子、DLC、復元されたデータが表示されます。バス占有率を確認するには、測定の開始位置と終了位置を明確にしてください。フレームの送信時間、キューへの投入からアービトレーション成功までの待ち時間、エラー後の再送に費やす時間は、それぞれ異なる量です。境界を記録しておくことで、フレーム長の増加と競合による遅延を区別できます。
スタッフエラーが現れる領域を特定する
動的スタッフィングが適用されるフィールド内で、反対の値のビットが現れるべき位置に同じ値の6個目のビットをサンプリングすると、受信側はスタッフエラーを報告します。長い平坦部は、送信側の異常動作や、ローカル側のサンプルポイント設定、ビットレート、信号のひずみによって生じる可能性があります。エラーアクティブ状態のノードがアクティブエラーフラグを送信すると、他のノードはその後、規則に違反する長いドミナントの連続を観測する場合があります。したがって、あるログのスタッフエラーは、それ以前のエラーの結果である可能性があります。
エラー種別、最初に発生したイベント、取得できる波形を記録してください。CRCエラーは、受信側の計算結果と受信したCRCシーケンスの不一致を示します。フォームエラーは、所定の形式を持つフィールドに関係します。ACKエラーは、送信側がACKスロットで期待されるドミナントの確認応答を観測しなかったことを意味します。同じ事象の中で、これらのエラーが連続して発生することがあります。イベントを時系列に並べ、影響を受けたフィールドを確認すると、調査対象を絞り込めます。

光ファイバーでCANを延長する際は、各銅線セグメントと機器の役割を確認する
FCTELEの8チャネルDINレール型CAN光ファイバーモデムの製品資料には、CANと光ファイバー間のリピート動作、およびポイントツーポイント動作が記載されています。技術検証では、CAN銅線セグメント、光ファイバー、端末機器をそれぞれ別の観測点として列挙してください。実際の機器資料に照らして、フレームフォーマット、ビットレート、終端、配線を確認します。その後、他から切り離したテスト環境で既知のメッセージを使用し、両端での受信を確認します。図には観測点を示しています。光ファイバーを介して信号をどのように転送するかについては、該当モデルの資料を参照してください。
送信側の銅線セグメントでは信号とデコードされたフレームが安定しているのに、受信側付近で断続的なエラーが発生する場合は、反対側の状態とタイムスタンプを比較してください。ケーブル、端末機器、特定の負荷のいずれを変えると障害の発生も変わるかを確認します。メッセージ周期やその他の条件を追跡できるようにし、変数は一度に1つだけ変更してください。最終記録には、フィールドが正しく復元されたか、エラーが再発したか、経路変更後に実際のアプリケーショントラフィックが回復したかを示す必要があります。これにより、通常のスタッフィングによるオーバーヘッドと、実際の伝送障害を区別できます。
出典と適用範囲
Bosch:CANおよびCAN FDのエラー検出 · Microchip:CANのビットスタッフィングとフレームフォーマット · FCTEL DINレール型8チャネルCAN光ファイバーユニット(中国語)
以下の中国語技術記事から翻訳: 中国語の原文記事を読む.
よくある質問
同じ値のビットが5個続くとビットを挿入するのはなぜですか?
反対の値のビットは、バス上に遷移を作ります。同期条件を満たすエッジはビットタイミングの調整に使用でき、遷移がない連続区間の長さを制限します。
EOFの7個のリセッシブビットはスタッフエラーを引き起こしますか?
Classical CANのEOFは固定形式です。その7個のリセッシブビットは、動的ビットスタッフィングの適用領域外にあります。
光ファイバーリンクをまたいでスタッフエラーを追跡するにはどうすればよいですか?
両方の銅線セグメントで同じテストフレームをキャプチャし、ビットレート、サンプリング、終端を確認し、コントローラーのエラータイムスタンプを対応付け、光ファイバーユニットがトラフィックをどのように転送するかを確認してください。


