Generalnie wszystko co napisałem kiedyś o ATSAML21 dotyczy również ATSAML10 i ATSAML11. Ta sama seria L oznacza, że wspólne peryferia są opisane tymi samymi rejestrami. Więc przenośność kodu jest bardzo wysoka. Nie będę zatem ponownie powtarzał wiedzy przedstawionej w artykule ATSAML21 - uruchamiamy SPI czyli SERCOM nie tylko dla orłów. Bo większość tego co zostało napisane w tamtym artykule możemy zastosować do ATSAML10 i 11. Po krótce przyjrzymy się jak wygląda droga do uruchomienia SPI w naszym ATSAML10E16. Na pewno nie będzie nudno bo ATSAM-y są nietrywialnymi mikrokontrolerami i z nimi nie można się nudzić :)
W ATSAML10E16 mamy do dyspozycji 3 x SERCOM ,ponumerowane SERCOM0...SERCOM2. Dla przypomnienia SERCOM to moduł z którego można wyczarować m.in SPI, I2C, USART. Jakie są docelowe możliwości konfiguracji SERCOM-ów w naszym MCU prezentuje poniższa tabelka :
Za pomocą aplikacji webowej ATMEL START robię wizualizację dystrybucji zegara i modyfikuję go sobie po swojemu tak aby od strony zapisów w rejestrach jak najmniej się namachać.. Takie zobrazowanie jest pomocne aby sobie wyobrazić co należy z grubsza zrobić w zakresie dystrybucji zegara dla wybranego modułu SERCOM. Najpierw jednak zdefiniujmy jakieś założenia. Ponieważ moim zamiarem jest komunikacja z wyświetlaczem LCD jaki mam na mojej płytce developerskiej dlatego potrzebuję skonfigurować SPI tak aby na pinie PA24 było MOSI a na pinie PA25 SCK. MISO jest mi w tym przypadku zbędne. Do konfiguracji użyję SERCOM0 i w efekcie SPI0.
Moduł SERCOM0 wykorzystuje do swojej pracy trzy zegary :
- CLK_SERCOM0_APB - SERCOM bus clock
- GCLK_SERCOM0_CORE - SERCOM core clock
- GCLK_SERCOM0_SLOW - SERCOM slow clock
Przy czym pierwszy zegar czyli SERCOM bus clock jest po resecie włączony, więc nie musimy sobie nim głowy zaprzątać. Ustawienie tego zegara dla modułu SERCOM znajdziemy w module zegara synchronicznego MCKL rejestr APBCMASK. O ile zegar SERCOM core clock nie wydaje się czymś dziwnym to już na pewno jest nim SERCOM slow clock. Dowiadujemy się, że jest to zegar wykorzystywany przez niektóre funkcje. Operacja zapis/odczyt do niektórych rejestrów wymaga takiego zegara. Jeśli zobaczymy w jakimś module peryferyjnym rejestr SYNCBUSY to pola bitowe tego rejestru pokazują , które rejestry wymagają zegara slow clock. Wiąże się to z aspektem przeprowadzenia tzw synchronizacji między slow clock a core clock po wykonaniu operacji na takich rejestrach. Ale spokojnie wszystko wymyślił człowiek i również człowiek jest w stanie to ogarnąć.
Wynika stąd , że ustawień zegara szukamy tylko w bloku zegara asynchronicznego (GCLK).
Jedyną wymaganą czynnością jaką musimy w części zegarowej zrobić opierając się na naszej wizualizacji zegara to podpięcie modułu SERCOM0 (na obrazku SPI0) do bloku Generatora nr 0. W szczególe takie podpięcie realizowane jest za pomocą kanału i to właśnie kanałem łączymy moduł SERCOM0 z Generatorem nr 0. Fizycznie podpinamy się przy użyciu rejestru PCHCTRLm (Peripheral Channel Control). Zróbmy zatem odpowiednie wpisy , na razie postać ogólna :
GCLK_SERCOM[0,1,2]_SLOW :
PCHCTRL10 --> CHEN --> 1 włącz kanał dystrybucji zegara SERCOM_slow
PCHCTRL10 --> SRC --> 0x0 (ten zapis jest zbędny bo po resecie tak jest ustawione)
GCLK_SERCOM0_CORE :
PCHCTRL11 --> CHEN --> 1 włącz kanał dystrybucji zegara SERCOM0 Core
PCHCTRL11 --> SRC --> 0x0 (ten zapis jest zbędny bo po resecie tak jest ustawione)
Powyższe wpisy a w szczególności numerki 10 i 11 wynikają z tabelki poniżej :
Załatwione mamy podpięcie modułu SERCOM0 do bloku Generatora nr 0 za pomocą kanału. Zdaję sobie sprawę , że dystrybucja zegara może na początku przygody z ATSAM-ami sprawiać problemy z opanowaniem czy zrozumieniem. Ale zapewniam , że jak raz zatrybimy całą ideę to będzie to dla nas pestka a nawet da się to polubić.
Aby ustawić SERCOM w tryb SPI MASTER musimy wpisać w rejestrze CTRLA bit MODE wartość 0x3.
CTRLA --> MODE --> 0x3 / włącz tryb SPI MASTER dla SERCOM
Przed grzebaniem w rejestrach SERCOM SPI należy wyłączyć SPI a robimy to wpisem :
CTRLA --> ENABLE --> 0 / wyłącz SPI
CTRLA --> ENABLE --> 0 / wyłącz SPI
Pamiętać należy aby po skonfigurowaniu SPI , należy włączyć peryferium zapisem :
CTRLA --> ENABLE --> 1 / włącz SPI
Kolejnym punktem w inicjalizacji jest wyłączenie opcji odbioru (nie korzystamy z MISO) robimy to zapisem:
CTRLB --> RXENABLE --> 0 / wyłącz RX
CTRLB --> RXENABLE --> 0 / wyłącz RX