|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Tor Jun 30, 2015 10:18 am Naslov sporočila: I2C in LPC1769 |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Tor Jun 30, 2015 11:55 am Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Tor Jun 30, 2015 11:58 am Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Tor Jun 30, 2015 12:09 pm Naslov sporočila: |
|
|
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 |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Tor Jun 30, 2015 12:17 pm Naslov sporočila: |
|
|
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 |
|
|
jure94 Član
Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.55 Kraj: Jesenice / Lj
|
Objavljeno: Tor Jun 30, 2015 1:16 pm Naslov sporočila: |
|
|
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 .
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Sre Jul 01, 2015 6:16 am Naslov sporočila: |
|
|
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 |
|
|
jure94 Član
Pridružen-a: Sre 05 Maj 2010 17:11 Prispevkov: 433 Aktiv.: 2.55 Kraj: Jesenice / Lj
|
|
Nazaj na vrh |
|
|
drVrh Član
Pridružen-a: Sre 20 Feb 2008 20:17 Prispevkov: 918 Aktiv.: 4.66 Kraj: Slovenija-Koroska-Prevalje-Lese
|
Objavljeno: Čet Jul 02, 2015 1:25 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|