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

[atmega8L][C] problem z podpięciem karty SD

przemek610 02 Gru 2009 15:28 2090 5
REKLAMA
  • #1 7336186
    przemek610
    Poziom 11  
    Witam korzystam ze schematu i bibliotek w celu podłączenia się do karty SD ze strony:

    Strona projektu

    Schemat

    Biblioteka

    Projekt jest dobrze okomentowany... więc zakładam że rozwiązania są ok.

    Niestety ja nie mogę uzyskać efektu w postaci odczytu z karty. Testowałem na karcie:
    # panasonic SD -2 GB -> brak odzewu przy inicjalizacji
    # sandisc SD -> 2GB -> inicjalizacja zazwyczaj OK, przy READ_SECTOR błąd numer 4 - nieznana komenda dla karty
    # noname SD 128 -> brak odzewu przy inicjalizacji

    Czy ktoś może miał problem z realizacją podobnego projektu? Albo dysponuje sprawdzonym schematem działającym pod 3.3V (tak jak Atmega8L) lub biblioteką??

    Wydaje mi się że sprawdziłem wszystkie możliwości i skończyły mi się pomysły... problem pewno jest w jakimś detalu dlatego poszukuje sprawdzonego rozwiązania.

    Pozdrawiam
    Z góry dzięki za pomoc.

    P.S. jeśli to pomoże mogę wkleić kod który wgrywam do atmegi [napisany w C].
  • REKLAMA
  • #2 7336253
    mpietras
    Poziom 17  
    Odpinasz programator gdy obsługujesz kartę?
  • REKLAMA
  • #3 7336898
    przemek610
    Poziom 11  
    tak programator jest odpięty...

    u mnie pod SPI podpięty mam też wyświetlacz graficzny jednak jego inicjalizację robię dopiero po próbie dostępu do karty. wybór wyświetlacza podpięty jest pod nóżkę SS w atmedze a kod który inicjalizuje kartę to :

    
    PORTB = 0xEF;
    DDRB  = 0xEF; //MISO line i/p, rest o/p
    


    a więc port SS jest ustawiony w stan wyjścia, w stanie wysokim(wyswietlacz jest z Nokia 3310, aktywny jest podczas gdy na SS pojawi się stan niski). Wydaje mi się że wyświetlacz nie powinien być problemem bo nawet jeśli linia SS będzie w stanie niskim to dane pójdą za razem na kartę i na wyświetlacz. Wyświetlacz będzie miał problem z rozumieniem komend ale karta powinna i tak odpowiedzieć poprawnie... co niestety nie ma miejca.

    Zastanawiałem się czy nie trzeba by podciągnąć ewentualnie do masy wszystkich nóżek idących do złącza karty przez rezystorki 3kOm jak to ma miejsce w wersjach przeznaczonych na atmega8 zasilaną 5V napięciem.(Schemat) Co myślicie o takim pomyśle?? Przy 5V problemem są poziomy napięć wychodzących z mikroprocka więc pewno po to tam użyli rezystorów, u mnie problemu takiego nie ma ale łapię się każdej deski ratunku.
  • REKLAMA
  • #4 7364833
    mpietras
    Poziom 17  
    Może napięcie zasilania na karcie za niskie, miałem taki problem z wyświetlaczem od s65. Niby ma być zasilany 2,9V ale najlepiej działa gdy wszystko zasilam z 5V bez dzielników napięcia na liniach starujących. Co do podciągnięcia to raczej podciągałbym do Vcc. Spróbuj jeszcze odłączyć wyświetlacz.
  • REKLAMA
  • #5 7380874
    Mergot
    Poziom 11  
    Wydaje mi się, że problem może leżeć w inicjalizacji kart, skoro biblioteki są sprawdzone.
    Pojawia się pytanie, czy SPI jest prawidłowo ustawione w uC, czy porty ustawione są jako wyjścia itd..

    Ja podłączając Mega8L do SD nie korzystałem z oporników na liniach komunikacji - wszystko bezpośrednio - odczyt działał prawidłowo.
    (używałem innych bibliotek, ale to nie powinno mieć znaczenia)

    edit:
    Dodatkowe pytanie:
    karta jest sformatowa na w windows (fat16/32 ntfs), czy po prostu pusta?

    Moje ustawienie portów:
    
     #define MMC_CS_BIT		2		//Pin number for MMC_CS
     #define MMC_CS_PORT 	PORTB   //Port where MMC_CS is located
     #define MMC_CS_DDR 	DDRB    //Port direction register where MMC_CS is located
     #define MMC_SCK_BIT	5
     #define MMC_SCK_PORT   PORTB
     #define MMC_SCK_DDR    DDRB
     #define MMC_MISO_BIT	4
     #define MMC_MISO_PORT  PORTB
     #define MMC_MISO_DDR   DDRB
     #define MMC_MOSI_BIT	3
     #define MMC_MOSI_PORT  PORTB
     #define MMC_MOSI_DDR   DDRB
    


    Sama inicjacja karty:
    
    void init_spi (void)
    {
    
    	sbi(MMC_CS_PORT,MMC_CS_BIT);		//MMC_CS set 1
    	sbi(MMC_CS_DDR,MMC_CS_BIT);			//MMC_CS output
    
    	cbi(MMC_SCK_PORT,MMC_SCK_BIT);		//SCK set 0
    	sbi(MMC_SCK_DDR,MMC_SCK_BIT);		//SCK output
    
    	cbi(MMC_MISO_DDR,MMC_MISO_BIT);		//MISO input
    
    	cbi(MMC_MOSI_PORT,MMC_MOSI_BIT);	//MOSI set 0
    	sbi(MMC_MOSI_DDR,MMC_MOSI_BIT); 	//MOSI output
    }
    
  • #6 7381352
    gelmi
    Poziom 10  
    1. Ja bym wyrzucił rezystory z linii SPI bo będziesz miał tam spadek napięcia i już mogą być problemy nawet z samą inicjalizacją.
    2. 8 i 9 pin karty SD ma być podciągnięty przez rezystor do zasilania inaczej "cuda" mogą się dziać.
    3. Na początek nie kombinuj z biblioteką tylko spróbuj zainicjalizować samemu karty (SanDiskManual). Będziesz wiedział, że elektronika jest dobra. Pamiętaj, że podczas inicjalizacji prędkość ma być < 400 kHz.

    To mój kod inicjalizacji karty w C:

    
    unsigned char SPI_CMD_Transmit(unsigned char CMD, unsigned long int PAR)
    
    {
    
    	unsigned char temp, powodzenie;
    
    	
    
    	powodzenie = 0;	
    
    
    
    	SPI_Transmit(CMD);
    
    	SPI_Transmit(PAR >> 24);
    
    	SPI_Transmit(PAR >> 16);
    
    	SPI_Transmit(PAR >> 8);
    
    	SPI_Transmit(PAR);
    
    	SPI_Transmit(0x95);
    
    
    
    	for(int i=0;i<8;i++)
    
    	{
    
    		temp = SPI_Receive();		
    
    		if(!(temp &= 0b10000000))
    
    		{
    
    			LCD_Clear();
    
    			LCD_WriteText("OK!");
    
    			_delay_ms(1000);
    
    			powodzenie = 0;
    
    			return powodzenie;
    
    		}
    
    		else
    
    		{
    
    			LCD_Clear();
    
    			LCD_WriteText("Bad Response!");
    
    			powodzenie = 1;
    
    			_delay_ms(100);
    
    		};
    
    	};
    
    
    
    	return powodzenie;
    
    }
    
    
    unsigned char SD_Card_Init(void)
    
    {
    
    	unsigned char wynik;
    
    
    
    	wynik = 0;
    
    
    
    	for(int i=0;i<10;i++)
    
    	{
    
    		SPI_Transmit(0xFF);
    
    	};
    
    
    
    	SS_start();
    
    	wynik += SPI_CMD_Transmit(0x40, 0x00);
    
    	wynik += SPI_CMD_Transmit(0x41, 0x00);
    
    
    
    	SS_stop();
    
    	return wynik;
    }
    
REKLAMA