著者:TorchIoTBootCamp
リンク:https://zhuanlan.zhihu.com/p/339700391
From:クオラ
1. はじめに
Silicon Labs は、Zigbee ゲートウェイ設計用のホスト + NCP ソリューションを提供しました。このアーキテクチャでは、ホストは UART または SPI インターフェイスを介して NCP と通信できます。最も一般的には、SPI よりもはるかに単純な UART が使用されます。
Silicon Labs は、ホスト プログラム用のサンプル プロジェクトも提供しています。Z3ゲートウェイホスト
。サンプルは Unix のようなシステム上で実行されます。一部の顧客は RTOS 上で実行できるホスト サンプルを必要としているかもしれませんが、残念ながら、現時点では RTOS ベースのホスト サンプルはありません。ユーザーはRTOSに基づいて独自のホストプログラムを開発する必要があります。
カスタマイズされたホスト プログラムを開発する前に、UART ゲートウェイ プロトコルを理解することが重要です。 UART ベースの NCP と SPI ベースの NCP の両方の場合、ホストは EZSP プロトコルを使用して NCP と通信します。EZSPの略ですEmberZnet シリアル プロトコルで定義されています。UG100。 UART ベースの NCP の場合、UART 経由で EZSP データを確実に伝送するために下位層プロトコルが実装されています。灰プロトコルの略称非同期シリアルホスト。 ASH について詳しくは、こちらをご覧ください。UG101そしてUG115.
EZSP と ASH の関係は、次の図で示すことができます。
EZSP と ASH プロトコルのデータ形式は、次の図で示すことができます。
このページでは、UART データをフレーム化するプロセスと、Zigbee ゲートウェイで頻繁に使用されるいくつかのキー フレームを紹介します。
2. フレーミング
一般的なフレーム化プロセスは、次の図で説明できます。
このチャートでは、データは EZSP フレームを意味します。一般に、フレーミング プロセスは次のとおりです。 |いいえ|ステップ|参照|
|:-|:-|:-|
|1|EZSP フレームを埋める|UG100|
|2|データのランダム化|UG101 のセクション 4.3|
|3|制御バイトを追加|UG101 の Chap2 および Chap3|
|4|CRC の計算|UG101 のセクション 2.3|
|5|バイト スタッフィング|UG101 のセクション 4.2|
|6|終了フラグを追加|UG101 のセクション 2.4|
2.1. EZSP フレームを埋める
EZSP フレーム フォーマットは、UG100 の第 3 章に示されています。
SDK がアップグレードされると、この形式が変更される可能性があることに注意してください。形式が変更されると、新しいバージョン番号が付けられます。この記事の執筆時点における EZSP の最新バージョン番号は 8 (EmberZnet 6.8) です。
EZSP フレーム形式はバージョンごとに異なる場合があるため、ホストと NCP が一致するという必須要件があります。しなければならない同じ EZSP バージョンで動作します。そうしないと、期待どおりに通信できません。
これを実現するには、ホストと NCP の間の最初のコマンドが version コマンドである必要があります。つまり、ホストは他の通信を行う前に、NCP の EZSP バージョンを取得する必要があります。 EZSP バージョンがホスト側の EZSP バージョンと異なる場合、通信を中止する必要があります。
この背後にある暗黙の要件は、version コマンドの形式が決して変更しないでください。 EZSP版のコマンド形式は以下のとおりです。
链接:https://zhuanlan.zhihu.com/p/339700391
来源:知乎
著作権所有者はすべて。市販のダウンロード システムの作成者は許可を取得し、非市販のダウンロードには登録されています。
2.2.データのランダム化
ランダム化プロセスの詳細については、UG101 のセクション 4.3 で説明されています。 EZSP フレーム全体がランダム化されます。ランダム化は、EZSP フレームと擬似ランダム シーケンスの排他的論理和をとります。
以下は、擬似ランダムシーケンスを生成するアルゴリズムです。
- rand0 = 0×42
- randi のビット 0 が 0 の場合、randi+1 = randi >> 1
- randi のビット 0 が 1 の場合、randi+1 = (randi >> 1) ^ 0xB8
2.3.制御バイトを追加する
コントロールバイトは1バイトのデータであり、フレームの先頭に付加されます。形式を以下の表に示します。
制御バイトは全部で 6 種類あります。最初の 3 つは、DATA、ACK、NAK などの EZSP データを含む共通フレームに使用されます。最後の 3 つは、RST、RSTACK、ERROR など、共通の EZSP データなしで使用されます。
RST、RSTACK、ERROR のフォーマットについてはセクション 3.1 ~ 3.3 で説明します。
2.4. CRCを計算する
16 ビット CRC は、制御バイトからデータの終わりまでのバイトに対して計算されます。標準の CRCCCITT (g(x) = x16 + x12 + x5 + 1) は 0xFFFF に初期化されます。最上位バイトは最下位バイトよりも前に配置されます (ビッグエンディアン モード)。
2.5.バイトスタッフィング
UG101 のセクション 4.2 で説明されているように、特別な目的に使用される予約されたバイト値がいくつかあります。これらの値は次の表にあります。
これらの値がフレームに表示されると、データに対して特別な処理が行われます。 – エスケープバイト 0x7D を予約バイトの前に挿入します。 – その予約バイトのビット 5 を反転します。
以下に、このアルゴリズムの例をいくつか示します。
2.6.終了フラグを追加する
最後のステップは、フレームの最後に終了フラグ 0x7E を追加することです。その後、データを UART ポートに送信できるようになります。
3. デフレームプロセス
UART からデータを受信したら、逆の手順を実行してデータをデコードするだけです。
4. 参考文献
投稿日時: 2022 年 2 月 8 日