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

Problem z odczytem sektrów z karty SD [Atmega16]

bursianin 01 Mar 2011 14:27 2201 2
REKLAMA
  • #1 9220474
    bursianin
    Poziom 2  
    Witam wszystkich.

    Piszę, ponieważ mam spory problem, który dotyczy karty SD. Wiem, że zaglądają tu mądrzy ludzie i będą mi w stanie pomóc. Dodam tylko ,że cały czas się uczę programować :D. Mam napisaną obsługę wyświetlacza ze sterownikiem hd44780 i klawiaturę matrycową (qwerty z dodatkowymi polskimi znakami). Niedawno zacząłem zabawę z obsługą karty SD i mam problem przy napisaniu kodu, który poprawnie by ją inicjował i odczytywał z niej konkretne sektory (nie interesuje mnie w tej chwili system plików fat). Dodam również, że chcę tylko odczytywać sektory (zapis nie jest mi potrzebny) i wyświetlić je na LCD [2x16] z powyższym sterownikiem.

    Potrzebuje pomocy ludzi, którzy w tym temacie się dużo bardziej orientują ode mnie. Od razu zaznaczam, że nie potrzebuję rad w stylu "weź obsługę karty z działających stron, czy projektów", bo w tym temacie naprawdę dużo przejrzałem.

    Potrzebuję odpowiedzi na takie pytania jak:
    1. Jak dokładnie sprawdzić, czy moja karta w ogóle się inicjuje?
    2. Czy program, który jest napisany w oparciu o informację z różnych stron (głównie captaina) jest poprawny?
    3. Jeśli karta się inicjuje, to jak odczytać z niej konkretne sektory?

    Dodam, że podłączenie karty (po SPI) sprawdzałem już zarówno z dzielnikami zbudowanymi z rezystorów 3,3[kOhm] i 2,2 [kOhm] jak i bez nich. Napięcie zasilania karty SD stabilizuję na poziomie 3,3 [V] stabilizatorem TS1117.
    W sumie mam to wykonane według tego schematu:
    Problem z odczytem sektrów z karty SD [Atmega16]

    Karta,którą chcę obsłużyć to karta microSD wsadzona w adapter SD Kingston 512

    Mam na niej zapisane dwa pliki tekstowe pod nazwą:
    plik_numer_1 -> w środku jest zapisane: dane.1
    plik_numer_2 -> w środku jest zapisane: dane.2

    W Winhexie mam tak zapisane sektory:
    Problem z odczytem sektrów z karty SD [Atmega16]
    Problem z odczytem sektrów z karty SD [Atmega16]

    Mój kod programu:

    
    
    #define F_CPU 8000000
    
    #include <avr/io.h>
    #include <avr/iom16.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include <util/delay.h>
    #include <hd44780.c>
    
    #define SPIDI 5   // Port B bit 5 (pin6): data in (data from SD)
    #define SPIDO 6   // Port B bit 6 (pin7): data out (data to SD)
    #define SPICLK 7  // Port B bit 7 (pin8): clock
    #define SPICS 4   // Port B bit 4 (pin5): chip select for SD
    
    char bufor[512];
    char LCD_Linia_1[16];
    char LCD_Linia_2[16];
    
    int main(void) 
    
    {
    LCD_Initalize();      //Inicjalizacja LCD
    LCD_Clear();
    
    
    //====================Inicjalizacja SPI====================//
    void SPI_Init(void)
    {
    cli();					//Wylaczenie przerwan
    DDRB &= ~(1 << SPIDI);  //Ustawienie DI  jako wejście
    DDRB |=  (1 << SPICLK); //Ustawienie CLK jako wyjście
    DDRB |=  (1 << SPIDO);  //Ustawienie DO  jako wyjście
    DDRB |=  (1 << SPICS);  //Ustawienie CS  jako wyjście
    //Wlaczenie SPI jako Master, 
    //CLK 8000000/128=62,5kHz, MSB pierwsze
    SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0)| (1 << SPR1);
    PORTB &= ~(1 << SPICS);
    sei();					//Wlaczenie przerwan
    }
    //=========================================================//
    
    
    //===================Wlaczenie karty SD====================//
    void CS_Start(void)
    {
    	PORTB &= ~(_BV(SPICS));
    }
    //=========================================================//
    
    
    //===================Wylaczenie karty SD===================//
    void CS_Stop(void)
    {
    	PORTB |= (_BV(SPICS));
    }
    //=========================================================//
    
    
    //==================Wysylanie przez SPI====================//
    char SPI_sendchar(char wiadomosc) 
    
    {
    	unsigned char received;
    	CS_Start();
    	SPDR = wiadomosc;
    	while(!(SPSR & (1<<SPIF)));
    	received = SPDR;
        return (received);
    	CS_Stop();
    }
    //=========================================================//
    
    
    //=============Wysylanie komendy do karty SD===============//
    char Command(char cmd, uint16_t ArgH, uint16_t ArgL, char crc ) 
    {
         SPI_sendchar(0xFF);
         SPI_sendchar(cmd);
         SPI_sendchar((uint8_t)(ArgH >> 8));
         SPI_sendchar((uint8_t)ArgH);
         SPI_sendchar((uint8_t)(ArgL >> 8));
         SPI_sendchar((uint8_t)ArgL);
         SPI_sendchar(crc);
         SPI_sendchar(0xFF);
         return SPI_sendchar(0xFF); 
    }
    //=========================================================//
    
    
    //=================Inicjowanie karty SD====================//
    int SD_Init(void) 
    
    {
       char i;
       
       CS_Stop();
       for(i=0; i < 10; i++) 
       SPI_sendchar(0xFF);                
       CS_Start();
    
       if (Command(0x40,0,0,0x95) != 1) 
       goto mmcerror; 
    
       st: 
       if (Command(0x41,0,0,0xFF) !=0) 
       goto st;
    
       return 1 ;
       mmcerror:
       return 0 ;
    
    }
    
    int SD_Read(void) 
    
    {
        int i;
        if (Command(0x51,0,512,0xFF) !=0)
    
    	{
        return 1;
        }
    
        CS_Start();
    
        while(SPI_sendchar(0xFF) != (char)0xFE);
        for(i=0; i < 512; i++) 
    
    	{
            bufor[1]= SPI_sendchar(0xFF);
        }
    
        SPI_sendchar(0xFF);
        SPI_sendchar(0xFF);
    
        CS_Stop();
    
        return 0;
    
    }
    
    while(1)
    {
      
    	LCD_GoTo(0,0);
    	sprintf(LCD_Linia_1,"bufor=%u  ",bufor);
    	LCD_WriteText(LCD_Linia_1);
    	_delay_ms(200);	
    }
    
    
    }
    


    Jak odczytać sektor pod, którym jest zapisany plik_numer1 i plik_numer1?

    Czy ktoś będzie mi w stanie podpowiedzieć jak to zrobić?
  • REKLAMA
  • #2 9221599
    LordBlick
    VIP Zasłużony dla elektroda
    Jeśli nie interesuje ciebie FAT, to pozostaje wczytanie każdego sektora do bufora i kolejno sprawdzenie, czy zawiera poszukiwany ciąg znaków...
  • #3 9228474
    bursianin
    Poziom 2  
    No właśnie o to mi chodzi, tylko jak to zrealizować??? Za każdym razem, nawet jak mam wyjętą kartę to na LCD wyświetla mi "bufor=122". Po włożeniu karty do slotu SD cały czas mam taki sam napis. W sumie nie wiem właśnie jak odczytać z karty SD np. sektor 1960, gdzie jest zapisany plik .txt ? Czy potrzebuję jakieś procedury jeszcze do odczytu sektora?
REKLAMA