W poprzednim poście
LINK pokazałem jak w bardzo prosty sposób w Atmel Studio 7 przy pomocy bibliotek ASF wykorzystać port USB, zdefiniować go jako port szeregowy i przekierować no niego potoki STDIN/STDOUT.
W tym poście chcę dodatkowo podłączyć kartę SD korzystając z bibliotek Atmela, a informacje o karcie SD będą wyświetlane poprzez port szeregowy emulowany przez interfejs USB procesora.
Ważną sprawą jest fakt, że ASF (Atmel Software Fundation) to gotowe sterowniki, komponenty, usługi i funkcje realizujące obsługę portów IO, interfejsów komunikacyjnych, usług i procedur do wykorzystania w naszym kodzie.
Czasem dzięki kilku liniom kodu i odpowiednim definicjom można uzyskać naprawdę spektakularne efekty.
Poniżej obrazek ze strony Atmela pokazujący strukturę ASF,
W naszym projekcie będziemy korzystali z następujących komponentów ASF:
- „GPIO service” do zdefiniowania trybu pracy portów procesora
- „SD/MMC stack component” do komunikacji z kartą SD
- „SD/MMC memory Access komponent” zawierający funkcję odczytu i zapisu danych na/z karty
- „USB Device (service) CDC_STDIO” – do obsługi USB w trybie emulacji portu szeregowego przechwytującego STDIN/STDOUT
Użyte w projekcie komponenty ASF w oknie ASF Wizard powinny wyglądać TAK
Po dodaniu komponentów czas na konfigurację plików nagłówkowych.
Tak jak poprzednio konfigurujemy pliki
conf_clock.h oraz
conf_usb.hPlik /config/conf_clock.h definiuje parametry taktowania procesora.Modyfikujemy w nim trzy sekcjie:
1. zmieniamy parametr CONFIG_SYSCLK_SOURCE z domyślnego 2MHz na 32Mhz
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
2. zmieniamy parametr CONFIG_SYSCLK_PSADIV z domyślnego SYSCLK_PSADIV_1 na SYSCLK_PSADIV_2
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
3. usuwamy komentarz w liniach zawierających CONFIG_OSC_RC32_CAL i CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Teraz zajmijmy się plikiem /config/conf_usb.hW nim znajdzmy definicję funkcji wywoływanych po aktywacji portu usb
Musimy odnaleźć w nim definicje UDI_CDC_ENABLE_EXT, UDI_CDC_DISABLE_EXT
i zamienić na poniższe ...
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Linie te są odpowiedzialne za podłączenie/odłączenie STDIO w momencie gdy jest aktywowany/deaktywowany port USB z obsługą urządzenia typu Communication Device Class.
Przyda się jeszcze zakomentować poniższą linie znajdującą się gdzieś na początku pliku....
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Nowością będzie definicja pliku
conf_board.h.
W pliku tym definiujemy połączenia procesora do komponentów zewnętrznych.
W tym przypadku będą te definicje podłączenia karty SD oraz przycisku sprzętowego FLIP podłączonego do portu E5 procesora.
Jeśli nie mamy przełącznika WRITE_PROTECT to go nie definiujemy, poniżej jest on zakomentowany ponieważ u mnie nie występuje.
Zawartość mojego pliku conf_board.h wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ponieważ mój zestaw nie jest żadną z płyt uruchomieniowo/deweloperskich Atmela, wieć muszę jeszsze do pliku
/ASF/common/boards/user_board/init.c dopisać zawartość procedury board_init, która inicjuje komponenty zewnętrzne i porty procesora do współpracy z nimi.
Jak widać ja musiałem tylko konfigurować porty IO do współpracy z kartą SD oraz pin E5 do którego jest podłączony microswitch [FLIP].
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Skoro jest już tyle... należy zająć się programem głównym...
Po uruchomieniu procesora program czeka za naciśnięcie przycisku podłączonego do portu E5 (zwieramy pin procesora do masy),
daje nam to czas na otwarcie okienka terminala portu szeregowego (u mnie COM5).
Po naciśnięciu przycisku FLIP program działa w pętli badając status karty i wyświetlając informacje o niej.
Zmienna
status przechowuje informacje o aktualnym statusie karty SD.
Zmienna
port to numer portu ( możliwe jest zdefiniowanie i podłączenie kilku kart SD i wybór pomiędzy nimi za pomocą sygnału CD, użyjemy wtedy SD_MMC_0_CD_GPIO, SD_MMC_1_CD_GPIO itd. w pliku conf_board.h )
Cała reszta to użycie funkcji i definicji które są już w ASF.
A tak wygląda program
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Działający program wygląda tak jak poniżej, jest to przykład dla dwóch różnych kart SD.
I to by było na tyle ... w następnym "odcinku" dodamy do projektu bibliotekę FatFS ( jej Atmelowską wersję )
i spróbujemy coś odczytać i zapisać.