
UART: master med flera slavar - protokoll?
Re: master med flera slavar
UART-mjukvaran är korrekt. kalibreringen fungerar så att 0x80 ger 8 bitar "nolla". 9600 bps ger 104µS per bit, och 0x80 är då en 832 µS lång "nolla". Detta mäter jag med timer och dividerar tiden med 8 respektive 16 för att få tiden för halva startbiten samt tiden mellan bitarna. Har testat noga med simulator att det funkar exakt. Jag kollar också att värdet ligger inom rimliga gränser innan jag accepterar kalibreringen. Kan vara bra om kalibreringen skulle starta av misstag och sen kommer en 0x02 istället för 0x80 - det skulle bli märkliga tider... 

Re: master med flera slavar
När jag har gjort protokoll så har jag löst en del saker så här
Arbitrering (när får man sända):
Jag kör med pollning eftersom det är enkelt och robust utan en massa tidsvillkor. Nackdelen med pollning är bl.a att det är ineffektivt. För att minska det problemet så kör jag korta förfrågningar som bara betyder "har du något att sända, så gör det nu". Dessa sänds som en byte inkl. adress. I praktiken bara en adressbyte med högsta biten satt. Som svar kommer antingen en returbyte som betyder "jag har inget att sända", d.v.s ett EOT (End Of Transmission). Även detta är en ensam byte med adressen, fast med högsta biten nollad. Alternativt om noden har data att sända, så skickas ett helt datapaket inkl. start och stopptecken, adress, kommando, data och checksumma.
Vid kommunikation så hålls en lista över vilka noder som svarar. Dessa pollas i en ring (ett "skanningsvarv"). För varje skanningsvarv blir då varje närvarande nod tillfrågad om sändning. Efter ett komplett skanningsvarv så tillfrågas även en "icke-svarande" node. På detta sätt fångas tillkommande noder upp utan att ta alltför mycket skanningstid med timeouter.
"Escaping" (i brist på bättre namn):
För att alltid kunna hålla "synk" så måste specialtecken som start och sluttecken kodas om ifall dessa förekommer inom ett paket. Dessa blir då en tvåbyteskombination som hellar aldrig kan förekomma någon annanstans.
Adressering:
Valfri adresstorlek upp till 7 bitar.
Checksumma:
Jag kör numera med enbart 16-bitars CRC-checksumma. Den är överlägset mycket bättre än den enkla enbytes summeringen som jag hade tidigare. Det kräver lite mer beräkning, men med tabeller så kan det minskas rejält.
9-bitars läge på UART:en är smidigt, men kräver UART:ar med denna egenskap inbyggt. Jag har hittills hållt mig ifrån det.
Arbitrering (när får man sända):
Jag kör med pollning eftersom det är enkelt och robust utan en massa tidsvillkor. Nackdelen med pollning är bl.a att det är ineffektivt. För att minska det problemet så kör jag korta förfrågningar som bara betyder "har du något att sända, så gör det nu". Dessa sänds som en byte inkl. adress. I praktiken bara en adressbyte med högsta biten satt. Som svar kommer antingen en returbyte som betyder "jag har inget att sända", d.v.s ett EOT (End Of Transmission). Även detta är en ensam byte med adressen, fast med högsta biten nollad. Alternativt om noden har data att sända, så skickas ett helt datapaket inkl. start och stopptecken, adress, kommando, data och checksumma.
Vid kommunikation så hålls en lista över vilka noder som svarar. Dessa pollas i en ring (ett "skanningsvarv"). För varje skanningsvarv blir då varje närvarande nod tillfrågad om sändning. Efter ett komplett skanningsvarv så tillfrågas även en "icke-svarande" node. På detta sätt fångas tillkommande noder upp utan att ta alltför mycket skanningstid med timeouter.
"Escaping" (i brist på bättre namn):
För att alltid kunna hålla "synk" så måste specialtecken som start och sluttecken kodas om ifall dessa förekommer inom ett paket. Dessa blir då en tvåbyteskombination som hellar aldrig kan förekomma någon annanstans.
Adressering:
Valfri adresstorlek upp till 7 bitar.
Checksumma:
Jag kör numera med enbart 16-bitars CRC-checksumma. Den är överlägset mycket bättre än den enkla enbytes summeringen som jag hade tidigare. Det kräver lite mer beräkning, men med tabeller så kan det minskas rejält.
9-bitars läge på UART:en är smidigt, men kräver UART:ar med denna egenskap inbyggt. Jag har hittills hållt mig ifrån det.
Re: master med flera slavar
Programmerade om till 9-bitars UART häromdagen. (masterprocessorn har hårdvaru-UART och slavprocessorerna har mjukvara). Har kört ett antal miljoner 9-bitars "bytes" under natten utan ett enda fel.
Dock upptäckte jag att när jag störde linjen med avbrott så var det vanligaste felet att överförd data blev 0x1FF istället för 0xnnn. Näst vanligast verkade vara 0x1FE , Så jag kommer nog att tänka om eftersom just 0x1FF och 0x1FE var speciella adresser som skulle påverka alla slavar. Not good.
Kan vara bra att tänka på kanske. Samma fenomen borde gälla även 8-bitars UART.
Dock upptäckte jag att när jag störde linjen med avbrott så var det vanligaste felet att överförd data blev 0x1FF istället för 0xnnn. Näst vanligast verkade vara 0x1FE , Så jag kommer nog att tänka om eftersom just 0x1FF och 0x1FE var speciella adresser som skulle påverka alla slavar. Not good.
Kan vara bra att tänka på kanske. Samma fenomen borde gälla även 8-bitars UART.
Re: UART: master med flera slavar - protokoll?
Du har precis upptäckt varför jag har övergett idéen med 9-bit samt väljer att omge varje datablock med STX & ETX.