Författare: TorchIoTBootCamp
Länk: https://zhuanlan.zhihu.com/p/339700391
Från: Quora
1. Introduktion
Silicon Labs har erbjudit en host+NCP-lösning för Zigbee-gatewaydesign. I denna arkitektur kan värden kommunicera med NCP:n via UART- eller SPI-gränssnitt. Vanligtvis används UART eftersom det är mycket enklare än SPI.
Silicon Labs har också tillhandahållit ett exempelprojekt för värdprogrammet, vilket är exempelprojektetZ3GatewayHost
Exemplet körs på ett Unix-liknande system. Vissa kunder kanske vill ha ett värdexempel som kan köras på ett RTOS, men tyvärr finns det inget RTOS-baserat värdexempel för närvarande. Användare måste utveckla sina egna värdprogram baserat på RTOS.
Det är viktigt att förstå UART-gatewayprotokollet innan man utvecklar ett anpassat värdprogram. För både UART-baserade NCP och SPI-baserade NCP använder värden EZSP-protokollet för att kommunicera med NCP:n.EZSPär en förkortning förEmberZnet seriellt protokoll, och det definieras iUG100För UART-baserad NCP implementeras ett protokoll på lägre lager för att tillförlitligt överföra EZSP-data över UART, det vill sägaASKAprotokoll, förkortning förAsynkron seriell värdFör mer information om ASH, seUG101ochUG115.
Sambandet mellan EZSP och ASH kan illustreras med följande diagram:
Dataformatet för EZSP och ASH-protokollet kan illustreras med följande diagram:
På den här sidan presenterar vi processen för att skapa UART-data och några nyckelbilder som ofta används i Zigbee-gatewayen.
2. Inramning
Den allmänna inramningsprocessen kan illustreras med följande diagram:
I det här diagrammet avser data EZSP-ramen. Generellt sett är ramprocesserna: |Inget|Steg|Referens|
|:-|:-|:-|
|1|Fyll EZSP-ramen|UG100|
|2|Datarandomisering|Avsnitt 4.3 i UG101|
|3|Lägg till kontrollbyte|Kapitel 2 och kapitel 3 i UG101|
|4|Beräkna CRC|Avsnitt 2.3 i UG101|
|5|Bytefyllning|Avsnitt 4.2 i UG101|
|6|Lägg till slutflaggan|Avsnitt 2.4 i UG101|
2.1. Fyll EZSP-ramen
EZSP-ramformatet illustreras i kapitel 3 i UG100.
Observera att detta format kan ändras när SDK:et uppgraderas. När formatet ändras kommer vi att ge det ett nytt versionsnummer. Det senaste EZSP-versionsnumret är 8 när den här artikeln skrivs (EmberZnet 6.8).
Eftersom EZSP-ramformatet kan skilja sig mellan olika versioner finns det ett obligatoriskt krav att värden och NCP:nMÅSTEfungera med samma EZSP-version. Annars kan de inte kommunicera som förväntat.
För att uppnå detta måste det första kommandot mellan värden och NCP:n vara versionskommandot. Med andra ord måste värden hämta EZSP-versionen av NCP:n innan någon annan kommunikation sker. Om EZSP-versionen skiljer sig från EZSP-versionen på värdsidan måste kommunikationen avbrytas.
Det implicita kravet bakom detta är att formatet för versionskommandot kanÄNDRA ALDRIGEZSP-versionens kommandoformat är som följer:
链接:https://zhuanlan.zhihu.com/p/339700391
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请泤儎凂
2.2. Datarandomisering
Den detaljerade randomiseringsprocessen beskrivs i avsnitt 4.3 i UG101. Hela EZSP-ramen kommer att randomiseras. Randomiseringen sker för att exklusivt ELLER välja EZSP-ramen och en pseudoslumpmässig sekvens.
Nedan visas algoritmen för att generera den pseudoslumpmässiga sekvensen.
- rand0 = 0×42
- Om bit 0 av randi är 0, randi+1 = randi >> 1
- Om bit 0 av randi är 1, randi+1 = (randi >> 1) ^ 0xB8
2.3. Lägg till kontrollbyten
Kontrollbyten är en byte lång data och ska läggas till i ramens huvud. Formatet illustreras med tabellen nedan:
Totalt finns det 6 typer av kontrollbyte. De tre första används för vanliga ramar med EZSP-data, inklusive DATA, ACK och NAK. De tre sista används utan vanliga EZSP-data, inklusive RST, RSTACK och ERROR.
Formaten för RST, RSTACK och ERROR beskrivs i avsnitt 3.1 till 3.3.
2.4. Beräkna CRC
En 16-bitars CRC beräknas på byte från kontrollbyten till slutet av data. Standard CRCCCITT (g(x) = x16 + x12 + x5 + 1) initieras till 0xFFFF. Den mest signifikanta byten föregår den minst signifikanta byten (big-endian-läge).
2.5. Bytefyllning
Som beskrivs i avsnitt 4.2 i UG101 finns det några reserverade bytevärden som används för speciella ändamål. Dessa värden finns i följande tabell:
När dessa värden visas i ramen kommer en särskild behandling att göras av data. – Infoga escape-byten 0x7D framför den reserverade byten – Vänd bit5 för den reserverade byten
Nedan följer några exempel på denna algoritm:
2.6. Lägg till slutflaggan
Det sista steget är att lägga till slutflaggan 0x7E i slutet av ramen. Därefter kan data skickas till UART-porten.
3. Avramningsprocessen
När data tas emot från UART:en behöver vi bara göra omvända steg för att avkoda den.
4. Referenser
Publiceringstid: 8 februari 2022