www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

I2C in LPC1769

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Tor Jun 30, 2015 10:18 am    Naslov sporočila:  I2C in LPC1769 Odgovori s citatom

Pozdravljeni,

prvič delam z I2C in imam nekaj vprašanj;

1. Kako nastavimo Address, je to važno ali si lahko izmislimo, če slave (LCD v mojem primeru) nima hardversko določenega naslova?
2. Ali lahko komande pošiljam LCD tako kot je napisano spodaj ali bo treba pred vsakim dodati vedno naslov:
Koda:
void SetEV(){
   GPIOSetValue(2, 4, LOW);            //A0 POSTAVI NA LOW
   I2CMasterBuffer[PORTUSED][1] = 0x81;   //Electronics Volume Mode Set
   I2CEngine();   
   I2CMasterBuffer[PORTUSED][1] = 0x28;   //Electronics Volume Register Set
   I2CEngine();   
}


Sedaj imam narejeno tako da mi v funkciji init postavi na začetku naslov in potem gre v funkcije v katerih se ti masterbuffer napolni nato pa pošlje z i2cengine.

Prosim za nasvete.

UPDATE N#1; sem naredil posebno funkcijo ki pošilja i2c, tako da vedno kličem samo tisto funcijo v kateri so parametri data in ao.

Koda:
void PosljiI2C(char data, int cmd){
   if(cmd == 0){                        //PREVERJANJE ZA POŠILJANJE KOMAND
      GPIOSetValue(2, 4, LOW);            //A0 POSTAVI NA LOW
      GPIOSetValue(2, 5, LOW);            //CS = CHIP SELECT
      I2CMasterBuffer[PORTUSED][1] = data;   //NAPOLNI BUFFER
      I2CEngine(I2C_SECTION);
      GPIOSetValue(2, 5, HIGH);
   }//********
   if(cmd == 1){                        //PREVERJANJE ZA PISANJE NA LCD
      GPIOSetValue(2, 4, HIGH);            //A0 POSTAVI NA HIGH
      GPIOSetValue(2, 5, LOW);
      I2CMasterBuffer[PORTUSED][1] = data;   //NAPOLNI BUFFER
      I2CEngine(I2C_SECTION);
      GPIOSetValue(2, 5, HIGH);
   }//********
}

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Jun 30, 2015 11:55 am    Naslov sporočila:   Odgovori s citatom

Nekaj o IIC protokolu si lahko prebereš na Wikiju. ali Sparkfunu

Načeloma pa je ta protokol namenjen povezavi enega mastra in več slave-ov na istem vodilu (istih signalnih linijah). Tako da mora načeloma imeti vsak od Slave-ov svoj unikaten naslov v mreži. Master potem da zahtevo za poslušanje, pove želeno adreso in potem komuncira samo s sužnjem z zahtevano adreso. Ostali sužnji v tem času sprostijo linijo za to komunikacijo.. Kako in kaj pa komunicirata, pa je odvisno tudi od tega, kaj LCD zahteva/pričakuje.

Moraš pa gotovo imeti tudi navodila LCDja, kjer imaš podrobneje opisan postopek komunikacije. Tam tudi piše postopek določitve adrese (ali hardversko s povezavami pinov LCDja na + oz GND, ali pa softversko z vpisom adrese v LCDjev mikrokontroler.


Nazadnje urejal/a lojzek Tor Jun 30, 2015 11:59 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Tor Jun 30, 2015 11:58 am    Naslov sporočila:   Odgovori s citatom

LCD controller je ta.

LCD pa je HEM6464. V datasheetu nikjer ne najdem za naslov, v bistvu jaz iz LCD ne bi bral nič, bi samo pisal nanj.

Zanima me najbolj to ali je potebno pisanje addresse vedno ko ponavljam komande na LCD ali samo enkrat, na začetku.

Bi mi bil kdo pripravljen pomagati, spraviti ta LCD k življenju?

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Jun 30, 2015 12:09 pm    Naslov sporočila:   Odgovori s citatom

To pa ni IIC protokol. Temveč ali 8 bitni paralelni ali 4 bitni serijski protokol. In očitno želi da so pini za komunikacijo mikro <-> LCD namenjeni samo njima. Tako da ni pravzaprav potrebno nobenega klicanja po adresi.

Ko mu daš komando, mu moraš dati tako, ki jo LCD pozna, potem pa podatke takšne, kot je potrebno da LCD izvrši komando.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Tor Jun 30, 2015 12:17 pm    Naslov sporočila:   Odgovori s citatom

Kolikor razumem zadeve bi lahko naredil tole z I2C. Imam SCL in SDa linijo na prave porte na LPC.
A0 in CS pa imam vezane na digitalne izhode LPC.

Potem je to pravzaprav SPI, toda kako in kaj je z MISO in MOSI.

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.56
Kraj: Jesenice / Lj

PrispevekObjavljeno: Tor Jun 30, 2015 1:16 pm    Naslov sporočila:   Odgovori s citatom

Kot ti je že lojzek napisal tole ni I2C ampak 4 bitni SPI, torej z I2C ne boš naredil nič.
Če sta imeni komunikacijskih linij enaki to še ne pomeni, da je tudi dejanski komunikacijski protokol enak Smile.
V datasheetu ti piše, da je SDA na D7 data input, torej je to MOSI, za output pa nikjer nisem našel (predvidevam, da branje ni mogoče).

Edit:
Če bo to edina naprava na SPI lahko CS vežeš na GND.
In pa PSB pin veži na GND da izbereš SPI.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Sre Jul 01, 2015 6:16 am    Naslov sporočila:   Odgovori s citatom

Tukaj bi ti pa jaz za nadaljevanje bolj malo lahko pomagal. Tudi jaz SPI (še) nisem uporabljal. Morebiti nekje poiščeš knjižnico za to komunikacijo, tako da ne boš imel že prvič težave z nerazumevanjem protokola.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jure94
Član
Član



Pridružen-a: Sre 05 Maj 2010 17:11
Prispevkov: 433
Aktiv.: 2.56
Kraj: Jesenice / Lj

PrispevekObjavljeno: Sre Jul 01, 2015 11:21 am    Naslov sporočila:   Odgovori s citatom

Ne vem ali to tole kaj pomaga, sem vprašal google in je bilo na prvi strani:
http://www.nxp.com/documents/application_note/AN10369.pdf
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
drVrh
Član
Član



Pridružen-a: Sre 20 Feb 2008 20:17
Prispevkov: 918
Aktiv.: 4.68
Kraj: Slovenija-Koroska-Prevalje-Lese

PrispevekObjavljeno: Čet Jul 02, 2015 1:25 pm    Naslov sporočila:   Odgovori s citatom

Sem uredi takole:

Koda:
void PosljiLCD(char data, int cmd){
   if(cmd == 0){                           //PREVERJANJE ZA POŠILJANJE KOMAND
      GPIOSetValue(A0PORT, A0PIN, LOW);            //A0 POSTAVI NA LOW
      GPIOSetValue(CSPORT, CSPIN, LOW);            //CS = CHIP SELECT
      for(for_n = 0; for_n < 8; for_n++){
         if(data & 0x80){
            GPIOSetValue(SDAPORT, SDAPIN, HIGH);
         }else{
            GPIOSetValue(SDAPORT, SDAPIN, LOW);
         }
         GPIOSetValue(SCLPORT, SCLPIN, HIGH);
         GPIOSetValue(SCLPORT, SCLPIN, LOW);
         data <<= 1;
      }
      GPIOSetValue(CSPORT, CSPIN, HIGH);
   }//********
   if(cmd == 1){                        //PREVERJANJE ZA PISANJE NA LCD
      GPIOSetValue(A0PORT, A0PIN, HIGH);            //A0 POSTAVI NA HIGH
      GPIOSetValue(CSPORT, CSPIN, LOW);
      for(for_j = 0; for_j < 8; for_j++){
         if(data & 0x80){
            GPIOSetValue(SDAPORT, SDAPIN, HIGH);
         }else{
            GPIOSetValue(SDAPORT, SDAPIN, LOW);
         }
         GPIOSetValue(SCLPORT, SCLPIN, HIGH);
         GPIOSetValue(SCLPORT, SCLPIN, LOW);
         data <<= 1;
      }
      GPIOSetValue(CSPORT, CSPIN, HIGH);
   }//********
}

_________________
Iz dneva v dan sem se spraševal kaj je to elektrika, vendar nisem našel odgovora ... in še vedno si postavljam to vprašanje
LP
Grega
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group