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 

SPI, SD & ATMEGA32
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Sob Feb 06, 2010 12:58 am    Naslov sporočila:  SPI, SD & ATMEGA32 Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
smatjaz
Član
Član



Pridružen-a: Pon 10 Nov 2003 16:33
Prispevkov: 847
Aktiv.: 3.57

PrispevekObjavljeno: Sob Feb 06, 2010 8:51 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Sob Feb 06, 2010 9:45 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Pon Feb 08, 2010 1:36 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Pon Feb 08, 2010 1:18 pm    Naslov sporočila:   Odgovori s citatom

Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1? Think
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.27
Kraj: Yogyakarta

PrispevekObjavljeno: Pon Feb 08, 2010 3:46 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Tor Feb 09, 2010 1:01 am    Naslov sporočila:   Odgovori s citatom

bungee je napisal/a:
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1? Think


Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Smile Hvala!

mare
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.27
Kraj: Yogyakarta

PrispevekObjavljeno: Tor Feb 09, 2010 8:33 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3362
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Tor Feb 09, 2010 10:32 pm    Naslov sporočila:   Odgovori s citatom

marko je napisal/a:
bungee je napisal/a:
Si prepričan, da je 3.3V dovolj da ATMEGA prepozna nivo kot logično 1? Think


Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Smile 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Sre Feb 10, 2010 11:10 am    Naslov sporočila:   Odgovori s citatom

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? Think


Hm, sem preveril datasheet in je logicna 1 vse nad 3V. Bom pa vseeno tudi sam preveril, mogoče je res tu zajec Smile 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3362
Aktiv.: 14.18
Kraj: Dragomer

PrispevekObjavljeno: Sre Feb 10, 2010 11:24 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Sre Feb 10, 2010 12:47 pm    Naslov sporočila:   Odgovori s citatom

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 Smile

No tudi jaz sem to preveril in res da logicno 1 vse kar je nad 3V.

marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Pet Feb 12, 2010 2:03 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1486
Aktiv.: 6.27
Kraj: Yogyakarta

PrispevekObjavljeno: Pet Feb 12, 2010 8:13 am    Naslov sporočila:   Odgovori s citatom

sam da špila Very Happy

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 Mr. Green

_________________
Bad things happen to good people all the time for no reason!
Blog
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
marko
Član
Član



Pridružen-a: Sre 07 Jan 2004 15:14
Prispevkov: 755
Aktiv.: 3.19

PrispevekObjavljeno: Sre Apr 14, 2010 7:18 am    Naslov sporočila:   Odgovori s citatom

red_mamba je napisal/a:
sam da špila Very Happy

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 Mr. Green


Ž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 Smile

Je kdo uporabljal tako komunikacijo z line driverjem? se kaj bolje obnese kot z upori?

Marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Elektronika Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
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: 497 dni


Powered by phpBB © 2001, 2005 phpBB Group