著者:TorchIoTBootCamp
リンク:https://zhuanlan.zhihu.com/p/339700391
出典:Quora
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シリアルプロトコル、それは以下のように定義されています。UG100UART ベースの NCP の場合、EZSP データを UART 上で確実に伝送するための下位層プロトコルが実装されています。灰プロトコル、略して非同期シリアルホストASHの詳細については、以下を参照してください。UG101そしてUG115.
EZSPとASHの関係は、以下の図で示すことができます。
EZSPおよびASHプロトコルのデータ形式は、以下の図で示すことができます。
このページでは、UARTデータのフレーミング処理と、Zigbeeゲートウェイで頻繁に使用される主要なフレームについて説明します。
2. フレーミング
一般的なフレーミングプロセスは、以下の図で示すことができます。
このチャートでは、データはEZSPフレームを意味します。一般的に、フレーム化プロセスは次のとおりです。|番号|ステップ|参照|
|:-|:-|:-|
|1|EZSPフレームを埋める|UG100|
|2|データランダム化|UG101 のセクション 4.3|
|3|制御バイトを追加する|UG101の第2章と第3章|
|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間の最初のコマンドはバージョンコマンドでなければなりません。つまり、ホストは他の通信を行う前に、NCPのEZSPバージョンを取得する必要があります。EZSPバージョンがホスト側のEZSPバージョンと異なる場合は、通信を中止しなければなりません。
この背後にある暗黙の要件は、バージョンコマンドの形式が決して変わらない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日








