Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

dsPIC33F + karta SD via MDD FS

otapi 23 Lut 2010 08:53 771 1
  • #1 23 Lut 2010 08:53
    otapi
    Poziom 25  

    Witam

    Moja radość z powodu uruchomienia biblioteki MDD FS Microchipa była chyba przedwczesna....

    Dlatego prosiłbym kogoś kto tego używał o jakieś rady, wskazówki...

    Wszystko niby chodzi, procek robi ładnie puste pliki, katalogi itp. tylko jest mały problem, wszystko jest ładnie do momentu kiedy zapisuje do pliku mniej niż 100kB ... w momencie kiedy zapisuje więcej niż 100kB zaczynają się schody, powiedzmy że zapisuje 1MB to raz zapisze 432k raz 841k.... jakieś przypadkowe ilości danych, plik potem można otworzyć na kompie i nie zgłasza błędu, zapisuje całe długości sektora ale wewnątrz gubi co jakiś czas co co miało być zapisane z bufora.

    druga sprawa,trochę śmieszna, czasami nie chce utworzyć pliku w trybie 'w' więc napisałem żeby robił go aż zrobi i jest OK. Tak to wygląda:

    Code:

    while (Fpointer == NULL)
    {
    Fpointer = FSfopen (fname, "w");
    Delayms(100);
    }
     

    Co w tym śmiesznego? Jeżeli nie dam tam Delayms(100); to jeżeli utworzy i coś z nim jest nie tak to czasami mam 3-4 pliki o takiej samej nazwie ;] co jest chyba absurdem ;] no ale z opóźnieniem w końcu zrobi poprawnie plik i jest OK

    dalej dla testu robię np tak:
    Code:

    for(y=0;y<1024;y++)
    sendBuffer[y]=60;   // wypełniam bufor jakimś znakiem ">"
     
    for(x=0;x<100;x++)    // 100 razy zapisuje bufor
    FSfwrite (( void *)sendBuffer, 1, 1024, Fpointer); 
     


    i jes OK, jeżeli zapisze bufor więcej niż 100 razy czyli 100 x 1024 = 100kB to zaczyna się krzaczyć, mimo że da się odczytać plik.

    gorzej jest jak zrobię dodatkowo:
    Code:

    FSrewind (Fpointer);    // przewijam plik na początek
    for(y=0;y<1024;y++)
    sendBuffer[y]=61;    // wpisuje do bufora nowe znaki "="
    FSfwrite (( void *)sendBuffer, 1, 1024, Fpointer);   // zapisuje bufor na początku pliku
     


    i znowu niby wszystko jest ok jeżeli plik nie przekroczy 100kB, jeżeli przekroczy to w kompie po odczytaniu mam "plik uszkodzony'

    normalnie ręce mi opadają....

    procek chodzi na zegarku 40MHz jak bym nie ustawiał parametrów w SD-SPI.h to i tak ustawia mi SPI na 10MHz,
    w tej chwili tak jak to działa to masakra, pomijając że nie mogę utworzyć poprawnego pliku większego niż 100k ( czasmi udaje się zrobić plik 200-300k ale pomiędzy dopisaniem do pliku 100kilowej porcji muszę odczekać około sekundy, a to jest nie do przyjęcia) to jeszcze czas zapisu jest masakrycznie wolny.
    Potrzebuję zapisać pliki o wielkości GB z prędkością około 3MB/s ......
    Czy to w ogóle jest realne?
    Jeżeli ktoś ma jakiś pomysł albo jakieś doświadczenie z tą biblioteką albo namiary na jakąś inna to będę wdzięczny.

    pozdro
    otapi

    0 1
  • #2 23 Lut 2010 12:20
    CDMaster
    Poziom 14  

    Używasz FSClose()?? A co do 3MB/s... Zakładając, że będziesz wykorzystywał pełną przepustowość, to może się uda... Ile wynosi max częstotliwość taktowania karty? 26MHz?? Czyli nieco ponad 3MB/s, ale trzeba tam jeszcze posyłać rozkazy i trochę taktów czekać, więc może być ciężko. Możesz spróbować wykorzystać tryb 4, czy nawet 8-mio bitowy do komunikacji. Ale tutaj pozostaje Ci raczej implementacja własnej obsługi... Czyli zamiana pliku SD-SPI.c na swój własny. Dodatkowo mocno by to mogło obciążać uC, zależy co chcesz jeszcze poza tym na tym układzie robić.

    0