 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Sob Feb 06, 2010 12:58 am Naslov sporočila: SPI, SD & ATMEGA32 |
|
|
Zivjo,
imam tezave z komunikacijo preko SPI do SD kartice. Nikakor mi ne rata, da bi zaznal kartico. Poskusil sem ze vse mogoce, vendar mi zadeva ne pride niti cez inicializacijo. Kdaj se ustavi ze pri while(!(SPSR & (1<<SPIF))); kdaj pa sicer zadevo poslje (z osciloskopom vidim, da se clock spreminja, to dela nekaj sekund, potem pa se zadeva neuspesno inicializira. Uporabljam kodo, ki se nahaja tu
http://www.captain.at/electronic-atmega-mmc.php in po tej shemi .
Napetosti sem preveril in so vse ok (1 na izhodu vrne 3V na vhodu kartice), prav tako sem poskusil tudi drugo kodo (na netu je tega res ogromno), vendar mi nobena ne dela, za kar sumim, da je tezava v hardwaru. Vendar mi je zelo cudno, saj sem preveril celotno vezavo ze vsaj 10x (tako kot je zgornja), prav tako sem poskusil 3 razlicne SD kartice (sicer isti proizvajalec in ista kapaciteta / hitrost) in zadeva noce in noce zalaufat.
Koda: |
int MMC_Init(void) { // init SPI
char i;
PORTB |= (1 << SPICS); // disable MMC
// start MMC in SPI mode
for(i=0; i < 10; i++) SPI(0xFF); // send 10*8=80 clock pulses
PORTB &= ~(1 << SPICS); // enable MMC
if (Command(0x40,0,0,0x95) != 1) goto mmcerror; // reset MMC
st: // if there is no MMC, prg. loops here
if (Command(0x41,0,0,0xFF) !=0) goto st;
return 1;
mmcerror:
return 0;
}
|
Tezava se pojavi tu, tale if (Command(0x40,0,0,0x95) != 1) mi nikol ne vrne 1, ampak vedno 0xFF.
Sem pa opazil tudi nekaj drugega, kar si ne znam najbolj razlagati. Ne glede na to, kaksen SPI clock nastavim z SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); (v tem primeru /128) mi vedno dela CLOCK z 60khz. Ne vem ali je to pravilno ali ne, vendar si ne znam razlagat zakaj se tega ne da spremenit. Ce poskusim npr. samo z SPR0 ali SPR1, zadeva dela z istim clockom (z osciloskopom merim SPI SCK signal - konkretno PB7)
Sploh ne vem kaj naj se naredim, s tem se ukvarjam ze cel teden in mi nikakor ne rata zadevo resit. Prav tako sem poskusil ze vse zive vezave od drugih ljudi, prav tako sem poskusil z drugim ATMEGA32.
Je pa se en hec, ki se mi pojavlja. Ce zelim atmega32 programirati, moram odstraniti kartico iz slotha (tudi ce dam SS na 0). Samo za info, ce bi kdo kaj povezal... Mogoce je tudi to kaksna indikacija zacetniskega problema?
Prosil bi za kakrsnokoli idejo, nasvet, izkusnjo .. ki bi mi pomagala na poti do resitve tezave.
Hvala!
lp mare |
|
Nazaj na vrh |
|
 |
smatjaz Član


Pridružen-a: Pon 10 Nov 2003 16:33 Prispevkov: 847 Aktiv.: 3.57
|
Objavljeno: Sob Feb 06, 2010 8:51 am Naslov sporočila: |
|
|
Zamenjaj SD karticio. Ne vem za kakšen datotečni sistem gre, ampak poskusi z 1G, 2G kartico. Meni z 4G to ne deluje.
LP M. _________________ Električni aparati delujejo na dim ... ko dim iz njih uide ... ne delujejo več! |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Sob Feb 06, 2010 9:45 am Naslov sporočila: |
|
|
smatjaz je napisal/a: |
Zamenjaj SD karticio. Ne vem za kakšen datotečni sistem gre, ampak poskusi z 1G, 2G kartico. Meni z 4G to ne deluje.
LP M. |
Zivjo,
bom poskusil, vendar jaz do datotecnega sistema sploh ne pridem. Se mi ustavi ze pri inicializaciji. Najbrz ti 4GB ne dela, ker uporabljast FAT16, ki pa je omejen na 2GB? |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Pon Feb 08, 2010 1:36 am Naslov sporočila: |
|
|
Sem poskusil z 512 MB in tudi ne deluje. Ima se kdo kaksno idejo kaj bi lahko bilo narobe in kaj naj pogledam?
Hvala!
lp m |
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Pon Feb 08, 2010 1:18 pm Naslov sporočila: |
|
|
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1?  |
|
Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.27 Kraj: Yogyakarta
|
Objavljeno: Pon Feb 08, 2010 3:46 pm Naslov sporočila: |
|
|
jaz sem imel probleme z SD kartico na PIC-u
na koncu sem ugotovil da MPLAB SPI funkcija ko bere iz vodila pošlje 0x00, no poslati moraš pa 0xFF da prebereš. In se komunikacija obesi. Preveri najprej to!
tukaj so pa moje init rutine v Cju, ampak kot rečeno za PIC18F, morda ti kaj pomagajo
Koda: |
char initMMC(void)
{
char tmp;
char cTmp;
int cnt;
EN_FLASH = 1;
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
enableSD();
commandSDcr( 0x40, 0x00, 0x00, 0x00, 0x00 ); //CMD0
if (R1SD() != 0x01)
{
if (_DEBUG_ == 1)
writesUSBcr("TimeOUT!!!\r\nX");
disableSD();
return 0;
}
cnt = 0x20;
cTmp = 0xFF;
while ( (cnt>0) && (cTmp!=0x00) )
{
WriteSPI1(0x41);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x95);
cTmp = R1SD();
cnt--;
delay_ms(25);
}
disableSD();
if (cTmp == 0x00)
return 1;
return 0;
}
/**/
char initSD(void)
{
char tmp;
char cTmp;
int cnt;
EN_FLASH = 1;
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
WriteSPI1(0xFF);
enableSD();
commandSDcr( 0x40, 0x00, 0x00, 0x00, 0x00 ); //CMD0
if (R1SD() != 0x01)
{
if (_DEBUG_ == 1)
writesUSBcr("TimeOUT!!!\r\nX");
disableSD();
return 0;
}
disableSD();
cnt = 0x20;
cTmp = 0xFF;
while ( (cnt>0) & (cTmp != 0x00) )
{
enableSD();
WriteSPI1(0x77);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x95);
//commandSDcr( 0x77, 0x00, 0x00, 0x00, 0x00 );
R1SD();
disableSD();
delay_ms(50);
enableSD();
WriteSPI1(0x69);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x00);
WriteSPI1(0x95);
//commandSDcr( 0x69, 0x00, 0x00, 0x00, 0x00 );
cTmp = R1SD();
cnt--;
disableSD();
delay_ms(100);
}
//disableSD();
if (cTmp != 0x00)
return 0;
/**
enableSD();
commandSDcr( 0x50, 0x00, 0x00, 0x02, 0x00 ); //CMD0
R1SD();
disableSD(); /**/
return 1;
}
|
_________________ Bad things happen to good people all the time for no reason!
Blog |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Tor Feb 09, 2010 1:01 am Naslov sporočila: |
|
|
bungee je napisal/a: |
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1?  |
Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Hvala!
mare |
|
Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.27 Kraj: Yogyakarta
|
Objavljeno: Tor Feb 09, 2010 8:33 am Naslov sporočila: |
|
|
pa mislim da ti v init rutini tudi manjka najprej ukaz 0x40, 0x00, 0x00, 0x00
vrini še to predno pošlješ Command(0x40,0,0,0x95)
Koda: |
commandSDcr( 0x40, 0x00, 0x00, 0x00, 0x00 ); //CMD0
if (R1SD() != 0x01)
{
if (_DEBUG_ == 1)
writesUSBcr("TimeOUT!!!\r\nX");
disableSD();
return 0;
}
|
pa pazi tudi na odgovore ker so lahko od 1 do 4bajte (in tudi do 16) dolgi odvisno od ukaza, prebrati moraš pa vse. Ni nujnu tudi da ti takov naslednji bajt odgovori kartica, sploh pri init ne! Kar pomeni da moraš na 0x01 odgovor počakati par ms.
Se pravi bereš iz SPI vodila dokler ne dobiš 0x01 odgovora v nekem doglednem času. _________________ Bad things happen to good people all the time for no reason!
Blog |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3362 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Tor Feb 09, 2010 10:32 pm Naslov sporočila: |
|
|
marko je napisal/a: |
bungee je napisal/a: |
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1?  |
Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Hvala!
mare |
100%. Delam s tem sicer z Bascomom, a napetost, ki je potrebna za detektiranje enojke ni odvisna od programskega jezika, kaj ne? |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Sre Feb 10, 2010 11:10 am Naslov sporočila: |
|
|
vilko je napisal/a: |
marko je napisal/a: |
bungee je napisal/a: |
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1?  |
Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Hvala!
mare |
100%. Delam s tem sicer z Bascomom, a napetost, ki je potrebna za detektiranje enojke ni odvisna od programskega jezika, kaj ne? |
a to je bilo meni namenjeno? Ker ce, ne razumem kaj si hotel povedati.
marko |
|
Nazaj na vrh |
|
 |
vilko Član



Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3362 Aktiv.: 14.18 Kraj: Dragomer
|
Objavljeno: Sre Feb 10, 2010 11:24 am Naslov sporočila: |
|
|
Uh, a sem bil tako nejasen?
Napisal sem, da imam izkušnje in da je napetost, ki jo daje SD kartica (3,3V) preverjno v redu za vhod v mikrokrmilnik kot logična enojka. |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Sre Feb 10, 2010 12:47 pm Naslov sporočila: |
|
|
vilko je napisal/a: |
Uh, a sem bil tako nejasen?
Napisal sem, da imam izkušnje in da je napetost, ki jo daje SD kartica (3,3V) preverjno v redu za vhod v mikrokrmilnik kot logična enojka. |
Aha, ok
No tudi jaz sem to preveril in res da logicno 1 vse kar je nad 3V.
marko |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Pet Feb 12, 2010 2:03 am Naslov sporočila: |
|
|
red_mamba je napisal/a: |
pa mislim da ti v init rutini tudi manjka najprej ukaz 0x40, 0x00, 0x00, 0x00
vrini še to predno pošlješ Command(0x40,0,0,0x95)
Koda: |
commandSDcr( 0x40, 0x00, 0x00, 0x00, 0x00 ); //CMD0
if (R1SD() != 0x01)
{
if (_DEBUG_ == 1)
writesUSBcr("TimeOUT!!!\r\nX");
disableSD();
return 0;
}
|
pa pazi tudi na odgovore ker so lahko od 1 do 4bajte (in tudi do 16) dolgi odvisno od ukaza, prebrati moraš pa vse. Ni nujnu tudi da ti takov naslednji bajt odgovori kartica, sploh pri init ne! Kar pomeni da moraš na 0x01 odgovor počakati par ms.
Se pravi bereš iz SPI vodila dokler ne dobiš 0x01 odgovora v nekem doglednem času. |
Končno mi je uspelo, da lahko zapisem in preberem (gole podatke). Sedaj se bom lotil se FAT-a.
Sicer pa, kot je omenil red_mamba, sem dodal se funkcijo se klic while (Command(0x40,0,0,0x95) != 1); na zacetku. Zvezal sem pa po tej shemi http://www.sparkfun.com/commerce/tutorial_info.php?tutorials_id=65.
Funkcija sedaj za inicializacijo izgleda takole:
Koda: |
int MMC_Init(void) { // init SPI
char i;
PORTB |= (1 << SPICS); // disable MMC
// start MMC in SPI mode
for(i=0; i < 10; i++) SPI(0xFF); // send 10*8=80 clock pulses
PORTB &= ~(1 << SPICS); // enable MMC
while (Command(0x40,0,0,0x95) != 1); // tole je tu samo zacasno, todo je narediti se timeout detection
st: // if there is no MMC, prg. loops here
if (Command(0x41,0,0,0xFF) !=0)
{
uart_write("NO CARD INSERTED\r\n");
goto st;
}
uart_write("Initialization ok\r\n");
return 1;
mmcerror:
uart_write("Initialization failed\r\n");
return 0;
}
|
Hvala za pomoč! |
|
Nazaj na vrh |
|
 |
red_mamba Član


Pridružen-a: Ned 20 Feb 2005 17:56 Prispevkov: 1486 Aktiv.: 6.27 Kraj: Yogyakarta
|
Objavljeno: Pet Feb 12, 2010 8:13 am Naslov sporočila: |
|
|
sam da špila
jaz moram še eno zadevo raziskati pri svojih funkcijah. Na istem vodilu sem namreč imel RTC čip in SD kartico in se mi je vsake toliko SD obesil in nisem mogel niti RTC čipa brat.
Pa moram narediti FAT32 podporo. Sedaj bom se bom lotil CD changer emulatorja za Blaupunkt avtoradio pa bom to poizkusil urihtati  _________________ Bad things happen to good people all the time for no reason!
Blog |
|
Nazaj na vrh |
|
 |
marko Član



Pridružen-a: Sre 07 Jan 2004 15:14 Prispevkov: 755 Aktiv.: 3.19
|
Objavljeno: Sre Apr 14, 2010 7:18 am Naslov sporočila: |
|
|
red_mamba je napisal/a: |
sam da špila
jaz moram še eno zadevo raziskati pri svojih funkcijah. Na istem vodilu sem namreč imel RTC čip in SD kartico in se mi je vsake toliko SD obesil in nisem mogel niti RTC čipa brat.
Pa moram narediti FAT32 podporo. Sedaj bom se bom lotil CD changer emulatorja za Blaupunkt avtoradio pa bom to poizkusil urihtati  |
Živjo,
si ugotovil zakaj se vse skupaj kdaj obesi? Meni se to pogosto dogaja, v bistvu se mi tudi obesi ISP, ko hocem programirat avr. Mi javi, da ne obstaja device sploh. Sele ko dam kartico ven, stece programiranje normalno. Ocitno mu ne pase, da sta na istem vodilu AVR in SD. Imam pullup upor na SS od SD kartice, pa nic ne pomaga. Tale SPI mi gre posteno na zivce
Je kdo uporabljal tako komunikacijo z line driverjem? se kaj bolje obnese kot z upori?
Marko |
|
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: 497 dni
Powered by phpBB © 2001, 2005 phpBB Group
|