BUDAPESTI MŰSZAKI ÉS GAZDASÁGTUDOMÁNYI EGYETEM VILLAMOSMÉRNÖKI ÉS INFORMATIKAI KAR MÉRÉSTECHNIKA ÉS INFORMÁCIÓS RENDSZEREK TANSZÉK Digitális technika (VIMIAA02) Laboratórium 12 Fehér Béla Raikovich Tamás, Fejér Attila BME MIT
Lab12: A soros interfészek használata 1. A mikroprocesszorok kommunikációs interfészei 2. A USRT periféria használata 3. Az SPI interfész bit-banging programozása 4. A laborfeladatok programjainak elkészítése
Lab12: A soros perifériák Az általános célú mikroprocesszorok általában rendelkeznek különböző soros kommunikációs interfészekkel Ezek hardveresen támogatják a szükséges átviteli protokollok beállíthatóságát Flexibilisen programozható periféria egységek A tipikus soros interfészek az alábbiak: UART/USRT Univerzális aszinkron/szinkron adó-vevő SPI Soros periféria interfész I2C Áramkörök közötti interfész
Lab12: A soros perifériák Amennyiben valamelyik interfész nem támogatott hardver perifériával, vagy esetleg az igények kielégítése során a rendelkezésre álló eszközkészlet kimerült, akkor azt a mikroprocesszor GPIO interfész lábain, bit-banging módon, szoftverből is realizálhatjuk (ha a sebességi igények megengedik) Ez a szoftveres emuláció általában nem annyira gyors, nem kínál speciális szolgáltatásokat, viszont tetszőleges egyedi igényekre felprogramozható A lehetséges megoldásokra számtalan mintapélda található
Lab12: Az UART/USRT soros periféria Univerzális aszinkron/szinkron adó vevő egység Kis sebességű adatátvitel, aszimmetrikus vonalakon Nincs megkülönböztetett szerep, egyenrangú kommunikáció két egység között Külön TX/RX adatvezeték, egy időben akár két irányú karakter átvitel full duplex kommunikáció Órajel csak USRT esetében CLK_IN RX UART/USRT UUAART TX CLK_OUT TX UART/USRT RX
Lab12: A MiniRISC USRT periféria A MiniRISC processzor hardveresen csak az USRT protokollt támogatja Ez az USRT interfész csak a MiniRISC GUI Terminállal bonyolított kommunikáció lebonyolítására használható Technikai részletek Az USRT formátumú adatátvitel csak a processzor és az LDC (letöltőkábel) eszköz között zajlik valójában Ezután a PC felé az LDC eszköz USB adatcsomagok formájában továbbítja a karaktereket A PC-ben az USB Host a Windows számára egy virtuális COM port-ot jelenít meg Ehhez kapcsolódik a terminál ablak, a GUI ezt használja
Lab 12: MiniRISC USRT periféria USRT adatátvitel Keretezett formátum: 1 START bit, melynek értéke mindig 0 8 adatbit (D0 D7) 1 STOP bit, melynek értéke mindig 1 USRT órajel: az adatátviteli sebességet határozza meg A master egység adja ki a slave egység felé Adás: a bitek kiadása az USRT órajel felfutó élére történik Vétel: a mintavételezés az USRT órajel lefutó élére történik Csak a kerethiba mentes (STOP bit = 1) karakterek kerülnek tárolásra USRT clk TXD/RXD inaktív START D0 D1 D2 D3 D4 D5 D6 D7 STOP inaktív Az adó itt adja ki a következő bitet A vevő itt mintavételezi az adatot
Lab 12: MiniRISC USRT periféria Programozói interfész: Vezérlő regiszter (UC): BASEADDR + 0x00, írható és olvasható 7. bit 6. bit 5. bit 4. bit 3. bit 2. bit 1. bit 0. bit 0 0 0 0 RXCLR TXCLR RXEN TXEN R R R R W W R/W R/W Bit Mód Funkció TXEN R/W 0: az USRT adó tiltott 1: az USRT adó engedélyezett RXEN R/W 0: az USRT vevő tiltott 1: az USRT vevő engedélyezett TXCLR W 1 beírásának hatására az adási FIFO törlődik RXCLR W 1 beírásának hatására a vételi FIFO törlődik Adatregiszter (UD): BASEADDR + 0x03, írható és olvasható Írás: adat írása az adási FIFO-ba (ha TXNF=1) Olvasás: adat olvasása a vételi FIFO-ból (ha RXNE=1) 7. bit 6. bit 5. bit 4. bit 3. bit 2. bit 1. bit 0. bit D7 D6 D5 D4 D3 D2 D1 D0 R/W R/W R/W R/W R/W R/W R/W R/W
Lab 12: MiniRISC USRT periféria Programozói interfész: FIFO státusz regiszter (US): BASEADDR + 0x01, csak olvasható Megszakítás eng. regiszter (UIE): BASEADDR + 0x02, írható és olvasható A FIFO státusz megszakítások engedélyezhetők/tilthatók vele A megszakításkérés az engedélyezett események fennállásáig aktív Bit 7. bit 6. bit 5. bit 4. bit 3. bit 2. bit 1. bit 0. bit 0 0 0 0 RXFULL RXNE TXNF TXEMPTY R R R R R R R R 7. bit 6. bit 5. bit 4. bit 3. bit 2. bit 1. bit 0. bit 0 0 0 0 RXFULL RXNE TXNF TXEMPTY R R R R R/W R/W R/W R/W Jelentés TXEMPTY 0: az adási FIFO-ban van adat 1: az adási FIFO üres TXNF 0: az adási FIFO tele van 1: az adási FIFO nincs tele RXNE 0: a vételi FIFO üres 1: a vételi FIFO-ban van adat RXFULL 0: a vételi FIFO nincs tele 1: a vételi FIFO tele van
Lab 12: MiniRISC USRT periféria A USRT FIFO státuszbitek jelentése és használata Bit Jelentés TXEMPTY 0: az adási FIFO-ban van adat 1: az adási FIFO üres TXNF 0: az adási FIFO tele van 1: az adási FIFO nincs tele RXNE 0: a vételi FIFO üres 1: a vételi FIFO-ban van adat RXFULL 0: a vételi FIFO nincs tele 1: a vételi FIFO tele van TXNF használható, ha karakterenként kívánjuk küldeni az üzenetet Jelentése: Legalább 1 üres hely van a TX_FIFO-ban RXNE használható, ha karakterenként kívánjuk fogadni az üzenetet Jelentése: Legalább 1 beérkezett bájt van az RX_FIFOban
Lab 12: MiniRISC USRT periféria A USRT FIFO státuszbitek jelentése és használata Bit Jelentés TXEMPTY 0: az adási FIFO-ban van adat 1: az adási FIFO üres TXNF 0: az adási FIFO tele van 1: az adási FIFO nincs tele RXNE 0: a vételi FIFO üres 1: a vételi FIFO-ban van adat RXFULL 0: a vételi FIFO nincs tele 1: a vételi FIFO tele van TXEMPTY használható, ha 16 bájtos blokkokban kívánjuk küldeni az üzenetet Jelentése: Az üres TX_FIFO-ba írhatunk 16 bájtot RXFULL használható, ha 16 bájtos blokkokban kívánjuk fogadni az üzenetet Jelentése: A teli RX_FIFO-ból 16 bájt kiolvasható Az adatmozgatásra 1ms idő van (a 9600b/s miatt)
Lab12_1a feladat: USRT adás A MiniRISC adatmemóriában készítsünk elő egy 16 bájtnál rövidebb üzenetet (pl. NEPTUN kód) Az üzenet legyen nulla végkarakteres a könnyű kezelhetőség érdekében Programozzuk fel a MiniRISC USRT perifériát adásra A parancsregiszterben TXEN=1, TXCLR=1, RXCLR=1 Megszakítás nincs engedélyezve
Lab12_1a feladat: USRT adás Az üzenetet egyszer kell elküldeni A küldő programrészlet: Egymás után olvassuk a karaktereket Ellenőrizzük a végkaraktert, ha már az, akkor kilépés Ha nem, akkor kiírjuk az UD regiszterébe, a TX_FIFOban biztosan van szabad hely Címpointer inkrementálás és folytatás
Lab12_1a feladat: USRT adás Az üzenetet egyszer kell elküldeni A küldő programrészlet: Egymás után olvassuk a karaktereket Ellenőrizzük a végkaraktert, ha már az, akkor kilépés Ha nem, akkor kiírjuk az UD regiszterébe, a TX_FIFOban biztosan van szabad hely Címpointer inkrementálás és folytatás
Lab12_1b feladat: USRT adás A MiniRISC adatmemóriában készítsünk elő egy 16 bájtnál hosszabb üzenetet (pl. LOOONG üzenet) Az üzenet legyen nulla végkarakteres a könnyű kezelhetőség érdekében Programozzuk fel a MiniRISC USRT perifériát adásra a korábbi paraméterekkel A parancsregiszterben TXEN=1, TXCLR=1, RXCLR=1 Megszakítás nincs engedélyezve
Lab12_1b feladat: USRT adás Használjuk az előző programkódot a LOOONG üzenet átvitelére Az üzenetet egyszer kell elküldeni Miért nem hibátlan a LOOONG üzenet átvitele? Melyik státuszregiszter bitet használná a hiba elkerülésére? Módosítsa úgy a programot, hogy az üzenet hosszától függetlenül az átvitel hibamentes legyen!
Lab12_1a feladat: USRT adás Az üzenetet egyszer kell elküldeni A küldő programrészlet: Egymás után olvassuk a karaktereket Ellenőrizzük a végkaraktert, ha már az, akkor kilépés Ha nem, akkor kiírjuk az UD regiszterébe, a TX_FIFO-ban biztosan van szabad hely Címpointer inkrementálás és folytatás
Lab12: Az SPI soros adatátvitel Az SPI soros adatátviteli interfész elsősorban áramkörön belüli, áramkörök közötti adatátvitelre szolgál 4 vezetékes szinkron interfész CSn Periféria kiválasztó jel SCK Soros órajel MOSI Master kimenet, Slave bemenet MISO Master bemenet, Slave kimenet
Lab12: Az SPI soros adatátvitel Az SPI soros adatátviteli interfész nagyon flexibilis, sok különböző megvalósítása létezik 4 féle üzemmód Tetszőleges adatméret Egyirányú kapcsolat (pl. csak bemenet) Több bites kiterjesztés Busz topológia Láncba kapcsolás Nagy sebesség
Lab12: Az SPI soros adatátvitel A MiniRISC processzor nem rendelkezik hardveres SPI perifériával Az SPI interfész a GPIO periférián keresztül, bitbanging módban realizálható A megoldás rugalmas, tetszőleges előíráshoz könnyen adaptálható Az elérhető sebesség konfiguráció és protokoll függő
Lab12_2: Az SPI interfész realizálása Az SPI interfész szoftveres használatát egy TMP12 típusú hőmérséklet szenzor modul illesztésén keresztül ismertetjük A szenzor modul kapcsolási rajza a következő:
Lab12_2: Az SPI interfész realizálása Az SPI interfész jelei az A csatlakozó 8 bites GPIO_A perifériájához kapcsolódnak, a következőképpen: CSn A[0], SCK A[1], MISO A[2] CSn, SCK kimeneti jelek, MISO bemenet A GPIO_A periféria felprogramozása:
Lab12_2: Az SPI interfész realizálása A TMP121 SPI kimeneti interfész idődiagramja: A CSn és SCK kimenetek programozásával jellegre hasonló változásokat generálunk és SCK = 1, azaz magas értéke alatt beolvassuk az éppen aktuális bitet A beolvasott bitet egy (2 db 8 bitesből képezett) 16 bites regiszterpárba léptetjük A 16 bit beolvasása után CSn = 1 és SCK = 0 értékkel alaphelyzetbe állítjuk a vezérlőjeleket
Lab12_2a feladat: A TMP121 olvasása Készítsük el azt a read adatbeolvasó szubrutint, ami bit-banging módban használva a GPIO_A periféria A[2:0] lábait, beolvassa a TMP121 SPI kimeneti interfészén elérhető hőmérséklet adatot és 16 bites adattal az {r9:r8} regiszterben tér vissza A GPIO_A[2] bitpozícióban beolvasott bit helyes beléptetése a 16 bites eredményregiszterbe különböző módokon lehetséges A minta szubrutin ezt tesztelés nélkül oldja meg Értelmezzük a megoldást!
Lab12_2a feladat: A TMP121 olvasása Az SPI adatbeolvasó szubrutin
Lab12_2a feladat: A TMP121 olvasása A beolvasott 16 bit adatban egy 13 bites, fixpontos (13.4) formátumú, kettes komplemens valós szám definiálja a hőmérséklet értéket Tehát a beolvasott érték további feldolgozást kíván 3 LSB bit kiléptetése előjeles aritmetikai léptetéssel Eredmény: 16 bites, 4 digites érték Ebből 3 digit egészrész Egy digit törtrész Az érték hexadecimálisan kijelezhető a 4 digites 7 szegmenses kijelzőn
Lab12_2a feladat: A TMP121 olvasása Készítsük el a skálázott értéket hexadecimálisan megjelenítő programot A hexadecimális 7 szegmenses átkódolást az adatmemóriában elhelyezett táblázattal végezzük A táblázat adatai a következők: Tipp: A MiniRISC GUI Display lapján a szegmensképekre kattintva a szükséges kódok könnyen származtathatók
Lab12_2a feladat: A TMP121 olvasása Az egyes digitek konvertálása a következő utasításokkal végezhető el: Ugyanezt kell elvégezni mind a 4 digitre A DIG1 esetében be kell kapcsolni a törtrészt jelentő pontot is! Vizsgáljuk meg a szenzor érintésével a hőmérséklet változást!
Lab12_2b feladat: A TMP121 olvasása A hexadecimális kijelzés nem feltétlenül felhasználóbarát Ezen a problémán egy BIN DEC vagy HEX DEC konvertálással segíthetünk. Sajnos a konverzió kicsit bonyolult Ezt a feladatot is táblázatosan oldjuk meg! A laborhőmérsékletet 0 és +49 C közöttinek tételezzük fel, a táblázatot erre méretezzük! Emiatt a legfelső digit 0 értékét nem használjuk Külön táblázat a 4 bites, 1 hexa digites törtrésznek! A pontmátrix kijelzőn jelenítsünk meg egy C jelet!
Lab12_2b feladat: A TMP121 olvasása A decimális kijelzéshez tartozó tartozó táblázatok: SEG_TAB: 7 szegmenses konverter, itt is kell, bár csak decimális számokra HEX_DEC: Hexa 0-31 konvertálása decimális 0-49-re FRAC: Hexa 0/16 15/16 konvertálása 0.0-0.94-re CELS_STR: A C bitkép 5x7 ponton