ARM35: LCD ir FSMC

Trumpa priešistorė: prisirinkom kažkokių PCB su STM32F103* mikroschemos ir nežinomu LCD. LCD buvo dviejų tipų, o pačios PCB irgi keletos variantų. Kai kurios su kitu STM32 BGA čipu ir ROM/RAM mikroschemom. Dar kitos PCB beveik tuščios ar pažeistos. Užtat visos turi mėlyną dantį ir visokias smulkmes.
Visokius kištukus gana lengvai išaiškinom (gerai, kad ne visos PCB padengtos laku), kai kurie primityvai kaip LCD pasvietimas (ar dar kieno) eina per tranzistorius, tai irgi lengvai atsibūrė. Bet liko LCD. LCD tikrai dviejų tipų- mažesnis, išjungtas juodas ir didesnis, baltas. Abu ekranai grafiniai, nes yra originali firmwarė, kur parašo kad “atnaujink softą”. Pirminis softas lygtai ir universalus abiem plokštėm ir jame aptikom, kad plokštės iš Husqvarnos automatinių žoliapjovių.
Deja informacijos apie LCD ekranus ar kontrolerius nebuvo visiškai. Todėl ėmiau iš eilės visokius LCD ekranus su panašiu kiekiu pinų ir bandžiau… Pagal įtampas, pagal originalios firmwarės siunčiamus signalus atrinkau, kur maždaug duomenys, kur WR ar panašūs signalai.
Mažesnis LCD labai panašu į ST7565 ir ten viskas maždaug buvo aišku. Didelis LCD visiškai neaiškus.
Dar pasirodė labai keista, kodėl pasirinktas toks keistas pajungimas prie MCU:

PD0=D2
PD1=D3
PD4=RD
PD5=WR
PD7=CS1
PD14=D0
PD15=D1
PE3=A0
PE7=D4
PE8=D5
PE9=D6
PE10=D7

Tačiau pernelyg nesivarginau. Nes svarbiau buvo LCD. Su didesniu LCD buvo bėdos- labai panašus LCD yra UltraChip serijos kontroleriai kaip UC1610 ar UC1611. Tačiau komandos nevisos veikia. Bėda tame, kad daug komandų bendros visos serijos čipams (ar net kito gamintojo čipams), kitos komandos ignoruojamos ar panašiai. Ir dar nustebino pačio LCD ekrano pilkumo atspalvių bitų seka. Net vienu metu kilo mintis, kad ten spalvoto ekrano kontroleris pritvirtintas prie juodai-balto LCD ekrano. Dar kilo mintis, kad neteisingai nurašiau pinoutą (tikrai ne, žr. toliau).
Bežaidžiant su bitais, buvo kaip ir parašytas šioks toks softas ekrano valdymui. Tačiau norint paišyti vaizdą ant ekrano pagal pikselius, reikia nuskaityti informaciją iš ekrano. Tai galima padaryti ir “bit bang” režimu ir su STM32F103 tai vyksta gana greitai. Bet vistiek viskas labai kvaila. Buvo pasiskaitytos instrukcijos, paguglinta ir pasinagrinėtas STMkubikas ir pasirodo man nežinomas FSMC režimas, kur kaikurios MCU kojos pavirsta DATA, ADR ir kontroliniais (WE, CS ir pan) signalais. Tada skaitymas iš LCD ar rašymas į LCD (ar į kokį SRAM) pavirsta paprasta operacija- “rašymas ir skaitymas iš RAM”:

*(__IO unsigned char *)(LCD_DAT_ADDR)=d;
d=*(__IO unsigned char *)(LCD_DAT_ADDR);

Ir mūsų LCD būtent ir pajungtas kaip FSMC įrenginys (dėl to ir toks keistas LCD pinouto pajungimas).
Tačiau net dvi dienas man niekas neveikė. Nes dokumentacijoje gana miglotai parašyta ir iš pirmo žvilgsnio viskas labai nelogiška. Bėda susijusi su duomenų šynos pločių ir adresu. LCD ekrano A0 pinas, kuris atskiria duomenis nuo komandų prikabintas prie A19 pino. Šio pino lygį turi reguliuoti adresu bitai:

//Musu LCD A0 pajungtas prie A19 pino.
#define LCD_CMD_ADDR 0x60000000
#define LCD_DAT_ADDR 0x60080000

Tačiau niekas neveikė. Pasirodo, mano pavyzdiniam softe buvo ne “unsigned char”, o “unsigned int” (aka uint16). Kituose pavyzdžiuose net 32 bitų kintamasis. Ir dar baisiau- net keletas straipsnių rašė, kad jei naudojam 16 bitų nuskaitymą, adresas pasislenka per vieną bitą, jei 32 bitus, per du bitus. Tačiau ir tai nepadėjo, nes mano pagrindinė klaida buvo tokia, kad nuskaičius 16 bitų iš 8 pin porto, maniau, kad mažesnieji bitai turės reikalingą informaciją. Pasirodo, kad ne. Kiek suprantu, STM čipas hardwariniam lygyje prisiderina prie “bus width” ir dar net kelis nuskaitymus ar rašymus. O jei sukonfiguruota nelogiškai, viskas ir nelogiškai veikia.
Todėl, jei reikia nuskaityti BAITĄ iš 8 laidų šynos, tai reikia C kalboje ir skaityti BAITĄ. Dar nesu tikras ar skaitant WORD iš BYTE nedaromas dvigubas nuskaitymas. Šitą reikia dar patikrinti, nes LCD ekranos softas dar kiek optimizuotusi. O dėl adreso, čia man irgi kiek neaišku, bet baitų, wordų ir longwordų adresai yra atitinkamai pasislinkę, jei norime juos nuskaityti. Pas ARM gal nėra tos bėdos kur yra pas MC68000, kur negalima skaityti pabaičiui ar panašiai iš nelyginių adresų…
Labai daug ir neaiškiai parašiau, bet čia mano “brain dump” ir ši informacija skirta man prisiminti, kaip pajungti FSMC režimą pas STM32F103. Ką dar gero duoda tas FSMC? Ogi DMA.

Kad straipsnis gautusi indomesnis, va fotkė:
LCD

Tai tas didysis ekranas, deja neįjungtas pašvietimas. Naudojamas keistokas “klasikinis” TI99 šriftas kuris gal netinkamas šiam ekranui.

Ir net trys variantai source code su viskuo: mažas ekranas bitbang, didelis ekranas bitbang ir didelis ekranas FSMC:
Husqvarna LCD ir STM32F103 FSMC.

Visas source tikrai neaptvarkyti, yra labai daug eksperimentavimo ir “reverse engineering” likučių.

*) ne visos STM32F103 palaiko FSMC. Čia STM32F103VGT6.

Ta pati plokštė palaiko kelis tipus LCD ekranų su 24 PIN jungtimi (vienas LCD buvo su PE12864URT): PINOUTAS pdf.

One reply

  1. buvo pasiektas tikslas, kad parašius:

    void test(void)
    {
    varna_pos(0,0);
    varna_printA("01234567890.+-*/");
    varna_pos(0,8);
    varna_printA("ABCDEFGHIJKLMOPQ");
    varna_pos(0,16);
    varna_printA("RSTUVWXYZ!@#$%^&");
    varna_pos(0,24);
    varna_printA("*()_+-='/?{}[]\\");
    varna_pos(0,32);
    varna_printA("WWWWWWWWWWWWWWWW");

    lcd_puts(1,40,"BETKAS",1) ;

    plotline(50,40,60,50,1);
    plotline(50,40,127,55,1);
    }

    gautusi:
    LCD

    Čia tas mažesnis ekranas su baisulingu mėlynu pašvietimu. Fotokamera net išprotėjo.

Leave a Reply

Your email address will not be published. Required fields are marked *