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, se utilizează UART, deoarece este mult mai simplu decât SPI.
Silicon Labs a furnizat, de asemenea, un proiect exemplu pentru programul gazdă, care este exemplulZ3GatewayHost
Exemplul rulează pe un sistem de tip Unix. Unii clienți ar putea dori un exemplu de gazdă care poate rula pe un RTOS, dar din păcate, deocamdată nu există un exemplu de gazdă bazat pe RTOS. Utilizatorii trebuie să își dezvolte propriul program gazdă bazat pe RTOS.
Este important să înțelegeți protocolul gateway 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 o prescurtare pentruProtocolul serial EmberZnet, și este definit înUG100Pentru NCP bazat pe UART, este implementat un protocol de nivel inferior pentru a transporta datele EZSP în mod fiabil prin UART, acesta fiindFRASINprotocol, 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 datelor protocolului EZSP și ASH poate fi ilustrat prin următoarea diagramă:
În această pagină, vom introduce procesul de încadrare a datelor UART și câteva cadre cheie utilizate frecvent în gateway-ul Zigbee.
2. Încadrare
Procesul general de încadrare poate fi ilustrat prin următoarea diagramă:
În această diagramă, datele se referă la cadrul EZSP. În general, procesele de încadrare sunt: |Fără|Pas|Referință|
|:-|:-|:-|
|1|Umpleți cadrul EZSP|UG100|
|2|Randomizarea datelor|Secțiunea 4.3 din UG101|
|3|Adăugați octetul de control|Capitolul 2 și Capitolul 3 din UG101|
|4|Calculați CRC|Secțiunea 2.3 din UG101|
|5|Umplere cu octeți|Secțiunea 4.2 din UG101|
|6|Adăugați steagul de sfârșit|Secțiunea 2.4 din UG101|
2.1. Completați cadrul EZSP
Formatul cadrului EZSP este ilustrat în Capitolul 3 din UG100.
Atenție, acest format se poate modifica odată cu actualizarea SDK-ului. Când formatul se schimbă, îi vom atribui un nou număr de versiune. Cel mai recent număr de versiune EZSP este 8 la momentul scrierii acestui articol (EmberZnet 6.8).
Întrucât formatul cadrului EZSP poate fi diferit între versiuni diferite, există o cerință obligatorie ca gazda și NCP-ulNECESITATEfuncționează cu aceeași versiune EZSP. Altfel, 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 version. Cu alte cuvinte, gazda trebuie să preia versiunea EZSP a NCP î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 ca formatul comenzii de versiune să poatăNU SE SCHIMBA NICIODATĂFormatul comenzii pentru versiunea EZSP este următorul:
链接:https://zhuanlan.zhihu.com/p/339700391
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出注明出
2.2. Randomizarea datelor
Procesul detaliat de randomizare este descris în secțiunea 4.3 a UG101. Întregul cadru EZSP va fi randomizat. Randomizarea se face prin utilizarea operației SAU exclusive între cadrul EZSP și o secvență pseudo-aleatoare.
Mai jos este prezentat 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 cantitate de date de un octet și trebuie adăugat la începutul cadrului. Formatul este ilustrat în tabelul de mai jos:
În total, există 6 tipuri de octeți de control. Primii trei sunt utilizați pentru cadre comune cu date EZSP, inclusiv DATA, ACK și NAK. Ultimii trei sunt utilizați fără date EZSP comune, inclusiv RST, RSTACK și ERROR.
Formatul parametrului RST, RSTACK și ERROR este descris în secțiunile 3.1 până la 3.3.
2.4. Calculați CRC-ul
Un CRC pe 16 biți este calculat pe octeți de la octetul de control până la sfârșitul datelor. CRCCCITT standard (g(x) = x16 + x12 + x5 + 1) este inițializat la 0xFFFF. Cel mai semnificativ octet precede octetul cel mai puțin semnificativ (mod big-endian).
2.5. Umplerea cu octeți
Așa cum este descris în secțiunea 4.2 a UG101, există anumite valori rezervate în octeți, utilizate în scopuri speciale. Aceste valori pot fi găsite în tabelul următor:
Când aceste valori apar în cadru, datele vor fi tratate special. – Se introduce octetul de escape 0x7D în fața octetului rezervat – Se inversează 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 adăugarea indicatorului de sfârșit 0x7E la sfârșitul cadrului. După aceea, datele pot fi trimise către portul UART.
3. Procesul de deframare
Când primim date de la UART, trebuie doar să parcurgem pașii inversi pentru a le decoda.
4. Referințe
Data publicării: 08 februarie 2022