Vad är en UART? Beteckningen UART är en förkortning för det engelska uttrycket Universal Asynchronous Receiver Transmitter, vilket översatt till svenska blir ungefär Universell Asynkron Mottagare/Sändare. Fortfarande konfunderad? OK, då ska jag försöka bringa lite klarhet i vad det hela handlar om! Låt oss börja från början med att titta lite allmänt på digitala signaler. I en binär digital signal föreligger informationen i två diskreta nivåer, t ex som hög eller låg signalnivå (ofta kallad "etta" eller "nolla"). Vanliga signalnivåer för standard logikkretsar i TTLfamiljen är +5V eller 0V. Ska man vara riktigt petnoga utgörs "ettan" av spänningar mellan +2.4V och +5V och nollan av spänningar mellan 0 och +0,4V, detta för att medge visst utrymme för variationer. Dessa variationer kan uppstå genom skillnader mellan processer vid kretstillverkningen, varierande temperatur och matningsspänning etc. Man skiljer mellan parallella och seriella binära digitala signaler. Hos en parallell signal finns alla bitar samtidigt tillgängliga och det går alltså åt lika många ledningar som det finns bitar i det binära datat. Figuren visar en uppsättning strömbrytare inställda så att datat 01100111 alstras. Utsignalen som består av UT0, UT1, UT2, UT3, UT4, UT5, UT6 och UT7 är en parallell åttabitars signal, alla åtta bitarna i datat finns ju tillgängliga samtidigt. De åtta motstånden kallas "pull-up-motstånd" och ser till att respektive utsignal hamnar på +5V när motsvarande strömbrytare är öppen. Om en strömbrytare är sluten hamnar respektive utsignal på 0V. Om vi antar att strömbrytarna representerar ett 8-bitars binärt tal kallas UT7 för mest signifikant bit och UT0 minst signifikant bit. Ofta används de engelska förkortningarna MSB (most significant bit) för mest signifikant bit och LSB (least significant bit ) för minst signifikant bit. 1
Fotot visar hur det kan se ut i verkligheten. De åtta strömbrytarna sitter samlade längst nere till höger i en enda komponent, en s k DIP-switch. De åtta pull-upmotstånden är också samlade i en enda komponent, som syns alldeles ovanför DIPswitchen. En pil markerad ON, till vänster på DIP-switchen, anger i vilken position strömbrytarna är slutna. För att ställa in en "nolla" i en viss position ska alltså respektive strömbrytare skjutas uppåt, mot motståndet. Fotot visar samma inställning som ritats i schemat på föregående sida, alltså det binära talet 01100111. Det parallella datat finns tillgängligt på det grå kontaktdonet längst upp i bilden. En seriell binär digital signal använder däremot endast en enda ledning för datat, oberoende av hur många bitar det består av. Bitarna matas ut på ledningen en i taget, sekventiellt i tiden. I princip kan det göras med hjälp av en roterande omkopplare, se nedanstående kopplingsschema. Till att börja med står omkopplaren i läget A. Det finns inget batteri i det läget så signalen UT är 0V, d v s en "nolla". 2
Omkopplaren vrids sedan till läget B. Här kopplas ett batteri in, så utsignalen UT blir +5V, d v s en "etta". På detta sätt fortsätts vridningen av omkopplaren tills alla åtta bitarna matats ut. I verkligheten används förstås någon form av elektronisk omkopplare. Ibland används istället ett skiftregister som laddas parallellt och skiftas ut seriellt för att åstadkomma precis samma resultat. Med den visade kopplingen blir det seriella datat på utgången UT 01100111 om vi anser att den mest signifikanta biten matas ut först. Oscilloskopfotot nedan visar utsignalen UT från ett skiftregister som laddats med 01100111 och som skiftas ut med 1 bit per mikrosekund, mest signifikant bit först. Det tar alltså 8 mikrosekunder att mata ut datat. När allt är klart skickas nollor ut, varför UT=0 under de två sista mikrosekunderna. 3
När används parallella signaler och när används seriella? Det går nog inte att besvara den frågan generellt, men jag ska göra ett försök. Ur kretssynpunkt är det enklare med parallella signaler och signaleringen går också snabbare, alla bitarna finns ju tillgängliga samtidigt. Därför hittar du parallella signaler på t ex kretskort i din dator, där snabbheten behövs och där signalledningarna är korta. Seriella signaler används å andra sidan när det är opraktiskt med många ledningar, t ex vid kommunikation via lokala nätverk. Vi har nu sett hur parallella och seriella signaler kan genereras, men hur ser det ut på mottagarsidan? För den parallella signalen är det inga problem, alla bitarna finns tillgängliga separat på var sin ledning och kan användas direkt. Vill du t ex använda den åttapoliga DIP-switchen vi tittade på för att tända eller släcka åtta lysdioder, behöver du bara koppla ledningen från var och en av omkopplarna till en av de åtta lysdioderna och ordna med strömförsörjning och strömbegränsning. Inga problem! För den seriella signalen blir det betydligt knepigare. Vill du styra åtta lysdioder med de åtta bitarna som skiftades ut ur skiftregistret i oscilloskopfotot ovan, går det åt en del elektronik. Det behövs ett åttabitars skiftregister för att ta emot datat, men det behövs också en signal som talar om när skiftningen ska ske, alltså en klocksignal. I vissa fall har man tillgång till klocksignalen. Det skulle gå alldeles utmärkt bra att använda samma klocksignal som utnyttjades när den seriella signalen genererades. I så fall talar man om en synkron seriell signal. Nackdelen är förstås att det då behövs två ledningar för signaleringen. Ofta är man begränsad till en enda ledning eller "datakanal", exempelvis då data ska skickas via optisk fiber eller via radio. Här finns ingen plats för någon klocka och signaleringen kallas därför asynkron. Man är då tvungen att generera det mottagande skiftregistrets klocka lokalt på mottagarsidan. Hur i allsin dar kan man göra det? Jo, med lite knep går det faktiskt att göra! För det första måste datahastigheten, d v s antalet bitar per sekund, vara känd och för det andra måste mottagarsidan få veta när ett data börjar och slutar. Detta åstadkoms genom att en startbit, normalt en "etta", läggs till före datat och en stoppbit, normalt en "nolla", läggs till efter datat. På mottagarsidan har man en lokalt genererad klocka med ungefär samma frekvens som sändarens. Den kan inte användas direkt eftersom dess fasläge är okänt (den kanske går hög när sändarklockan går låg och vice versa). För att bli användbar måste klockan synkroniseras, d v s dess fasläge "ruckas" så att den går i takt med sändarklockan. Detta görs med hjälp av startbiten, en krets känner av när startbiten dyker upp och justerar därvid klockan. Tillbaka till den ursprungliga frågan, vad är en UART? En UART är helt enkelt en krets som sköter om alla aspekter av asynkron seriell dataöverföring. När den används som sändare ser den till att ett parallellt data som matas in i den förses med start- och stoppbit och skiftas ut seriellt med viss bestämd datahastighet. När den används som mottagare ser den till att mottagarklockan synkroniseras och att det seriella datat skiftas in och blir tillgängligt i parallell form. Normalt kan en UART ytterligare några trick! Man brukar kunna välja längden på datat och det brukar också finnas möjlighet till enkel felkontroll. Om den seriella datakanalen utsätts för störningar kan det nämligen hända att en eller flera bitar tolkas fel av mottagaren. Med hjälp av en paritetsbit har man viss chans att avgöra om ett mottaget data är korrekt eller ej. Principen är enkel, UART:en räknar antalet ettor i datat som sänds och om resultatet är ett udda tal blir paritetsbiten en "etta", annars en nolla. Paritetsbiten läggs till som sista bit i datat. Antag att vi ska skicka den seriella datasekvensen 01100111. Antalet ettor är fem, så paritetsbiten blir en "etta". UART:en skickar datat som 011001111, där den sista ettan är paritetsbiten. På mottagarsidan räknar UART:en åter antalet ettor, 4
kollar udda eller jämnt och jämför med den mottagna paritetsbiten. Om den mottagna paritetsbiten var en "etta" och antalet ettor i datat udda (eller "nolla" respektive jämnt) är det mottagna datat troligen korrekt. Om UART:en upptäcker ett fel sätts en felsemafor, så att datat kan ignoreras. Jag skrev "troligen korrekt" med avsikt. Om två bitar blev fel i överföringen, t ex om två ettor felaktigt tolkades som "nollor", kan paritetskontrollen inte upptäcka felet. Var antalet ettor udda förut är det ju fortfarande udda. Det finns alltid två sidor av allting, även en så enkel sak som paritet. I stället för att låta paritetsbiten bli en "etta" vid udda antal ettor i datat låter hälften av världens befolkning istället paritetsbiten bli en "etta" vid jämnt antal ettor i datat! Man talar om udda eller jämn paritet. Det finns alltså skäl att se upp. Se alltid till att du vet hur paritetsbiten beräknats. Man kan köpa färdiga UART-kretsar från många halvledarfabrikanter (National, Motorola etc.) och många enchipsdatorer har inbyggda UART:ar. Du får nu chansen att bygga din egen UART med en CPLD och använda den för kommunikation, se laborationen UART med CPLD. 21 oktober 2001 Anders Andersson 5