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.

Podobne dokumenty