Zigbee EZSP UARTについて

著者: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 の関係は次の図で表されます。

1

EZSP および ASH プロトコルのデータ形式は、次の図で表すことができます。

2

このページでは、UART データをフレーミングするプロセスと、Zigbee ゲートウェイで頻繁に使用されるいくつかのキー フレームを紹介します。

2. フレーミング

一般的なフレーミング プロセスは次の図で表すことができます。

3

このグラフのデータはEZSPフレームを意味します。一般的に、フレーミングプロセスは以下のとおりです。|No|Step|Reference|

|:-|:-|:-|

|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 章に示されています。

4

SDKのアップグレードにより、このフォーマットは変更される可能性がありますのでご注意ください。フォーマットが変更された場合は、新しいバージョン番号が付与されます。この記事の執筆時点での最新のEZSPバージョン番号は8(EmberZnet 6.8)です。

EZSPフレームフォーマットはバージョンによって異なる場合があるため、ホストとNCPはしなければならない同じEZSPバージョンで動作する必要があります。そうでない場合、期待通りに通信できません。

これを実現するには、ホストとNCP間の最初のコマンドはバージョンコマンドである必要があります。つまり、ホストは他の通信を行う前に、NCPのEZSPバージョンを取得する必要があります。EZSPバージョンがホスト側のEZSPバージョンと異なる場合、通信を中止する必要があります。

この背後にある暗黙の要件は、バージョンコマンドの形式が決して変わらないEZSPバージョンのコマンド形式は以下のとおりです。

5

パラメータフィールドとバージョン応答のフォーマットの説明は、UG100の第4章に記載されています。パラメータフィールドは、ホストプログラムのEZSPバージョンです。この記事の執筆時点では、バージョン8です。
7
作者:TorchIoTBootCamp
链接:https://zhuanlan.zhihu.com/p/339700391
来源:知乎
著作権所有者はすべて。商用のダウンロード システムの作成者は許可を取得し、非商用のダウンロードには登録されています。

2.2. データのランダム化

詳細なランダム化プロセスはUG101のセクション4.3に記載されています。EZSPフレーム全体がランダム化されます。ランダム化は、EZSPフレームと疑似ランダムシーケンスの排他的論理和をとることで行われます。

以下は疑似乱数シーケンスを生成するアルゴリズムです。

  • ランド0 = 0×42
  • randiのビット0が0の場合、randi+1 = randi >> 1
  • randiのビット0が1の場合、randi+1 = (randi >> 1) ^ 0xB8

2.3. 制御バイトを追加する

制御バイトは1バイトのデータで、フレームの先頭に追加する必要があります。フォーマットは以下の表に示されています。

6

制御バイトは全部で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に記載されているように、特別な目的で使用される予約済みのバイト値がいくつかあります。これらの値は次の表に記載されています。

7

これらの値がフレームに現れると、データに対して特別な処理が行われます。 – 予約バイトの前にエスケープバイト0x7Dを挿入します – その予約バイトのビット5を反転します

以下にこのアルゴリズムのいくつかの例を示します。

8

2.6. 終了フラグを追加する

最後のステップは、フレームの末尾に終了フラグ0x7Eを追加することです。その後、データをUARTポートに送信できます。

3. デフレーミングプロセス

UART からデータを受信したら、逆の手順を実行してデコードするだけです。

4. 参考文献


投稿日時: 2022年2月8日
WhatsAppオンラインチャット!