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

Czy są różne CRC ?? MMC na AVR

maly_elektronik 04 Lip 2008 09:03 1434 4
REKLAMA
  • #1 5310043
    maly_elektronik
    Poziom 23  
    Witam :!:

    Mam dylemat przeczytałem w jednej z not katalogowych że karty SD jak i MMC powinny mieć sumę CRC równą 0x95 dla komend IDLE_STATE i OP_COND a dla pozostałych (SET_BLOCKLEN, READ_SINGLE_BLOCK itp) 0x00
    Czy to prawda :?:
    I czy wystarczy taki kod do wysyłania komend:
    
    char sd_send_cmd(unsigned char command, unsigned long data, unsigned long CRC)
    {
     char recive,index;
     SD_DDR  |= CS;
     SD_PORT &= ~CS;//ustawienie CS na 0 co spowoduje aktywacje karty
     
     spi_transmit(command);      // wysyłanie komendy i pozostałych 4 bajtów danych komendy
     spi_transmit((char)(data>>24));
     spi_transmit((char)(data>>16));
     spi_transmit((char)(data>>8));
     spi_transmit((char)data);
     spi_transmit(CRC); // wysyłanie sumy kontrolnej CRC
     
    for (index=0;index<10;index++)/pętla 10x
    {
     recive = spi_transmit(0xFF);// odbieranie przez spi odpowiedzi R1 z karty
     if((recive & R1_BUSY) == 0)
     {
      return recive;
     }
    }
     
      return -1; 
     
    }
     
  • REKLAMA
  • #2 5310057
    slomo
    Poziom 18  
    Te dwie komendy ktore wymieniles maja CRC rowna 0x95 a wynika to stad ze maja one stale argumenty wiec mozna bylo wczesniej wyliczyc sume CRC i nie obliczac jej za kazdym razem przy wysylaniu tych komend.Natomiast dla pozostalych musisz sam je wyliczyc.Podana przez ciebie wartosc 0x00 wynika stad ze w wiekszosci przykladow nie oblicza sie sumy(karta po przejsciu w tryb SPI ma standardowo wylaczone sprawdzanie CRC) i w tym miejscu mozna wyslac dowolna wartosc bo karta i tak bedzie ja ignorowala.

    pz
  • REKLAMA
  • #3 5310071
    maly_elektronik
    Poziom 23  
    A więc czy taka inicjacja karty będzie poprawna :?:
    
    void sd_init(void)
    { 
     SD_DDR  |=  CS;
     SD_PORT |=  CS; /wyłącznenie karty (NIE WIEM CZY POWINIENEM )
     
     char index;
     char ret;
     
     for(index=0; index <10; index++)\\ sysłanie 80 cykli zegarowych CZY MA BYĆ TO NA WYŁĄCZONEJ KARCIE CS=0 :?:
     {
      spi_transmit(0xFF);
     }
     SD_PORT &= ~CS;
      ret=sd_send_cmd(IDLE_STATE,0x00,0x95);//sysłanie komendy inicjacji karty
      if(ret == R1_IDLE_STATE);////////// oznacza że karta jest zainicjowana pod dołem moze być jakas procedurka wyświetlająca
      
      while(sd_send_cmd(OP_COND,0x00, 0x95) != 0);
      
      sd_send_cmd(SET_BLOCKLEN,0x200,0x95); //wysłanie konendy długośći bloku danycj 
       
    }
  • REKLAMA
  • #4 5310093
    slomo
    Poziom 18  
    Te 80 taktow zegarowych ma byc przy stanie wysokim na CS.
    Sekwecja inicjujaca to komenda IDLE_STATE,0x00,0x00,0x00,0x00,0x95 wiec powinno byc ok.Najlepiej odpal program i sprawdz.

    Jedna uwaga :stanem aktywnym jest stan gdy sygnal wyboru CS przyjmuje stan niski.


    pz
  • #5 5310135
    maly_elektronik
    Poziom 23  
    To w takim razie jeszcze jedno
    Czy taka inicjacja SPI może byc na atmega8 zebym mógł sie dogadać z kartą :?:
    
    void spi_init(void)
    {
     SD_DDR |= (1<<CS) | (1<<MOSI) | (1<<SCLK);
     SPCR     = (1<<MSTR) | (1<<SPE)  | (1<<CPOL);
    }
    
    unsigned char spi_transmit(unsigned char data)
    {
     SPDR = data;
     while(!(SPSR & (1<<SPIF)));
     return data; // jezeli odbierze jakieś dane to je zwróci
    }
    
    
REKLAMA