ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 8. Az SPI kommunikációs csatorna

Hasonló dokumentumok
MSP430 programozás Energia környezetben. LED mátrix vezérlése MAX7219 IC-vel

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 11. Impulzus-szélesség moduláció (PWM)

MSP430 programozás Energia környezetben. Hétszegmenses LED kijelzok

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 5. Időzítők, számlálók 1. rész

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 5. Időzítők, számlálók 2. rész

MSP430 programozás Energia környezetben. LED kijelzok második rész

A LOGSYS GUI. Fehér Béla Raikovich Tamás, Laczkó Péter BME MIT FPGA laboratórium

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 7. Analóg perifériák

Programozási segédlet DS89C450 Fejlesztőpanelhez

MSP430 programozás Energia környezetben. Nokia 5110 grafikus kijelzo vezérlése

MSP430 programozás Energia környezetben. LED kijelzok második rész

Bevezetés a mikrovezérlők programozásába: MAX6958: Hétszegmenses LED kijelző vezérlő

Bevezetés az elektronikába

A vezérlő alkalmas 1x16, 2x16, 2x20, 4x20 karakteres kijelzők meghajtására. Az 1. ábrán látható a modul bekötése.

loop() Referencia:

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 9. Az I2C kommunikációs csatorna

Bevezetés a mikrovezérlők programozásába: Az Arduino, mint logikai analizátor

I 2 C, SPI, I 2 S, USB, PWM, UART, IrDA

Újrakonfigurálható eszközök

Digitális technika (VIMIAA02) Laboratórium 12

Digitális technika (VIMIAA02) Laboratórium 12

Bevezetés a mikrovezérlők programozásába: LCD kijelzők

LOGSYS LOGSYS SPARTAN-3E FPGA KÁRTYA FELHASZNÁLÓI ÚTMUTATÓ szeptember 19. Verzió

LOGSYS LOGSYS LCD KIJELZŐ MODUL FELHASZNÁLÓI ÚTMUTATÓ november 8. Verzió

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 13. DMA közvetlen memória hozzáférés

SR mini PLC Modbus illesztő modul. Modul beállítása Bemeneti pontok kiosztása főmodul esetén Bemeneti pontok címkiosztása kiegészítő modul esetében

3. Hőmérők elkészítése

Az I2C egy soros, 8 bit-es, kétirányú kommunikációs protokoll, amelynek sebessége normál üzemmódban 100kbit/s, gyors üzemmódban 400kbit/s.

MSP430 programozás Energia környezetben. Kitekintés, további lehetőségek

The modular mitmót system. DPY kijelző kártya C API

Bevezetés a mikrovezérlők programozásába: A PM6025 (7 és 16 szegmenses) LCD kijelző vezérlése

SIOUX-RELÉ. Sioux relé modul telepítési leírás Szerkesztés MACIE0191

The modular mitmót system. 433, 868MHz-es ISM sávú rádiós kártya

Mintavételezés tanulmányozása. AD - konverzió. Soros kommunikáció

Moduláris USB billentyűzet emulátor

2008. október 9. Verzió

I 2 C, RS-232 és USB. Informatikai eszközök fizikai alapjai. Oláh Tamás István

Vegyes témakörök. 1. Soros vezérlésű LCD számkijelző. Hobbielektronika csoport 2018/2019. Debreceni Megtestesülés Plébánia

Digitális technika (VIMIAA01) Laboratórium 9

LOGSYS LOGSYS ECP2 FPGA KÁRTYA FELHASZNÁLÓI ÚTMUTATÓ szeptember 18. Verzió

A LOGSYS rendszer ismertetése

IDAXA-PiroSTOP. PIRINT PiroFlex Interfész. Terméklap

Az MSP430 mikrovezérlők digitális I/O programozása

Roger UT-2. Kommunikációs interfész V3.0

I. C8051Fxxx mikrovezérlők hardverfelépítése, működése. II. C8051Fxxx mikrovezérlők programozása. III. Digitális perifériák

Vegyes témakörök. A KAT120B kijelző vezérlése Arduinoval

Perifériák hozzáadása a rendszerhez

Digitális technika (VIMIAA01) Laboratórium 9

LOGSYS LOGSYS SZTEREÓ CODEC MODUL FELHASZNÁLÓI ÚTMUTATÓ szeptember 16. Verzió

SysCVideo: fiktív grafikus kártya SystemC modulként, SDL alapú megjelenítéssel

Labor gyakorlat Mikrovezérlők

RUBICON Serial IO kártya

Bevezetés a mikrovezérlők programozásába: Hétszegmenses LED kijelzők

ARM programozás. Iványi László Szabó Béla

Nagy Gergely április 4.

Vegyes témakörök. 5. Gagyiszkóp házilag hangfrekvenciás jelek vizsgálata. Hobbielektronika csoport 2018/2019. Debreceni Megtestesülés Plébánia

Dr. Oniga István DIGITÁLIS TECHNIKA 9

Hobbi Elektronika. A digitális elektronika alapjai: Sorrendi logikai áramkörök 4. rész

Silabs STK3700, Simplicity Studio laborgyakorlat

Bevezetés a mikrovezérlők programozásába: I/O portok kezelése, számrendszerek, bitműveletek

_INVHU000_WriteReadParameter.cxf Frekvenciaváltók

Dr. Oniga István DIGITÁLIS TECHNIKA 9

The modular mitmót system. 433, 868MHz-es ISM sávú rádiós kártya

Beágyazott és Ambiens Rendszerek Laboratórium BMEVIMIA350. Mérési feladatok az 1., 2. és 3. mérési alkalomhoz

Yottacontrol I/O modulok beállítási segédlet

Digitális technika VIMIAA hét

A mikroszámítógép felépítése.

Serial 2: 1200/2400 bps sebességû rádiós modem vagy

Bevezetés az elektronikába

Labor gyakorlat Mikrovezérlők

ARM mikrovezérlők programozása

LOGSYS LOGSYS HŐMÉRŐ ÉS EEPROM MODUL FELHASZNÁLÓI ÚTMUTATÓ szeptember 16. Verzió 1.0.

Mikrovezérlők Alkalmazástechnikája

Mikrorendszerek tervezése

Mérési jegyzőkönyv. az ötödik méréshez

Digitális technika VIMIAA01

Digitális technika VIMIAA01

Mikrovezérlők Alkalmazástechnikája

Billentyűzet. Csatlakozók: A billentyűzetet kétféle csatlakozóval szerelhetik. 5 pólusú DIN (AT vagy XT billentyűzet csatlakozó),

XII. PÁRHUZAMOS ÉS A SOROS ADATÁTVITEL

Leírás. Készítette: EMKE Kft február 11.

Laborgyakorlat Logikai áramkörök számítógéppel segített tervezése (CAD)

M-Bus Master MultiPort 250D/L

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben. 4. Aszinkron soros kommunikáció (UART)

ARM Cortex magú mikrovezérlők

MSP430 programozás Energia környezetben. Alfanumerikus LCD kijelzok

Járműfedélzeti rendszerek I. 4. előadás Dr. Bécsi Tamás

Labor gyakorlat Mikrovezérlők

Karakteres LCD kijelző használata MiniRISC processzoron

Ellenőrző mérés mintafeladatok Mérés laboratórium 1., 2011 őszi félév

1 done by: b+bme. Adja meg, hogy milyen ICW3 parancsot kell küldeni a MASTER illetve a SLAVE egységeknek!

AC-MF1W. RFID kártyaolvasó és kódzár. Felhasználói leírás

Digitális technika (VIMIAA01) Laboratórium 10

A Memory Interface Generator (MIG) beállítása a Logsys Kintex-7 FPGA kártyához

Nyolcbites számláló mintaprojekt

MSP430 programozás Energia környezetben. Szervó motorok vezérlése

LOGIKAI TERVEZÉS HARDVERLEÍRÓ NYELVEN. Dr. Oniga István

OMRON FOTOELEKTROMOS KAPCSOLÓK E3NT

AVR-Stamp1.0F_USB Leírás, használati útmutató. Rev.B

LOGSYS LOGSYS VGA, PS/2 ÉS HANGSZÓRÓ MODUL FELHASZNÁLÓI ÚTMUTATÓ június 25. Verzió

Átírás:

ARM Cortex-M0+ mikrovezérlő programozása KEIL MDK 5 környezetben 8. Az SPI kommunikációs csatorna 1

Felhasznált anyagok, ajánlott irodalom Joseph Yiu: The Definitive Guide to ARM Cortex -M0 and Cortex-M0+ Processors (2nd Ed.) Muhammad Ali Mazidi, Shujen Chen, Sarmad Naimi, Sepehr Naimi: Freescale ARM Cortex-M Embedded Programming ARM University Program: Course/Lab Material for Teaching Embedded Systems/MCUs (for the FRDM-KL25Z board) ARM Information Center: Cortex-M0+ Devices Generic User Guide Freescale: MKL25Z128VLK4 MCU datasheet Freescale: KL25 Sub-Family Reference Manual Freescale: FRDM-KL25Z User Manual Freescale: FRDM-KL25Z Pinouts 2

Soros Periféria Illesztő Az SPI (Serial Peripheral Interface) busz kétirányú, szinkron soros kommunikációt valósít meg két eszköz között, amelyek master/slave (mester/szolga) viszonyban állnak. Az SPI busz kiterjeszthető: egy master több slave eszközhöz is kapcsolódhat, ám a kommunikációra kiválasztott slave eszközt egyedi választó vonallal (Slave Select) hardveresen kell kijelölni. A másik lehetőség az SPI eszközök felfűzése (daisy chain) amennyiben az eszközök ezt a módot támogatják. 3

Az SPI busz jelei SCK - Az SPI busz szinkronizálást biztosító órajele. A master eszköz állítja elő. SS - Slave select, azaz a slave eszköz kiválasztására szolgáló jel, melynek '0' állapota aktivizál. A master eszköz állítja elő. Slave eszköz esetében az SPI modul speciális kivezetését kell használnunk az eszköz kiválasztásához, de Master eszköznél elvileg bármilyen GPIO lábat használhatunk a slave eszköz megszólítására. MOSI - A master eszköz kimeneti adatvonala (Master out, Slave in). A master eszköz állítja elő. MISO - A slave eszköz kimeneti adatvonala, melyet a master olvas (Master in, Slave out). A slave eszköz állítja elő. Ábra forrása: http://www.eetimes.com/document.asp?doc_id=1272534 4

Az órajel polaritása és fázisa SPI mód CPOL CPHA 0 0 0 1 0 1 2 1 0 3 1 1 A lehetséges üzemmódok az órajel polaritásának és fázisának kombinációjaként állnak elő. Az órajel polaritása: CPOL = 0 esetén SCK inaktív állapota alacsony szint, CPOL = 1 esetén magas szint. Az órajel fázisa: CPHA = 0 esetén az adatvonalak bekapuzása az órajel páratlan számú átmenetein történik (az ábrán rózsaszín vonalak), CPHA = 1 esetén pedig a páros számú átmeneteknél (kék vonalak) 5

A FRDM-KL25Z kártya SPI perifériái Az MKL25Z128VLK4 mikrovezérlő két SPI modult tartalmaz (SPI0 és SPI1) Az SPI modulok 8 bites adatformátumot támogatnak Az SPI0 modul órajel forrása a busz órajel, az SPI1 modulé pedig a CPU órajel. Az SPI modulok támogatják a DMA adatátvitelt és VLPS energiatakarékos módban is működnek (slave módban). Ébresztésre is képesek, amikor adatot kapnak. Master vagy slave módú működés választható Full-duplex vagy egyvezetékes kétirányú mód Programozható adatküldési sebesség (bitráta) Kettős pufferelésű adó és vevő adatregiszterek Órajel polaritása és fázisa konfigurálható (mind a négy mód beállítható) Automatikusan kiküldött "Slave select" jel (opcionális) Hibás mód jelzés fogadása és megszakításkérés Választható bitsorrend: MSB-first vagy LSB-first kiléptetési sorrend Vett adat egyezésének hardveres figyelése előre megadott értékkel 6

Az SPI modulokhoz rendelhető kivezetések Az SPI0 és SPI1 modulokhoz az alábbi portkivezetéseket rendelhetjük hozzá: Az Arduino kompatibilis bekötéshez a táblázatban kövéren szedett kivezetések tartoznak: SS = PTD0 SCLK = PTD1 MOSI = PTD2 MISO = PTD3 A FRDM-KL25Z Pinouts dokumentumban található, hogy az adott funkció kiválasztásához milyen kódot kell megadni a megfelelő portvezérlő regiszter MUX bitcsoportjába. Például: SIM->SCGC5 = 0x1000; // Port D engedélyezése PORTD->PCR[1] = 0x200; // PTD1 legyen SPI SCLK PORTD->PCR[2] = 0x200; // PTD2 legyen SPI MOSI 7

KL25Z soros perifériák engedélyezése SIM_SCGC4 regiszter A használni kívánt perifériát engedélyezni kell a SIM_SCGC4 regiszter megfelelő bitjének 1-be állításával 8

Az SPI modulok regiszterkészlete Az SPI modulok azonos regiszterkészlettel rendelkeznek. Az alábbi táblázatban az SPIx regisztereknek (ahol x = 0, vagy 1) csak a báziscímekhez képesti eltolási címét (ofszet cím) adtuk meg. 9

Az SPIx_C1 vezérlő regiszter A megjelölt bitek beállításával a legegyszerűbb használatnál is foglalkoznunk kell! SPIE - Megszakítás engedélyezése a vételi puffer megtelése (SPRF) illetve üzemmód hiba (MODF) esetén (0: megszakítás tiltás, 1: megszakítás engedélyezés) SPE - Az SPI modul működésének engedélyezése (0: tiltás, 1: engedélyezés) SPTIE - Megszakítás engedélyezése ha az SPI adatküldő puffere üres (SPTEF) eseménykor (0: megszakítás tiltás - lekérdezéses mód 1: megszakítás engedélyezés) MSTR - Master / Slave mód választása (0: slave mód, 1: master mód) CPOL - Órajel polaritása (0: nyugalmi szint alacsony, 1: nyugalmi szint magas) CPHA - Órajel fázisa (0: első átmenet eltolással, 1: első átmenet eltolás nélkül SSOE - Csak master módban és a MODFEN = '1' esetén hatásos (0: az SS kivezetés MODFAULT bemenet, 1: az SS kivezetés automatikusan kezelt SS kimenet). LSBFE - Bitsorrend választása (0: a legmagasabb helyiértékű bit megy ki először - MSB-first mód, 1: a legalacsonyabb helyiértékű bit megy ki először - LSB-first mód) 10

Az SPIx_C2 vezérlő regiszter SPMIE - Megszakítás engedélyezése adategyezés esetén (0: megszakítás tiltás, 1: megszakítás engedélyezés) TXDMAE - DMA adatküldés engedélyezése (0: tiltás, 1: engedélyezés) MODFEN - Master módban "módbeállítás hiba" fogadásának engedélyezése BIDIROE - Kétirányú mód esetén (amikor SPC0 = 1) az adatáramlás irányát állítja be (0: bemenet, 1: kimenet) RXDMAE - Adatfogadás DMA támogatással. Ha ez a bit '1', akkor DMA átvitel történik, ha SPRF és SPE egyaránt '1'. SPISWAI - SPI leállítása Stop módban (0: az SPI WAIT módban is működik, 1: az SPI leáll, amikor az MCU leáll) SPCO - Kétirányú adatvonal engedélyezése (0: szétválasztott adatvonalak, 1: közös, kétirányú adatvonal) 11

Az SPIx_BR regiszter Ebben az adatsebességet konfigurálhatjuk egy előosztó és egy osztó beállításával. SPPR - Előosztási arány (0-7 közötti értéket írhatunk bele, a leosztás SPPR + 1 lesz) SPR - Frekvenciaosztási arányt írhatunk bele (csak a 0-8 közötti értékek érvényesek!) Az adatsebesség: f SPI = f IN /((SPPR +1) * 2 (SPR+1) ), ahol f IN az SPI0 modul esetén a buszfrekvenciát, SPI1 esetén pedig a CPU frekvenciát jelenti. Például 48 MHz-es CPU frekvencia és 24 MHz-es buszfrekvencia esetén az 0x53 érték beírása az alábbi adatsebességeket eredményezi: SPI0->BR = 0x53; // fspi = 24 MHz / (6 * 2^4) = 24 MHz/ (6*16) = 0.25 MHz = 250 khz SPI1->BR = 0x53; // fspi = 48 MHz / (6 * 2^4) = 48 MHz/ (6*16) = 0.50 MHz = 500 khz 12

Az SPIx_S állapotjelző regiszter SPRF - SPI vételi puffer megtelt (0: nincs kiolvasni való adat, 1: adatbeolvasás befejeződött, a vett adat kiolvasható). A jelzőbit automatikusan törlődik, ha olvassuk az SPRF jelzőbitet, majd kiolvassuk az SPIx_D adatregisztert. SPMF - Adategyezés jelzése. Ez a bit akkor áll '1'-be, ha beérkezett egy bájt (SPRF = 1) és a beérkezett adat megegyezik azzal, amit az SPIx_M match regiszterbe írtunk. (0: nincs egyezés, 1: egyezés van) SPTEF - Az SPI adatküldő puffere üres, újabb írásra kész (0: az adatküldő regiszter foglalt 1: az adatregiszter felszabadult) MODF - Üzemmód beállítási hibajelzés érkezésének jelzése (0: nem érkezett hibajelzés, 1: hibajelzés érkezett) A master módú tranzakció végét nem SPTEF, hanem SPRF jelzi, ezt célszerű figyelni! 13

Az SPIx_D adatregiszter Az adatregiszter írásakor és olvasásakor valójában fizikailag két, különálló regisztert kezelünk. Küldéskor ide írjuk a kiküldendő bájtot, olvasáskor pedig ezen a címen olvashatjuk ki a beérkezett adatot. Az adat kiolvasása egyúttal automatikusan törli az SPRF jelzőbitet is. Az SPIx_M adategyezés regiszter Ebbe a regiszterbe írhatjuk bele azt a számot, ami a hardveres adategyezés figyelésének az alapja. Ha az SPI modul által vett adat megegyezik az itt beállított értékkel, akkor az SPIx_S állapotjelző regiszter SPMF bitje '1'-be áll. Az SPIx_C2 vezérlőregiszter SPMIE bitjének '1'-be állításával megszakítást is engedélyezhetünk az adategyezési eseményhez. 14

Mintaprogramok Program8_1: SPI0 adatküldés Program8_2: Számkijelző vezérlése MAX7219 IC-vel Program8_3: 8x8 LED mátrix vezérlése MAX7219 IC-vel 15

Program8_1: SPI0 adatküldés Bemutatjuk az SPI0 csatorna konfigurálását és az egyszerű adatküldést. A kiküldött adatokkal egy kijelzőt vezérlünk, ami két 74HC595 shift regiszterből (léptetőregiszter) és két HD1131R típusú 7 szegmenses LED számkijelzőből áll. A 74HC595 shift regiszter soros bemenete a 14. láb (SER), kimenete pedig a 9. láb (QH*). A shift regiszter léptetését az SCK jel végzi. Az SS jelet az RCK bemenetekre kötöttünk rá, ami az átvitel végén (felfutó él) a kimeneti adattároló regiszterébe kapuzza át az adatokat (a küldött adatbitek csak ekkor jelennek meg QA..QH kimeneteken). 16

A 74HC595 IC-k sorbaköthetőek (QH SER ) Az adatok áttöltése az RCLK jel felfutó élénél történik. SRCLR = shift regiszter törlés, OE = kimenet engedélyezés. 17

Kétszámjegyű kijelző A shift regisztereket sorba köthetjük, így többszámjegyű kijelzőt építhetünk. MOSI SCLK SS GND VCC 18

Hevenyészett kivitel 3x7 cm-es próbapanelon VCC GND SS SCLK MOSI IC1 DIS1 DIS2 IC2 Előny: Nem kell multiplex vezérlés Hátrány: Sok ellenállást kell beépíteni (nagyobb helyigény) 19

Program8_1 #include "MKL25Z4.h" void SPI0_init(void) { SIM->SCGC5 = 0x1000; // Port D engedélyezése PORTD->PCR[1] = 0x200; // PTD1 legyen SPI SCK */ PORTD->PCR[2] = 0x200; // PTD2 legyen SPI MOSI */ PORTD->PCR[0] = 0x100; // PTD0 legyen GPIO módban PTD->PDDR = 0x01; // PTD0 kimenet legyen (SPI SS) PTD->PSOR = 0x01; // Kezdetben '1' legyen SIM->SCGC4 = 0x400000; SPI0->C1 = 0x10; SPI0->C1 = 0x01; SPI0->C2 = 0; SPI0->BR = 0x54; SPI0->C1 = 0x40; // Az SPI0 modul engedélyezése // SPI letiltása, master mód // LSBFE = 1 (elöször LSB-t küldjük) // Alapértelmezett beállítások // Baud rate = 125 khz (/6 és /32 osztók) // Az SPI modul engedélyezése void SPI0_write(unsigned char data) { volatile char dummy; while(!(spi0->s & 0x20)) { /* wait until tx ready */ SPI0->D = data; /* send data byte */ while(!(spi0->s & 0x80)) { /* wait until tx complete */ dummy = SPI0->D; /* clear SPRF */ 20

const unsigned char digit [10] = { 0xFC, // 0b11111100-0 0x60, // 0b01100000-1 0xDA, // 0b11011010-2 0xF2, // 0b11110010-3 0x66, // 0b01100110-4 0xB6, // 0b10110110-5 0xBE, // 0b10111110-6 0xE0, // 0b11100000-7 0xFE, // 0b11111110-8 0xF6; // 0b11110110-9 int main(void) { unsigned char n, d0, d1; SPI0_init(); // Az SPI0 modul konfigurálása while(1) { for(n=0; n<100; n++) { d1 = ~digit[n/10]; // Elso számjegy szegmensei d0 = ~digit[n%10]; // Második számjegy szegmensei PTD->PCOR = 1; // SS aktiválása SPI0_write(d0); // Egyesek kiküldése SPI0_write(d1); // Tízesek kiküldése PTD->PSOR = 1; // SS deaktiválása delayms(500); 21

A jelalak vizsgálata logikai analizátorral 22

Program8_2: kijelző vezérlése MAX7219 IC-vel Egy Maxim Integrated MAX7219 LED vezérlővel IC-vel ellátott, 8-digites, hétszegmenses számkijelző modult használunk, ami SPI illesztőfelülettel rendelkezik. Beépített áramkorlátozással rendelkezik, s a fényerő 32 lépésben programozottan is változtatható. A SEG A SEG DP kimenetek áramforrások, a DIG 0 DIG 7 kimenetek áramnyelők. 23

Készen kapható kijelző modul D11 (PTD2) D13 (PTD1) D10 (PTD0) GND VCC 24

Technikai részletek a konfiguráláshoz MAX7219 regisztertérkép Nem használt DP a b c d e f g 0: no decode 1: decode 0 0xF 0 7 0: shutdown 1: normal mode 1: test mode 0: normal mode 25

Program8_2 listája (részletek) #include "MKL25Z4.h int main(void) { unsigned char i; SPI0_init(); // SPI0 konfigurálása max7219_write(decode, 0xFF); // dekódolás 8 számjegyre max7219_write(scanlimit, 7); // pásztázás 8 jegyre max7219_write(intensity, 8); // Kitöltési arány = 17/32 max7219_write(testmode, 1); // Teszt mód engedélyezése max7219_write(shutdown, 1); // Megjelenítés engedélyezése for(i=1; i<9; i++) max7219_write(i,0x0f); // Blank karakter delayms(1000); max7219_write(testmode, 0); // Teszt mód letiltása delayms(1000); while(1) { for(i=1; i<9; i++) { max7219_write(i,i-1); delayms(500); delayms(1000); for(i=1; i<9; i++) { max7219_write(i,0x0f); delayms(500); // Számjegyek kiírása // Számjegyek törlése // Blank karakter #define NO_OP 0 #define DECODE 9 #define INTENSITY 10 #define SCANLIMIT 11 #define SHUTDOWN 12 #define TESTMODE 15 26

void max7219_write(unsigned char command, unsigned char data) { volatile char dummy; PTD->PCOR = 1; // SS aktiválás while(!(spi0->s & 0x20)) { // TX kész jelre vár SPI0->D = command; // Parancs küldése while(!(spi0->s & 0x80)) { // Átvitel végére vár dummy = SPI0->D; // SPRF törlése while(!(spi0->s & 0x20)) { // TX kész jelre vár SPI0->D = data; // Adat küldése while(!(spi0->s & 0x80)) { // Átvitel végére vár dummy = SPI0->D; // SPRF törlése PTD->PSOR = 1; // SS deaktiválása void SPI0_init(void) { SIM->SCGC5 = 0x1000; // Port D engedélyezése PORTD->PCR[1] = 0x200; // PTD1 legyen SPI SCK */ PORTD->PCR[2] = 0x200; // PTD2 legyen SPI MOSI */ PORTD->PCR[0] = 0x100; // PTD0 legyen GPIO módban PTD->PDDR = 0x01; // PTD0 kimenet legyen (SPI SS) PTD->PSOR = 0x01; // Kezdetben '1' legyen SIM->SCGC4 = 0x400000; // Az SPI0 modul engedélyezése SPI0->C1 = 0x10; // SPI letiltása, master mód, MSB elsőként SPI0->C2 = 0; // Alapértelmezett beállítások SPI0->BR = 0x51; // Baud rate = 1 MHz (/6 és /4 osztók) SPI0->C1 = 0x40; // Az SPI modul engedélyezése 27

Program8_3: LED 8x8 mátrix vezérlése MAX7219 IC-vel 3 mm-es piros LED-ek 8x8 mátrixba szervezve 1088AS vagy M1388AR típusnál a sorkiválasztó vonal a közös katód Multiplex kijelzés, egyidejűleg legfeljebb egy sor, vagy egy oszlop lehet aktív. Kényelmes meghajtás: 1 db MAX7219, vagy 2 db 74HC595 (+ meghajtó +áramkorlátozás) 1 db MCP23S017 (+ meghajtó +áramkorlátozás) 28

8x8-s LED mátrix vezérlése MAX7219 29

Komplett kijelző modul (pl. Ebay.com) 8x8 LED mátrix MAX7219 vezérlő Felfűzhető kivitel Tápellátás: 3,5 5 V Bemenetek Kimenetek 1 VCC 1 VCC 2 GND 2 GND 3 DIN 3 DOUT 4 CS 4 CS 5 CLK 5 CLK 30

Program8_3 lista (részletek) #include "MKL25Z4.h" const char minta1[]= {0xFF,0x18,0x18,0x18,0x18,0x18,0x18,0xFF; //H const char minta2[]= {0x1F,0x60,0x80,0x40,0x40,0x80,0x60,0x1F; //W int main(void) { unsigned char i; SPI0_init(); // SPI0 konfigurálása max7219_write(decode, 0); // Nincs dekódolás max7219_write(scanlimit, 7); // pásztázás 8 sorra/oszlopra max7219_write(intensity, 8); // Kitöltési arány = 17/32 max7219_write(testmode, 1); // Teszt mód engedélyezése max7219_write(shutdown, 1); // Megjelenítés engedélyezése for(i=1; i<9; i++) { max7219_write(i,0); // képpontok törlése delayms(1000); max7219_write(testmode, 0); // Teszt mód letiltása delayms(1000); while(1) { for(i=1; i<9; i++) max7219_write(i,minta1[i-1]); delayms(1000); for(i=1; i<9; i++) max7219_write(i,minta2[i-1]); delayms(1000); Minden szegmens állapotát magunk állítjuk be! 31

Az inicializáló parancsok vizsgálata Hardver: Texas Instruments Stellaris Launchpad (max. 8 csatorna az RB0 RB7 bemeneteken) Szoftver: SLLogicLogger firmware (10 MHz mintavételezés) + Open Bench Logic Sniffer (PC alkalmazás) Az ábrán a MAX7219 konfigurálásának első parancsai láthatók. Bitsorrend: MSB first max7219_write(decode, 0); //Nincs dekódolás max7219_write(scanlimit, 7); //pásztázás 8 oszlopra max7219_write(intensity, 8); //Kitöltés: 17/32 max7219_write(testmode, 1); //Teszt mód be max7219_write(shutdown, 1); //Megjelenítés be #define DECODE 9 #define INTENSITY 10 //0x0A #define SCANLIMIT 11 //0x0B #define SHUTDOWN 12 //0x0C #define TESTMODE 15 //0x0F 32

Az Open Bench Logic Sniffer alkalmazás sokféle kommunikációs protokoll jeleinek értelmezésére is képes (UART, I2C, SPI stb). Itt az SPI protokoll szerinti értelmezést kértük, ennek eredménye látható a táblázatban. 33

Az SPI tranzakciók dekódolása A képen az Open Bench Logic Sniffer alkalmazás által értelmezett SPI tranzakciók láthatók, melyekben a MAX7219 konfigurálására és az adatregiszterek nullázására ismerhetünk rá. 34

Nokia 5110 kijelző vezérlése Nokia 5110 kijelző: monkróm reflexiós LCD, LED oldalvilágítással Vezérlő: PCD8544 (SPI interfész) Felbontás: 84 x 48 képpont Kivezetések: VCC, GND, LED, SCLK, DIN, D/C, CE, RST Tápfeszültség: 3,3 V 5 V 35

#include "MKL25Z4.h" #include "english_6x8_pixel.h" #include "nxp_logo.h Program8_4 A program felváltva egy bitképet, illetve egy szöveges képernyőt mutat. A bitképet az nxp_logo.h állomány tartalmazza hexadecimális adatsorként. A betűképeket az english_6x8_pixel.h állomány definiálja hexadecimális adatsorként. int main(void) { SPI0_init(); // SPI0 konfigurálása LCD_init(); while(1) { LCD_write_logo(nxp_logo); // Bitkép megjelenítés delayms(5000); // 5 s várakozás LCD_clear(); // Képernyö törlése LCD_write_string(0,0,"Nokia5110 LCD "); LCD_write_string(0,1,"driven by SPI0"); LCD_write_string(0,2,"on FRDM-KL25Z "); LCD_write_string(0,3,"--------------"); LCD_write_string(0,4,"(c) I. Cserny,"); LCD_write_string(0,5,"Febr 06, 2017."); delayms(5000); 36

void SPI0_init(void) { SIM->SCGC5 = 0x1000; // Port D engedélyezése PORTD->PCR[0] = 0x100; // PTD0 legyen GPIO módban PORTD->PCR[1] = 0x200; // PTD1 legyen SPI SCK */ PORTD->PCR[2] = 0x200; // PTD2 legyen SPI MOSI */ PORTD->PCR[4] = 0x100; // PTD4 legyen GPIO módban PORTD->PCR[5] = 0x100; // PTD5 legyen GPIO módban PTD->PDDR = 0x31; // PTD0, PTD4, PTD5 legyen kimenet PTD->PSOR = 0x11; // PTD0 és PTD4 '1' legyen SIM->SCGC4 = 0x400000; // Az SPI0 modul engedélyezése SPI0->C1 = 0x10; // SPI letiltása, master mód, MSB elöször SPI0->C2 = 0; // Alapértelmezett beállítások SPI0->BR = 0x51; // Baud rate = 1 MHz (/6 és /4 osztók) SPI0->C1 = 0x40; // Az SPI modul engedélyezése void LCD_init(void) { PTD->PCOR = 0x10; // LCD_RST lehúzása delayms(100); PTD->PSOR = 0x10; // LCD_RST felhúzása delayms(100); LCD_write_byte (0x21, 0); // use the extended command set the LCD mode LCD_write_byte (0xc8, 0); // set the bias voltage LCD_write_byte (0x06, 0); // temperature correction LCD_write_byte (0x13, 0); // 1:48 LCD_write_byte (0x20, 0); // use basic commands LCD_clear (); // clear the screen LCD_write_byte (0x0c, 0); // set display mode, the normal display 37

void LCD_write_byte(unsigned char data, unsigned char dc) { unsigned char dummy; PTD->PCOR = 1; // SS aktiválás if(dc) { PTD->PSOR = 0x20; // D/C = 1 else PTD->PCOR = 0x20; // D/C = 0 while(!(spi0->s & 0x20)); // TX kész jelre vár SPI0->D = data; // Adat küldése while(!(spi0->s & 0x80)); // Átvitel végére vár dummy = SPI0->D; // SPRF törlése PTD->PSOR = 1; // SS deaktiválása void LCD_write_logo(unsigned const char *ptr) { unsigned int ctr = 0; while(ctr++ < 504) { LCD_write_byte(*ptr++,1); void LCD_clear(void) { unsigned int i; LCD_write_byte(0x0c, 0); LCD_write_byte(0x80, 0); for (i=0; i<504; i++) LCD_write_byte(0, 1); 38

// LCD_set_XY: kurzor beállítása megadott helyre // x: karakterhely száma (0-83) // y: sor száma (0-5) void LCD_set_XY(unsigned char X, unsigned char Y) { LCD_write_byte(0x40 Y, 0); // column LCD_write_byte(0x80 X, 0); // row void LCD_write_char(unsigned char c) { unsigned char line; for (line=0; line<6; line++) LCD_write_byte(font6x8[c-32][line], 1); void LCD_write_string(unsigned char x,unsigned char y,char *s) { LCD_set_XY(x,y); while (*s) LCD_write_char(*s++); //--------------------------------------- // Késleltető függvény 48 MHz órajelhez //--------------------------------------- void delayms(int n) { int i, j; for(i = 0 ; i < n; i++) for (j = 0; j < 8010; j++); 39

Hardver követelmények: FRDM-KL25Z kártya Nokia5110 kijelző Összekötési vázlat Arduino kompatibilis lábkiosztást használunk: D13 (PTD1): SPI SCK ===> LCD SCLK D12 (PTD3): SPI MISO nem használjuk D11 (PTD2): SPI MOSI ===> LCD DIN D10 (PTD0): SPI SS ===> LCD CE D9 (PTD5) ===> LCD D/C (vagy RS) D2 (PTD4) ===> LCD RST (RESET) Kép adattá konvertálás: LCD Assistant en.radzio.dxp.pl/bitmap_converter/ 40

41

42