Odtwarzacz plików MP3 z kardy SD
Transkrypt
Odtwarzacz plików MP3 z kardy SD
Warszawa, 01.02.2016 MARM Odtwarzacz plików MP3 z kardy SD Hubert Kasprzyk 1. Założenia projektowe Celem projektu jest zaimplementowanie odpowiednich algorytmów, umożliwiających odtworzenie plików MP3 z karty SD. Urządzeniem obsługującym algorytmy będzie płytka: STM32F4DIS-BB + STM32F4DISCOVERY, która pracuje z mikrokontrolerem ARM Cortex M4. Na płytce znajduje się jeden przycisk użytkownika i kilka diod. Zostaną one wykorzystane do obsługi odtwarzacza MP3. Po włożeniu karty SD do gniazda zostanie ona automatycznie zainicjalizowana. Następnie będą odczytane utwory w formacie MP3, które będą znajdować się bezpośrednio na karcie (bez dodatkowych folderów). Kiedy utwory będą wczytane i urządzenie będzie gotowe do odtwarzania, zostanie to zasygnalizowane zapaleniem się diody. Po wciśnięciu przycisku użytkownika rozpocznie się odtwarzanie utworów. Jeżeli przycisk będzie wciskany ponownie (w trakcie odtwarzania utworów), nastąpi przełączenie na kolejny utwór. Po do dojściu do końca playlisty, odtwarzanie zostanie zakończone, co zostanie zasygnalizowane diodą. Aby ponownie rozpocząć odtwarzanie utworów, będzie należało wcisnąć przycisk użytkownika. Poniżej zaprezentowany został schemat blokowy algorytmu. Obsługa karty SD Dekodowanie MP3 Przetwornik CA W celu realizacji odtwarzacza będzie należało przeprowadzić czynności takie jak pokazano na rys. powyżej. W pierwszej kolejności należy obsłużyć kartę SD, na której będą przechowywane pliki MP3. Karta SD jest podpięta do interfejsu SDIO, który umożliwia transmisję danych z prędkością do 48 MHz. Karta SD będzie obsługiwała system plików FAT. Pliki z karty będą odczytywane w postaci 32 bitowych ramek. Po odczytaniu pliku z karty SD, będzie on dekodowany. Po uruchomieniu urządzenia nastąpi inicjalizacja dekodera MP3, w której m.in. będzie informacja o maksymalnej długości ramki PCM, ze zdekodowaną częścią utworu. Następnie rozpocznie się dekodowanie przesyłanych ramek. Ramki będą między sobą synchronizowane. Na początku pliki zbędą zawierały informację na temat długości utworu, dzięki czemu dalsza część programu będzie wiedziała, jaki rozmiar pliku aktualnie jest przetwarzany (jaka ilość ramek). W kolejnych ramkach będą przesyłane dane pliku multimedialnego, które będą dekodowane do formatu PCM. Po zdekodowaniu pliku (kawałków plików w postaci ramek), będą one przesyłane na przetwornik CA, którego zadaniem będzie zamiana sygnału cyfrowego na analogowy i wysłanie go do gniazda typu JACK 3.5. Przetwornik CA znajdujący się na płytce to układ CS43L22, który jest przeznaczony do obsługi plików Audio. Układ ten posiada zarówno wejścia analogowe, jak i cyfrowe. W projekcie zostanie wykorzystane jego wejście cyfrowe, do którego szeregowo będą przesyłane ramki ze strumieniami danych PCM. Analizując powyższe kroki łatwo zauważyć, że główną częścią implementacji algorytmów w projekcie będzie obsługa karty SD i dekowanie plików MP3 do PCM, które następnie będą przesyłane do przetwornika CA. Przetwornik ten będzie należało tylko obsłużyć. 2. Realizacja 1. Obsługa karty SD Obsługa karty SD odbywa się przy pomocy interfejsu SDIO. Interfejs ten może współpracować z kartą SD z dwiema szerokościami szyny danych: 1 bit i 4 bit. Poniżej znajduje się schemat podłączenia gniazda mikroSD do mikrokontrolera STM32F4 (dla płytki używanej w projekcie – STM32F4DISCOVERY-MB997B + STM32F4DIS-BB). Rys. 2-1 Schemat podłączenia gniazda karty microSD do mikrokontrolera Konfiguracja ustawień karty SD znajduje się w pliku fatfs_sd_sdio.c. Funkcje w tym pliku korzystają z bibliotek TM i FatFs. Biblioteka TM zawiera funkcje tego samego typu jak StdLibrary. Różnica jest w nazewnictwie funkcji (w bibliotece TM każda funkcja poprzedzona jest przedrostkiem TM). Biblioteka FatFs potrzebna jest do prawidłowego zarządzania plikami na karcie SD. Użycie pliku fatfs_sd_sdio.c wraz z bibliotekami TM i FatFs, uprościło pisanie kodu do obsługi karty SD. Inicjalizacja karty ograniczyła się wstawienia funkcji f_mount(&FatFs, ””, 1 ). Funkcja ta zawiera: wskaźnik na obiekt reprezentujący system plików, numer dysku (w przypadku używania jednego dysku, może pozostać ta pozycja pusta), komendę zamontowania urządzenia (1 – zamontuj, 0 – nie montuj). Jeżeli karta SD znajduje się w gnieździe, wówczas inicjalizacja karty przebiega pomyślnie, co zostaje zasygnalizowane zapaleniem się zielonej diody na płytce. Po inicjalizacji karty program przechodzi do funkcji play_directory(””, 0), której zadaniem jest przeszukiwanie karty SD w celu znalezienia plików mp3. Pierwszy argument funkcji reprezentuje ścieżkę, natomiast drugi nr pliku od którego ma odbywać się odczyt. W tym przypadku, pliki mp3 powinny znajdować się bezpośrednio na karcie SD (bez dodatkowych katalogów). Odczyt plików rozpoczyna się od pierwszej znalezionej pozycji. Funkcja ta kolejno otwiera i czyta pliki z karty SD, sprawdzając czy są one plikami mp3. Jeżeli zostaną wykryte pliki mp3, wówczas rozpoczyna się odczytywanie plików. W tym celu program przechodzi do kolejnej funkcji: play_mp3(buffer). Argument buffer przechowuje nazwę aktualnie odczytywanego pliku. 2. Dekodowanie plików MP3 Dekodowanie plików mp3 odbywa się przy pomocy biblioteki helix. Plikiem tej biblioteki, zawierającym funkcje obsługiwane przez użytkownika jest plik mp3dec.c. Inicjalizacja dekodera mp3 następuje przy użyciu funkcji MP3InitDecoder(). Plik mp3 w stosunku do dostępnej pamięci dla bufora ma duży rozmiar. Wymusza to konieczność ładowania pliku fragmentami do bufora, dekodowania jego zawartości i wysyłaniu zdekodowanych plików na przetwornik CA. W pierwszej fazie plik mp3 jest otwierany i czytany przy pomocy funkcji: f_open(…) i f_read(…). Odczytywany fragment pliku jest ładowany do bufora file_read_buffer. Bufor ten jest odczytywany przez funkcję MP3Decode(…). Następnie zdekodowany fragment pliku mp3 jest zapisywany do bufora wyjściowego sample. W celu przeprowadzenia poprawnego procesu dekodowanie plików, konieczna jest synchronizacja pomiędzy odczytywanymi ramkami. Zadanie to jest wykonywane przez funkcję: MP3FindSyncWord(…). Niezbędną funkcją z biblioteki helix jest jeszcze MP3GetLastFrameInfo(…). Funkcja ta pobiera ostatnią ramkę pliku mp3, a wraz z nią informacje na temat pliku, takie jak: liczba zdekodowanych próbek, szybkość próbkowania, itp. Zawartość bufora wyjściowego zajmują fragmenty zdekodowanych plików mp3 w formacie PCM. PCM jest to cyfrowa reprezentacja próbek sygnałów analogowych. Modulacja ta jest wykorzystywana do cyfrowego zapisu plików audio. Jeżeli bufor wejściowy zostanie odczytany do połowy, wówczas jego pozostała zawartość zostaje przekopiowana na początek i załadowany kolejny fragment pliku mp3. Ostatnia porcja danych jest mniejsza niż dostępne miejsce w buforze wejściowym. W takiej sytuacji następuje zakończenie odtwarzania pliku mp3 i zamknięcie go. Zakończenie odtwarzania pliku może nastąpić również w sytuacji, kiedy nie można go prawidłowo otworzyć lub na skutek wciśnięcia przycisku użytkownika. Po tych czynnościach następuje powrót do poprzedniej funkcji i rozpoczyna się sprawdzanie kolejnego pliku na karcie SD. Jeżeli plik ten będzie w formacie mp3 i uda się go otworzyć to nastąpi proces jego dekodowania i odtwarzania. 3. Przetwornik CA W projekcie został użyty jest zewnętrzny przetwornik CA, który jest układem dedykowanym do plików audio (CS43L22). Układ ten na wejściu dostaje próbki cyfrowego sygnału audio, w formacie PCM. Do transmisji sygnału został wykorzystany interfejs I2S. Obsługa wysyłania zdekodowanych do PCM próbek audio, a także inicjalizacja interfejsu I2S, znajduje się w pliku Audio.c Poniżej znajduje się schemat elektryczny podłączenia przetwornika CS43L22 do mikrokontrolera. Rys. 2-2 Schemat elektryczny podłączenia przetwornika CS43L22 do mikrokontrolera W pierwszej kolejności następuje inicjalizacja audio i ustawienie głośności za pomocą funkcji: InitializeAudio(…) i SetAudioVolume(…). W następnym kroku następuje uruchomienie funkcji wysyłającej zdekodowane próbki audio do przetwornika CA: PlayAudioWithCallback(…). W trakcie odczytywania buforów z próbkami wyjściowymi naprzemiennie migają diody: pomarańczowa i czerwona. Po zakończeniu odtwarzania plików multimedialnych, następuje wyciszenie głośności wyjścia audio i zatrzymanie wysyłania próbek (wyłączenie DMA, kontrolera przerwań). 3. Wnioski i obserwacje Inicjalizacja wszystkich peryferiów oraz uruchomienie systemu przebiegło pomyślnie. W zaimplementowanym programie jest jeden błąd. Odtwarzanie pliku mp3 zawiesza się po odczytaniu raz załadowanego bufora. W założeniach jest odtwarzanie plików w pętli (po ostatnim pliku następuje powrót do pierwszego i proces odtwarzania playlisty rozpoczyna się od nowa). Środowisko Keil okazało się bardziej kłopotliwe niż Eclipse w realizacji projektu. Pojawiały się w nim problemy z licencją, podczas gdy Eclipse dział bez zarzutów. Jedynym uporczywym problemem była konfiguracja debugera. Napisanie programu realizującego odtwarzanie plików mp3 z karty SD, wymaga sporej ilości czasu i jest trudnym zadaniem dla osób nie mających doświadczenia z mikrokontrolerami. Biorąc pod uwagę fakt, że większość osób na studiach magisterskich pracuje zawodowo, a także mają inne przedmioty, które trzeba pozaliczać, projekt ten jest zbyt czasochłonny. Z załączeniu znajduje się cały projekt odtwarzacza.