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

Różnice w SPI pomiędzy ATMega328P a LGT8F328P, inicjalizacja karty SD w PetitFS

RevDNS 16 Lut 2023 10:30 702 13
REKLAMA
  • #1 20441585
    RevDNS
    Poziom 7  
    Witam,
    czy ktoś orientuje się jakie są różnice w SPI pomiędzy ATMega328P a LGT8F328P?
    Problem dotyczy inicjalizacji karty SD w bibliotece PetitFS.
    Na oryginalnym Arduino Nano wszystko przebiega prawidłowo i mogę czytać dane z pamięci, niestety ten sam kod przeniesiony na (klon) Arduino wypluwa: INIT_ERROR - nawet po zmniejszeniu taktowania na 16MHz.

    Niestety dokumentacja LGT8F328P jest w języku Chińskim...

    Przy innych bibliotekach korzystających z komunikacji po SPI wszystko działa prawidłowo.

    Korzystam z biblioteki zamieszczonej w repo: Link i przykładowego programu.
  • REKLAMA
  • #2 20441814
    kaczakat
    Poziom 34  
    Jak masz jakąś bibliotekę, która jest stworzona tylko np. dla AVR to nie zadziała ani z LGT, ani z ESP, ani z STM, bo ona nie korzysta z biblioteki SPI załączonej do core danej platformy tylko od razu wbija w rejestry sprzętowe i sama sobie to próbuje ustawiać. Nie zadziała zresztą z większością uC AVR, a tylko z 328p i kilkoma o takich samych użytych rejestrach, nie obejmuje więc nawet uC AVR użytych w oryginalnych płytkach Arduino, LGT8 jest tu najmniejszym zmartwieniem. Za to jest lekka.
    Biblioteka SD Ci nie pasuje?
    Pomogłem? Kup mi kawę.
  • #3 20441819
    RevDNS
    Poziom 7  
    FatFs czy domyślna biblioteka SD zajmuje sporo miejsca.
    Niestety go aż tyle nie mam :)

    LGT8F328P to bardzo zbliżony klon do MEGA328P - nawet jeśli chodzi o rejestry.

    Sprawdzałem właśnie bibliotekę SPI.h dostarczoną do środowiska LGT8FX8P i widzę, że SPI w tym uC ma chyba 4 bajtowy bufor.
    Spróbuję zaimplementować funkcje xmit_spi/ rcv_spi aby z niego korzystały. Nie wiem tylko na ile mi się to uda - będę sugerował się istniejącą bibliotekę do SPI.
  • REKLAMA
  • Pomocny post
    #4 20441829
    kaczakat
    Poziom 34  
    Ściągnąłem tę bibliotekę, akurat w przykładzie jest użyty Serial zdefiniowany na rejestrach dla Atmaga328p, zakomentuj te linie i sprawdź czy reszta działa już OK. Może akurat w SPI faktycznie różnic nie ma:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ewentualnie możesz zajrzeć do core LGT, tam jest pliczek SPI, taki sam jest w core AVR, może dasz radę to ogarnąć.
    Pomogłem? Kup mi kawę.
  • #5 20441833
    RevDNS
    Poziom 7  
    Dzięki, niestety to nie to.
    W bibliotece SPI.h dla LGT8F328P transmisja wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Muszę to teraz jakoś przenieść na funkcje wysyłki/ odbioru w PetitFS :)
  • REKLAMA
  • #7 20441971
    RevDNS
    Poziom 7  
    Jest jakiś postęp, skopiowałem bibliotekę SPI z core LGT8F328P i zainicjalizowałem przy jej pomocy protokół. Podmieniłem też funkcje do komunikacji w pliku pffArduino.h na takie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wynik z konsoli:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Także, plik wczytuje.
  • REKLAMA
  • Pomocny post
    #8 20442677
    kaczakat
    Poziom 34  
    Podłączyłem LGT do analizatora logicznego i wygląda na to, że SPI nie rusza prawidłowo. Zegar tyka, ale reszta sygnałów jest rozjechana. Po porównaniu do biblioteki SPI widzę różnicę, zrobiłem z funkcji od petitFS nowy szkic, pierwszy bajt wysyła OK, kolejnego już nie.
    Jak zmieniłem funkcję z rejestrami od LGT wysłał kolejny bajt OK:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    _BV to to samo co 1<<.
    Pomogłem? Kup mi kawę.
  • #9 20442708
    RevDNS
    Poziom 7  
    Kurczę aż z ciekawości wrzuciłem Twoją modyfikację funkcji ale wywala mi błąd inicjalizacji. Testowałeś na taktowaniu zegara 32MHz?

    Wrzucam w załączniku to co udało mi się wyskrobać - na razie sprawdziłem inicjalizację oraz odczyt - działa.
    Skończę pisać klasę do odtwarzania WAV przy pomocy Timer 3 (nowość w LGT8) to zacznę bawić się zapisem :)
  • Pomocny post
    #10 20442753
    kaczakat
    Poziom 34  
    No, to tylko część modyfikacji, trzeba przerobić cały plik na "arduinowy" bo nie widzi że to jest dla LGT tylko robi jak dla Atmega328P, a on nie ma takich rejestrów. No i resztę funkcji, bo odczyt musi być też między ustawieniami rejestrów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Albo przerobić resztę tej biblioteki, bo po co dwie funkcje skoro w pierwszej od razu czyta.
    Teraz pewnie nie zadziała z 328P, trzeba porobić dyrektywami #if itd, by były różne funkcje dla różnych uC.
    Jeszcze w pliku "avr_mmcp.cpp dla zgodności trzeba zmienić: byte xmit_spi (byte d); /* usi.S: Send a byte to the MMC */
    Ale przykład "poszedł":
    Różnice w SPI pomiędzy ATMega328P a LGT8F328P, inicjalizacja karty SD w PetitFS
    Może inicjalizacje IO można zostawić poprzednią na rejestrach i zmniejszyć jeszcze kod, przykład teraz zajmuje 5.4k.
    Pomogłem? Kup mi kawę.
  • #11 20442798
    RevDNS
    Poziom 7  
    Bardzo dobra robota!
    Rejestry do zmiany ustawień portów działają te z Mega328P.
    Dziękuję Ci za zainteresowanie się tematem i pomoc!

    Myślę, że nasze walki w tym temacie będą służyć niejednemu, który zdecyduje się na LGT8F328 - a uC jest na prawdę fajny :)

    Bawiłeś się już DAC'kiem?
  • #12 20442894
    kaczakat
    Poziom 34  
    Nie bawiłem się, dorzuciłem ten uC do innych zakupów w ramach ciekawostki, mam w wersji ala UNO, NANO i PROMINI. Mnie nie zachwycił, wolę ESP, modyfikacje bez kabli, logowanie online na jakiś serwer. Nawet gdyby kosztował połowę NANO z Chin (a jest tylko parę centów tańszy) to i tak już raczej nie zrobi furory na rynku, podłączyłbyś zwykłe nano i resztę dnia robił ten odtwarzacz zamiast walczyć z inicjalizacją SD.
    Podłączenie biblioteki SPI z core LGT może jednak być lepszym rozwiązaniem, biblioteka SD może i jest większa ale prędkość zegara przy odczycie ustawia się na 4MHz, z tym petit tylko 400kHz, nie działa u mnie na 32MHz 250kHz spi juz nie ogarnia by zrobić inicjalizację, przykładowy szkic się ma znowu tego faila, a w SD operacje działają OK, inicjalizuje na 250kHz i potem wbija na 4MHz również z zegarem 32MHz. Tak samo zresztą ten petit działa z Atmegą, więc to nie jest wina LGT. Trzeba by się jeszcze pewnie z tym pobawić, z lenistwa wolę gotowe rozwiązania Arduino, bez zaglądania do rejestrów i dzielenia włosów na czworo.
    Jak będziesz czytał jakieś pliki do odtwarzania to może być istotne.
    Pomogłem? Kup mi kawę.
  • #13 20442898
    RevDNS
    Poziom 7  
    Wiesz co, u "majfrendów" ATMega328P w wersji SMD kosztuje koło 8-10zł za sztukę. LGT8F328P kupiłem teraz za 3.90zł. Ma większe taktowanie i co najważniejsze przy tym projekcie - posiada wyjście DAC.

    Generalnie odtwarzam już pliki *.wav 8-bit 22.05kHz i działa prawidło z tym PetitFS.

    Ten projekt wcześniej działał na ATMega328P przy użyciu PWM a z racji zmiany też chcę troszkę go zoptymalizować - bo poprzedni to prawie 98% użycia pamięci Flash/ RAM.

    Simplex'owy przekaźnik krótkofalarski. uC podłączone do SD, wyświetlacza OLED, trzech przycisków i interfejsu łączącego go z urządzeniem nadawczo-odbiorczym.
    Nagrywa odebraną transmisję aby za chwilę ją odtworzyć. Nie jest to wygodna forma komunikacji ale w sytuacjach kryzysowych może uratować niejedno "dupsko".

    Pozdrawiam Cię serdecznie, dziękuję jeszcze raz za wsparcie i realną pomoc.
    Jak będziesz kiedyś w Gliwicach - napisz, wiszę Ci dobre piwko.

    Spokojnej nocy!
  • #14 20443337
    kaczakat
    Poziom 34  
    Oj, kiedyś za dolara właśnie kupiłem taką płytkę LGT, piękne czasy to były, ale teraz nie widzę takich cen, wołają na Ali za nie więcej czasami niż za NANO, a i dolar droższy.
    Takie urządzenie dobrze by było usypiać, a to kolejna rzecz na której poległem z LGT, przejrzałem przetłumaczony na chinglisz pdf używając swojego ponglisz, powyłączałem wszystko, a pobór prądu spadł w okolice 1mA, tyle można uzyskać na AVR z włączonym zegarem, jak ktoś mądrzejszy na to nie wpadnie jaka dokładnie sekwencja czynności jest potrzebna to nic więcej z tym nie zrobię, ale pewnie programiści od core Arduino za jakiś czas to ogarną.
    ESP można bez problemu uśpić do 15uA i wybudzić jakimś zewnętrznym sygnałem, AVR bez problemu do 150nA. ESP ma jeszcze 4MB flash, pewnie takich komunikatów weszło by tam ze 2 minuty bez problemów z kartami SD, a jak mało gpio to jest jeszcze ESP32.
    Powodzenia z projektem.
    Pomogłem? Kup mi kawę.

Podsumowanie tematu

Dyskusja dotyczy różnic w komunikacji SPI pomiędzy mikrokontrolerami ATMega328P a LGT8F328P, szczególnie w kontekście inicjalizacji karty SD przy użyciu biblioteki PetitFS. Użytkownicy zauważają, że oryginalny kod działa poprawnie na Arduino Nano, ale na klonie LGT8F328P występuje błąd INIT_ERROR. Problemy wynikają z różnic w implementacji SPI w obu mikrokontrolerach, co prowadzi do konieczności modyfikacji funkcji komunikacyjnych. Użytkownicy sugerują podmianę bibliotek oraz dostosowanie rejestrów SPI do specyfiki LGT8F328P. W toku dyskusji pojawiają się również uwagi na temat wydajności i ograniczeń pamięci w używanych bibliotekach.
Podsumowanie wygenerowane przez model językowy.
REKLAMA