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