Autor: TorchIoTBootCamp
Link: https://zhuanlan.zhihu.com/p/339700391
De la: Quora
1. Introducere
Silicon Labs a oferit o soluție gazdă+NCP pentru proiectarea gateway-ului Zigbee. În această arhitectură, gazda poate comunica cu NCP prin interfața UART sau SPI. Cel mai frecvent, UART este folosit deoarece este mult mai simplu decât SPI.
Silicon Labs a oferit, de asemenea, un proiect exemplu pentru programul gazdă, care este eșantionulZ3GatewayHost
. Eșantionul rulează pe un sistem asemănător Unix. Unii clienți ar putea dori un eșantion de gazdă care poate rula pe un RTOS, dar, din păcate, nu există un eșantion de gazdă bazat pe RTOS pentru moment. Utilizatorii trebuie să își dezvolte propriul program gazdă bazat pe RTOS.
Este important să înțelegeți protocolul gateway-ului UART înainte de a dezvolta un program gazdă personalizat. Atât pentru NCP bazat pe UART, cât și pentru NCP bazat pe SPI, gazda utilizează protocolul EZSP pentru a comunica cu NCP.EZSPeste prescurtarea pentruProtocolul serial EmberZnet, și este definit înUG100. Pentru NCP bazat pe UART, este implementat un protocol de nivel inferior pentru a transporta datele EZSP în mod fiabil peste UART, acesta esteFRASINprotocol, prescurtare pentruGazdă serial asincronă. Pentru mai multe detalii despre ASH, vă rugăm să consultațiUG101şiUG115.
Relația dintre EZSP și ASH poate fi ilustrată prin următoarea diagramă:
Formatul de date al EZSP și al protocolului ASH poate fi ilustrat prin următoarea diagramă:
În această pagină, vom introduce procesul de încadrare a datelor UART și câteva cadre cheie care sunt utilizate frecvent în gateway-ul Zigbee.
2. Încadrare
Procesul general de încadrare poate fi ilustrat prin următorul grafic:
În acest grafic, datele înseamnă cadrul EZSP. În general, procesele de încadrare sunt: |Nu|Pas|Referință|
|:-|:-|:-|
|1|Umpleți Cadrul EZSP|UG100|
|2|Randomizarea datelor|Secțiunea 4.3 din UG101|
|3|Adăugați byte de control|Cap2 și Chap3 din UG101|
|4|Calculați CRC|Secțiunea 2.3 din UG101|
|5|Byte Stuffing|Secțiunea 4.2 din UG101|
|6|Adăugați indicatorul de sfârșit|Secțiunea 2.4 din UG101|
2.1. Umpleți Cadrul EZSP
Formatul cadrului EZSP este ilustrat în capitolul 3 din UG100.
Fiți atenți că acest format se poate schimba atunci când SDK-ul se actualizează. Când se schimbă formatul, îi vom da un nou număr de versiune. Cel mai recent număr de versiune EZSP este 8 când este scris acest articol (EmberZnet 6.8).
Deoarece formatul cadrului EZSP poate fi diferit între versiuni diferite, există o cerință obligatorie ca gazda și NCPNECESITATElucrează cu aceeași versiune EZSP. În caz contrar, ei nu pot comunica așa cum era de așteptat.
Pentru a realiza acest lucru, prima comandă dintre gazdă și NCP trebuie să fie comanda versiune. Cu alte cuvinte, gazda trebuie să recupereze versiunea EZSP a NCP-ului înainte de orice altă comunicare. Dacă versiunea EZSP este diferită de versiunea EZSP a gazdei, comunicarea trebuie întreruptă.
Cerința implicită din spatele acestui lucru este că formatul comenzii de versiune poateNU SE SCHIMBA NICIODATĂ. Formatul de comandă al versiunii EZSP este ca mai jos:
链接:https://zhuanlan.zhihu.com/p/339700391
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出注明出
2.2. Randomizarea datelor
Procesul detaliat de randomizare este descris în secțiunea 4.3 din UG101. Întregul cadru EZSP va fi randomizat. Randomizarea este la exclusiv-OR cadrul EZSP și o secvență pseudo-aleatorie.
Mai jos este algoritmul de generare a secvenței pseudo-aleatoare.
- rand0 = 0×42
- dacă bitul 0 al randi este 0, randi+1 = randi >> 1
- dacă bitul 0 al randi este 1, randi+1 = (randi >> 1) ^ 0xB8
2.3. Adăugați octetul de control
Octetul de control este o dată de un octet și ar trebui adăugat la capul cadrului. Formatul este ilustrat cu tabelul de mai jos:
În total, există 6 tipuri de octeți de control. Primele trei sunt folosite pentru cadre comune cu date EZSP, inclusiv DATE, ACK și NAK. Ultimele trei sunt utilizate fără date comune EZSP, inclusiv RST, RSTACK și ERROR.
Formatul RST, RSTACK și ERROR este descris în secțiunile 3.1 până la 3.3.
2.4. Calculați CRC
Un CRC de 16 biți este calculat pe octeți de la octetul de control până la sfârșitul datelor. Standardul CRCCCITT (g(x) = x16 + x12 + x5 + 1) este inițializat la 0xFFFF. Octetul cel mai semnificativ precede octetul cel mai puțin semnificativ (modul big-endian).
2.5. Umplutură de octeți
După cum este descris în secțiunea 4.2 din UG101, există câteva valori rezervate de octeți utilizate în scopuri speciale. Aceste valori pot fi găsite în următorul tabel:
Când aceste valori apar în cadru, se va face un tratament special datelor. – Introduceți octetul de evacuare 0x7D în fața octetului rezervat – Inversați bitul 5 al acelui octet rezervat
Mai jos sunt câteva exemple ale acestui algoritm:
2.6. Adăugați steagul de sfârșit
Pasul final este să adăugați indicatorul de final 0x7E la sfârșitul cadrului. După aceea, datele pot fi trimise la portul UART.
3. Procesul de de-framing
Când datele sunt primite de la UART, trebuie doar să facem pașii inversi pentru a le decoda.
4. Referințe
Ora postării: 08-feb-2022