logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATmega8 i SD przez SPI - brak startu danych 0xFE przy odczycie sektora

Batmanmen 07 Sie 2007 22:46 2398 7
REKLAMA
  • #1 4156332
    Batmanmen
    Poziom 15  
    Posty: 205
    Pomógł: 9
    Ocena: 4
    Witam.
    Próbuje do ATmegi 8 podłączyć kartę SD po SPI. Inicjalizacja przebiega poprawnie, gdyż otrzymuję odpowiedź 0x01 na CMD0 i CMD1 i CMD16. Gdy próbuję odczytać sektor danych ( 512 bajtów ) to odpowiedź jest 0x01 ale nie przychodzi bajt startu danych 0xFE, juz nie wspominając o danych.
    W załączniku funkcje :
    inicjalizacja SPI, wysyłanie bajtu przez SPI, wysyłanie komendy do karty, inicjalizacja karty, odczyt sektora.


    Proszę o wskazówki.
    Załączniki:
    • zalacznik.txt (3.79 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 4156548
    markosik20
    Poziom 33  
    Posty: 2263
    Pomógł: 208
    Ocena: 147
    Załączników brak niestety :)
  • REKLAMA
  • Pomocny post
    #3 4156892
    markosik20
    Poziom 33  
    Posty: 2263
    Pomógł: 208
    Ocena: 147
    Korzystałem z tych samych wzorców i też nie mogłem się dogadać z kartą SD. :wink:. Pomogło dokładne przestudiowanie specyfikacji i zrobienie paru zmian w funkcjach sterująych.
    Załączam plik z wszystkimi funkcjami. Komunikacja z SD zrobiona na Atmedze8.
    Załączniki:
    • karta_SD.txt (6.35 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #5 4157571
    markosik20
    Poziom 33  
    Posty: 2263
    Pomógł: 208
    Ocena: 147
    Ja wykorzystałem zatrzask 74LVX244 (ten który "rozumie" logikę 3V i 5V).
    Atmega jest zasilana z 5V tylko dlatego że podkręciłem ją do 24Mhz, natomiast karta SD zasilana 3V z LM317. Gdzieś obiło mi się o oczy że można kartę zasilić 5V (ale to niesprawdzone informacje), co do dzielnika rezystorowego to nie wiem jak Atmega zrozumie "co karta wysyła" więc mogą być błędy na odczytach. Z karty udało mi się "wyciągnąć" dane z max 19Mbit/s (na ARM'ie) choć producent podaje 25Mbit/s. W Atmedze te 12Mbit/s działało pięknie choć muszę przyznać ze karta musi być dobrze zainicjalizowana w trybie SPI bo potem moga pojawić się błędy :wink:
  • REKLAMA
  • #6 4157797
    Batmanmen
    Poziom 15  
    Posty: 205
    Pomógł: 9
    Ocena: 4
    Ja zasilam atmege8 5V a kartę 3,3. Redukcja napięcia za pomocą dzielników rezystancyjnych.
  • REKLAMA
  • #7 4158916
    BoskiDialer
    Poziom 34  
    Posty: 1530
    Pomógł: 353
    Ocena: 42
    Porównująć załącznik z pierwszego postu z moim kodem, wygląda to w miarę poprawnie.. co mi się odrazu rzuciło w oczy, to błąd w tej linijce:
      while(spi_tx_rx(0xff) != SD_STARTBLOCK_READ) //zaczekajmy na początek bloku danych...tylko 50 cylki

    - brakuje średnika, przez co pętla for odczytująca blok danych jest wykonywana po nieodebraniu początku bloku... pewnie dlatego brakuje bajtu początku bloku - zostaje on niejako wchłonięty podczas tego odczytu...

    warto też dodać dodatkowe 8 cykli zegara po dezaktywowaniu karty [bit_set(MMC_PORT,MMC_CS);]
  • #8 4226821
    Batmanmen
    Poziom 15  
    Posty: 205
    Pomógł: 9
    Ocena: 4
    Udało mi się nawiązać połączenie z kartą SD, potrafię odczytywać, wszystko się zgadza ale jeśli chodzi o zapis to nic nie działa. Załączam funkcje zapisu, wydaje się ok, zresztą zgapiona od innych:
    unsigned char sd_writesector (unsigned long sector) 
    { 
      unsigned int i; 
      unsigned char r1,repeat=0; 
    
        
      sector = (sector <<9); 		//*512
      ss_wybierz();
      while((r1 = sd_cmd(24,sector)) == 0x01);
    
      spi(0xFF);
      spi(0xFE);	//FE 
      
      for(i = 0; i < 512; i++)
       		spi(0x41);
     
       
      spi(0x49);spi(0x80);		//CRC, tutaj nie ważne 
        
     
      while((r1 = spi(0xFF)) & 0x80);
    	
      ss_odznacz();
      return 0; 
    } 

    Funkcja jest funkcją testową dlatego używam pętli nieskończonych żeby mieć pewność że funkcja się zakończy. Umnie funkcja zapisu wykonuje się cała, co oznacza że dostaje poprawne odpowiedzi, dziwne?! Karta nie jest zablokowana przed zapisem, sprawna.

    Ma może ktoś jakiś pomysł...?

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z komunikacją między mikrokontrolerem ATmega8 a kartą SD poprzez interfejs SPI. Inicjalizacja karty przebiega poprawnie, potwierdzona odpowiedziami 0x01 na komendy CMD0, CMD1 i CMD16, jednak przy próbie odczytu sektora danych (512 bajtów) nie pojawia się oczekiwany bajt startu danych 0xFE, a dane nie są odbierane. Wskazano potencjalny błąd w kodzie – brak średnika po warunku pętli oczekującej na bajt startu danych, co powoduje nieprawidłowe odczytywanie i „wchłanianie” tego bajtu. Zalecane jest także dodanie dodatkowych 8 cykli zegara po dezaktywacji karty. Poruszono kwestie zasilania: ATmega8 zasilana jest napięciem 5V, a karta SD 3,3V, z redukcją napięcia za pomocą dzielników rezystancyjnych lub bufora 74LVX244, który obsługuje logikę 3V i 5V. Wspomniano o konieczności dokładnego studiowania specyfikacji karty SD i dostosowania funkcji sterujących SPI. Autor zgłasza również problem z zapisem na kartę, mimo że funkcja zapisu wydaje się poprawna i zwraca oczekiwane odpowiedzi, zapis jednak nie jest realizowany.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA