wtorek, 22 stycznia 2019

ATSAML21 - uruchamiamy SPI czyli SERCOM nie tylko dla orłów.

To co wyróżnia ATSAM-y z cortexowego tłumu to m.in moduły SERCOM czyli Serial Comunication Interface. Jest to bardzo elastyczny moduł, który może być skonfigurowany jako moduł SPI lub I2C lub USART. Oznacza to fizycznie, że jeśli mamy np 6 x SERCOM w naszym MCU to możemy mieć do dyspozycji 6xSPI lub 6xI2C lub 6xUSART lub dowolną kombinację ilościową w/w peryferiów. Jest to bardzo wygodne i elastyczne podejście , które nie skazuje nas na ściśle ograniczoną i zdefiniowaną ilość peryferiów. Dlatego w SERCOM-ach można się zakochać od pierwszego wejrzenia :) W artykule spróbujemy skonfigurować SERCOM w tryb SPI. Działania nasze opieramy na środowisku SEGGER i plikach nagłówkowych dostarczanych przez producenta MCU ,dostępnych w środowisku. Nie używamy ATMEL STUDIA i ASF tylko czystej pracy organicznej na rejestrach.

Do zabawy potrzebujemy płytki developerskiej z ATSAML21G18B takiej jak np. moja :


 , zainstalowanego środowiska SEGGER i programatora J-LINK w moim przypadku jest to J-Link EDUMini. Jedynym dokumentem jakim będę się podpierał to datasheet
Seria ATSAML21 jest kompatybilna z ATSAMD21, więc w sumie nasze dywagacje  dotyczą sporej ilości MCU z oferty Microchipa. Przyda nam się jeszcze analizator stanów logicznych aby upewnić się , że SPI działa. Ja posługuję się tanim dalekowschodnim analizatorem za ok 60 zł i to mi wystarcza. Ponieważ pisząc artykuł sam się uczę zagadnienia, dlatego pokazuję moją drogę w dotarciu do celu.

Najpierw wychodzę od ogólnych założeń czyli co z grubsza muszę zrobić , jeśli z braku wiedzy o zagadnieniu pominę jakiś krok to wyjdzie to w boju przy analizowaniu dokumentacji. Na tę chwilę wiem , że powinienem ustalić  :
  • jak ustawić zegar dla modułu SERCOM nr 0
  • jak moduł SERCOM nr 0 skonfigurować w tryb SPI
  • jak podpiąć wybrane piny do modułu SERCOM nr 0 (MOSI , MISO, CLK)
  • jak skonfigurować SPI do pracy i wybranego trybu.
Pierwszym punktem jest ustawienie zegara dla modułu SERCOM. Postaram się być sprytny i skorzystać z narzędzia webowego ATMEL START ale nie po to aby dokonać konfiguracji i wygenerować kod bo nam nie chodzi o kodowanie w przepastnym ASF ,ale po to aby podejrzeć choćby strukturę blokową zegara z ustawionym SPI. Tworzę zatem nowy projekt w ATMEL START wybieram MCU ATSAML21G18B i przechodzę do zakładki z zegarem. Na schemacie zegara dodaję nowy komponent SPI, który podpinam do Generatora nr 1 :


Teraz pytanie po co mi ten rysunek blokowy zegara ?? rysunek ten daje mi informację w jakich blokach należy szukać ustawień zegara dla modułu SERCOM ,na schemacie ustawiony już jako SPI i pokazać do jakiej konfiguracji zegara docelowo dążymy. Dodatkowo zaglądam do datasheet do rozdziału o SERCOM. Tam w paragrafie o zegarze znajduję następujące informację :


Z opisu powyżej dowiadujemy się ,że moduł SERCOM wykorzystuje do swojej pracy trzy zegary :
  • CLK_SERCOMx_APB - SERCOM bus clock
  • GCLK_SERCOMx_CORE - SERCOM core clock
  • GCLK_SERCOMx_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. Z tego co udało mi się rozpoznać sprawę to zapis/odczyt do niektórych rejestrów jest tym zegarem popędzany. Jeśli zobaczymy w jakimś module peryferyjnym rejestr SYNCBUSY to pola bitowe tego rejestru pokazują , które rejestry wymagają zegara SERCOM slow clock. Wiąże się to z aspektem przeprowadzenia tzw synchronizacji między SERCOM slow clock a SERCOM core clock po wykonaniu operacji na takich rejestrach. Ale spokojnie co by nas głowa nie rozbolała z nadmiaru informacji.

Wynika stąd , że ustawień zegara muszę szukać zatem tylko w bloku zegara  asynchronicznego (GCLK).

Idziemy zatem do spisu rejestrów bloku zegara asynchronicznego GCLK. Spodziewam się tutaj powołania do życia Generatora nr 1 i spięcia go z kanałem modułu peryferyjnego czyli naszym SERCOM0 a konkretnie z SERCOM slow clock. (wynika to ze schematu blokowego z ATMEL START zamieszczonego wyżej.)


Rejestr , który bierzemy po lupę to GENCTRLn1 , widzimy tam pole bitowe GENEN , domyślamy się, że jest to po prostu włączenie naszego Generatora nr 1. Zajrzymy jednak do rejestru GENCTRLn1 :



Widzimy tu ciekawą rzecz mianowicie brak informacji m.in o ustawieniach startowych bitu GENEN wygląda to na jakiś babol w dokumentacji. Przyjmuję  że wartość startowa to 0. Wchodzimy do opisu :



Upewniamy się, że bit GENEN w rejestrze GENCTRLn1 oznacza to czego się spodziewaliśmy czyli włączenie Generator nr 1. Generator do swojej pracy potrzebuje źródła zegarowego. W opisie widzimy pole bitowe SRC a pod nim tabelkę z wartościami reprezentującymi poszczególne źródła. My korzystamy ze źródła OSC16M czyli z zegara wewnętrznego. Dlatego w pole bitowe SRC musimy wpisać wartość 0x6. Zatem w naszej konfiguracji musimy uwzględnić następujące wpisy , które włączą nam Generator nr 1 i zdefiniują dla niego źródło zegara :

GENCTRLn1 --> GENEN --> 1 (co oznacza schematyczne przedstawienie zapisu wartość 1 w pole bitowe GENEN rejestru GENCTRLn1)
GENCTRLn1 --> SRC --> 0x6

Mamy włączony Generator nr 1 i  podłączone źródło. Co dalej ? Teraz przydałoby się połączenie Generatora nr 1 z SERCOM slow clock .
Wracamy do tabelki z rejestrami bloku GCLK i chwilę dumamy nad 35-cioma rejestrami PCHCTRL0..PCHCTRL34. Wiemy , że potrzebujemy podpiąć nasz SERCOM0 do powołanego wyżej Generatora nr 1 i musimy to zrobić za pomocą kanału. Intuicja "kobieca" podpowiada nam, że to musi być realizowane w magiczny sposób w tych właśnie rejestrach. Wchodzimy zatem do rejestru np : PCHCTRL0 :


Czytamy wnikliwie opisy pól bitowych. Widzimy , że na pewno musimy bit CHEN  ustawić na 1 czyli włączyć kanał.



Interesuje nas też pole bitowe GEN w polu tym podepniemy kanał do Generatora. Nas interesuje podpięcie do Generatora nr 1 ,więc wybieramy z tabelki opisowej wartość 0x1.

Przesuwamy opisy pól bitowych i na końcu opisów dochodzimy do tabelki  opisanej jako Table 17-9. PCHCTRLm Mapping (str 147).





Dociera do nas informacja, że każdy z rejestrów PCHCTRL0..PCHCTRL34 jest przyporządkowany do konkretnego peryferium. Z tabelki widzimy, że nasz SERCOM0 core clock jest reprezentowany przez rejestr PCHCTRL18 a SERCOM(0..4) slow clock przez PCHCTRL17 .Zatem wszystkie wpisy musimy dokonać na tych rejestrach. Ustalamy zatem co musimy wpisać do rejestru PCHCTRL18 i PCHCTRL17:

PCHCTRL17 --> CHEN --> 1 
PCHCTRL17 --> SRC --> 0x1
PCHCTRL18 --> CHEN --> 1 
PCHCTRL18 --> SRC --> 0x0 (ten zapis jest zbędny bo po resecie tak jest ustawione)

Wydaje się, że część zegarową mamy z głowy. Jeśli kogoś przeraziło to chodzenie po rejestrach to znaczy, że jeszcze nie jest gotowy na taką drogę. Ale taka umiejętność przyjdzie sama z czasem , grunt to się nie poddawać. Ta umiejętność sprawi nam potem ogromną satysfakcję.

Podsumujmy zatem cały wątek o ustawieniu zegara dla SERCOM0 czyli jakich ogólnych schematów zapisu musimy użyć w programie (to jakich fizycznie formuł użyjemy w programie to na końcu będziemy dochodzić) :

GENCTRLn1 --> GENEN --> 1  / włącz Generator nr 1
GENCTRLn1 --> SRC --> 0x6  / ustaw źródło zegara Generatora nr 1 na OSC16M czyli po resecie 4 MHz 
PCHCTRL17 --> CHEN --> 1  / włącz kanał dystrybucji zegara SERCOM_slow
PCHCTRL17 --> SRC --> 0x1 / podepnij SERCOM_Slow do Generatora nr 1
PCHCTRL18 --> CHEN --> 1  / włącz kanał dystrybucji zegara SERCOM0 Core
PCHCTRL18 --> GEN --> 0x0   / podepnij SERCOM_core do Generatora nr 0 (ten zapis jest zbędny bo po resecie tak jest ustawione) 

Może ten zegar wygląda na zbyt skomplikowany w ustawieniach ale zapewniam , że tak nie jest, wystarczy tylko zrozumieć jak to musi być poukładane .

Teraz zajmiemy się poszukiwaniem jak ustawić moduł SERCOM0 w tryb SPI. Logika podpowiada , że musimy zajrzeć w rejestry SERCOM'a. Przed wejściem w spis rejestrów modułu SERCOM czytamy sobie datasheet  , rozdział o SERCOM i SERCOM SPI. Wyczytamy tam jaka jest kolejność konfiguracji i inicjalizacji SPI. Na pewno przyda nam się tabeleczka z ustawieniami rejestru CTRLA i bitu MODE :


Widzimy tam , że aby ustawić SERCOM w tryb SPI MASTER musimy wpisać w bit MODE wartość 0x3.
CTRLA --> MODE --> 0x3  / włącz tryb SPI MASTER dla SERCOM
Zerkamy na stronę 545,546 gdzie mamy wypunktowane kroki niezbędne do inicjalizacji SPI :


Ciekawym zagadnieniem, którego jeszcze nie rozpoznałem jest to czy np jak ustawię trzy SERCOM w tryb SPI MASTER to jak sprawa wygląda z buforem nadawczym czy każdy SERCOM ma oddzielny bufor nadawczo/odbiorczy czy jest to wspólny element co byłoby ewenementem. Na razie jest to dla mnie zagadką. Jeśli bufor nadawczy jest wspólny to by znaczyło, że w danym momencie aktywny powinien być tylko ten SERCOM, którym aktualnie nadajemy a reszta wyłączona.

Rejestry konfiguracyjne SERCOM dla trybu SPI są jak widzę wspólne dla wszystkich SERCOM-ów, które są w tym trybie .

No nic , lecimy dalej. Posługujemy się wypunktowanym procesem inicjalizacji z ostatniego zdjęcia powyżej.

Przed grzebaniem w rejestrach SERCOM SPI należy wyłączyć SPI a robimy to wpisem :

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 włączenie opcji odbioru robimy to zapisem:
CTRLB --> RXENABLE --> 1 / włącz RX

Bufor nadawczy i odbiorczy są zdaje się oddzielnymi buforami ale mogę się na tym etapie mylić. Mamy jeden bufor nadawczy i dwa bufory odbiorcze. Do bufora odbiorczego mamy opcję włącz/wyłącz. Stąd powyższe ustawienie.

Kolejnym punktem inicjalizacji (cały czas podpieram się ostatnim powyżej zdjęciem str 545,546 datasheet.) jest ustawienie prędkości SPI za pomocą Baud register (BAUD). Im mniejsza wartość tym szybciej, dla 0 mamy połowę pełnej wartości zegara SERCOM core clock  , w naszym przypadku jest to 2 MHz. Nasz zegar jest na starcie ustawiony na 4 MHz. Najszybszy dostępny zegar to 48MHz , czyli SPI popędzimy maksymalnie na 24 MHz.

BAUD --> BAUD --> 0 / ustaw na 8 bitach wartość Baud Generator

Jak jest zbudowany ten Baud Generator przedstawia poniższe zdjęcie, więcej można sobie doczytać od strony 506. Ciekawe jest to, że dla nadawania i odbioru mamy różne prędkości. W tablece na zdjęciu w ostatnim wierszu są wzory do wyliczenia wartości dla rejestru BAUD.


W zasadzie konfigurację SPI na tym etapie możemy przyjąć, że mamy kompletną. Ale tu ważna uwaga, mamy jeszcze coś takiego jak tryby pracy SPI, ten element wymagać będzie konfiguracji w przypadku kiedy nie będzie można się dogadać z urządzeniem zewnętrznym bo wymagać ono będzie np jednego z czterech trybów pracy. Ja z takim przypadkiem spotkałem się np. w MCP2517FD, gdzie tryb ustawiony jako wartość standardowa nie był odpowiedni i musiałem ten tryb w konfiguracji zmienić na właściwy. 

W naszym ATSAM-ku do konfiguracji trybów służą 3 pola bitowe w rejestrze  CTRLA są to DORD: Data Order, CPOL: Clock Polarity, CPHA: Clock Phase

Na zdjęciu poniżej mamy dostępne wartości dla tych pól bitowych :



Zasada jest taka, jeśli widzimy na analizatorze stanów logicznych, że SPI wypluwa prawidłowo dane a nie mamy oznak, życia ze strony zewnętrznego urządzenia to zaczynamy grzebać w tych 3 polach bitowych.

Opuszczamy na razie rejestry modułu SERCOM SPI a zaczynamy szukać pinologii. Czyli jak i jakie piny skonfigurować do współpracy z SERCOM0 w trybie SPI. Zaczynam poszukiwania od modułu PORT, przeglądam rysunki w tym rozdziale w datasheet. Obrazek wart 1000 słów. Znajduję poniższy obrazek ze strukturą multiplexingu  :



Z obrazka wynika, że aby podpiąć peryferium fizycznie do pinu musimy szukać konfiguracji w zakresie multiplexingu w module PORT. Obrazek podpowiada jakie rejestry tutaj są potrzebne do konfiguracji, PINCFG i bit PMUXEN oraz PMUX. Zerkamy zatem w te rejestry :



W tabelce z rejestrami modułu PORT widzimy 16 rejestrów PMUX0..PMUX15 i 32 rejestry PINCFG0..PINCFG31. Rejestry PINCFGx domyślamy się , że tutaj konfigurujemy 32 piny na wybranym porcie. Jeśli chcemy aby wybrany pin był podpięty do bloku multipexingu musimy ustawić na nim bit PMUXEN .Nie wiemy jeszcze jakie piny będą użyte do naszego SPI . Zaglądam zatem do rejestru PMUX0 czyli pierwszego z brzegu :





Widzimy tam dwa pola bitowe PMUXO i PMUXE z opisu wynika, że pierwsze pole dotyczy pinów nieparzystych a drugie parzystych. No to oki rozumiemy ale nie wiemy jeszcze co oznaczają literki A..I opisane jako funkcja peryferium. Widzimy również podpowiedź gdzie musimy się udać aby rozszyfrować znaczenie tych literek : I/O Multiplexing and Considerations. Wskakujemy zatem do tego rodziału w datasheet i widzimy mega-tabelkę opisaną jako PORT Function Multiplexing:


Widzimy też literki. I zasłona niezrozumienia opada :) Czyli każda literka przyporządkowana jest do konkretnego rodzaju peryferium. Nas interesuje SERCOM0, czyli kolumna z literką C i D. Dowiadujemy się jednak z odnośnika nr 2 że kolumna C jest dedykowana do I2C, więc pozostaje nam tylko kolumna z literką D. Wybieram  na razie na czuja piny PA04, PA05, PA06 bo widzę w kolumnie D przy tych pinach wpisy SERCOM0/PAD[0] , SERCOM0/PAD[1], SERCOM0/PAD[2] . Nie wiem jeszcze na tym etapie jak przyporządkować funkcjonalności typu MOSI, MISO, CLK. Trzeba rozszyfrować te PAD[x]. Szukam zatem czy przypadkiem coś znajdę o tych PAD[x] w rejestrach SERCOM SPI. Znajduję coś takiego w rejestrze CTRLA:


w polu bitowym DIPO wybieramy na którym PAD[x] chcemy mieć MISO w trybie MASTER lub MOSI w trybie SLAVE. Natomiast w polu bitowym DOPO
ustawiamy resztę zgodnie z opisem. Żeby nam nie poumykały nasze dokonania  podsumujmy co trzeba ustawić , najpierw ustalmy na jakim pinie jaka funkcjonalność SPI nas interesuje zatem :

PA04 (PAD[0]) --> MOSI
PA05 (PAD[1]) --> CLK
PA06 (PAD[2]) --> MISO

Potrzebujemy zatem ustawić w module SERCOM SPI :

CTRLA --> DIPO  -->  0x2 / w trybie MASTER przyporządkuj do PAD[2] MISO
CTRLA --> DOPO -->  0x0 / w trybie MASTER przyporządkuj do PAD[0] MOSI a do PAD[1] CLK (na starcie tak jest więc można pominąć ten zapis)
W module PORT odłączamy piny od modułu PORT a podłączamy je do modułu PMUX:
PORTA --> PINCFG4 --> PMUXEN --> 1 / podłącz pin PA04 do modułu PMUX
PORTA --> PINCFG5 --> PMUXEN --> 1 / podłącz pin PA05 do modułu PMUX
PORTA --> PINCFG6 --> PMUXEN --> 1 / podłącz pin PA06 do modułu PMUX
PORTA --> PMUX2 --> PMUXO --> 0x3 / podłącz pin PA05 (nieparzysty pin) do modułu SERCOM0 (literka D)
PORTA --> PMUX2 --> PMUXE --> 0x3 / podłącz pin PA04 (parzysty pin) do modułu SERCOM0 (literka D)
PORTA --> PMUX3 --> PMUXE --> 0x3 / podłącz pin PA06 (parzysty pin) do modułu SERCOM0 (literka D)

Komentarza wymaga w jaki sposób ustaliłem numerek rejestru PMUXn bo jest to trochę mało intuicyjne i trzeba posłużyć się wzorami podanymi przy opisie pól bitowych PMUXO i PMUXE

Weźmy rozwarzmy pin PA05, jest to numerek pinu nieparzysty a więc ustawiać go będziemy w PMUXn w polu bitowym PMUXO widzimy tam wzorek (2*n + 1) , który wskazuje na numer pinu gdzie n to numer rejestru PMUXn

Zatem dla n = 2 wychodzi nam ze wzorku wartość 5 czyli wskazuje nam pin numer 5, to znaczy , że PMUX2 wskaże nam ustawienia dla pinu nr 5.
Piny PA04 i PA06 są parzyste więc tutaj ustawiamy w polu PMUXE , wzorek wtedy wygląda tak : (2*n).

Wydaje mi się, że na tym etapie dotarliśmy do końca i można podsumować konfigurację na obecną chwilę , jeśli coś pomineliśmy w ustawieniach to wyjdzie nam to w boju. Ciekawi mnie jeszcze tylko aspekt związany z konfiguracją np kierunku pinu czy to, że skonfigurowaliśmy pin na poszczególną funkcję SPI , automatycznie nam skonfiguruje pin jako wejście lub wyjście ? tego na tę chwilę nie wiem ale w/g mnie powinno tak się stać jeśli peryferium przejmuje kontrolę nad pinem. Tu wątpliwość rozwiana, nie musimy dodatkowo konfigurować pinów tj. kierunku i rodzaju dla MISO , MOSI i SCK bo nad tym przejmuje kontrole moduł SERCOM. Wyjątkiem jest tylko pin SS , którego nie używam a który wymagałby konfiguracji pinu.

Podsumujmy zapisy do jakich musimy dojść w programie aby powołać do życia SPI w trybie MASTER. (w programie ustalimy odpowiednią kolejność i uzupełnimy jeśli coś umknęło) :

GENCTRLn1 --> GENEN --> 1  / włącz Generator nr 1
GENCTRLn1 --> SRC --> 0x6  / ustaw źródło zegara Generatora nr 1 na OSC16M czyli po resecie 4 MHz 
PCHCTRL17 --> CHEN --> 1  / włącz kanał dystrybucji zegara SERCOM_slow 
PCHCTRL17 --> SRC --> 0x1 / podepnij SERCOM_Slow do Generatora nr 1
PCHCTRL18 --> CHEN --> 1 / włącz kanał dystrybucji zegara SERCOM0 Core 
PCHCTRL18 --> GEN --> 0x0   / podepnij SERCOM_core do Generatora nr 0 (na starcie tak jest ustawione ,więc można pominąć ten zapis) 
CTRLA --> MODE --> 0x3  / włącz tryb SPI MASTER dla SERCOM
CTRLA --> ENABLE --> 1 / włącz SPI
CTRLB --> RXENABLE --> 1 / włącz RX
BAUD --> BAUD --> 0 / ustaw na 8 bitach wartość Baud Generator
CTRLA --> DIPO  -->  0x2 / w trybie MASTER przyporządkuj do PAD[2] MISO
CTRLA --> DOPO -->  0x0 / w trybie MASTER przyporządkuj do PAD[0] MOSI a do PAD[1] CLK (na starcie tak ustawione , więc można pominąć ten zapis)
PORTA --> PINCFG4 ---> PMUXEN --> 1 / podłącz pin PA04 do modułu PMUX
PORTA --> PINCFG5 ---> PMUXEN --> 1 / podłącz pin PA05 do modułu PMUX
PORTA --> PINCFG6 ---> PMUXEN --> 1 / podłącz pin PA06 do modułu PMUX
PORTA --> PMUX2 ---> PMUXO --> 0x3 / podłącz pin PA05 (nieparzysty pin) do modułu SERCOM0 (literka D)
PORTA --> PMUX2 ---> PMUXE --> 0x3 / podłącz pin PA04 (parzysty pin) do modułu SERCOM0 (literka D)
PORTA --> PMUX3 ---> PMUXE --> 0x3 / podłącz pin PA06 (parzysty pin) do modułu SERCOM0 (literka D)

Sam jestem ciekawy czy z tych moich wypocin uruchomię SPI w pierwszym podejściu, czy może okaże się  że coś przeoczyłem lub coś poknociłem. Przyznam , że dojście do konfiguracji SPI sprawiło , że się trochę zasapałem. Rozumiem już dlaczego niektórzy uważają , że ATSAM-y mają skomplikowane peryferia i dlatego boją się ich. No ale ja lubię wyzwania , więc nie stanowi to dla mnie problemu.


SPI uruchomione, efekt działania na powyższym zrzucie z analizatora stanów logicznych. Program co 100 ms wysyła znak A. Program może mało ambitny ale chodziło mi tylko o pierwsze  uruchomienie SPI. Co zważywszy na ilość fikołków jakie trzeba było wykonać nie było trywialnym zadaniem. Ale jak już SERCOM-a uda się złamać to można powiedzieć , że ATSAM-y nam nie straszne :).

Odnośnie rodziny ATSAML21 warto wspomnieć , że mają bardzo dobre peryferium obsługujące dotyk oraz unikalne w świecie cortexów, eventy. Po za tym krótkie Wake-up time na poziomie 1.2 us (dla porównania STM32L0 mają 5 uS ,czyli ponad cztery razy gorzej) , ATSAML21 pobierają 35uA/MHz w normalnym trybie active mode (STM32L0 93uA/MHz - prawie 3 razy gorzej). Żeby nie być gołosłownym odnośnie parametrów STM32L0 :



Porównanie do STM32  wynika stąd , że to popularne u nas procki ale to nie oznacza , że dobre. Jest jeszcze jeden ciekawy aspekt do porównania , tak sobie zerknąłem na czas dostawy z fabryki procków u globalnego dystrybutora Mouser. Dla ATSAML21 czas produkcji to 6 tygodni a dla STM32L0 to aż 13 tygodni. Potwierdza to zasłyszane przeze mnie informacje, że firma STM ma globalnie problemy z terminowością dostaw i jest to podobno pięta achillesowa tej firmy.

ATSAML21 to naprawdę bardzo ciekawe procki i na pewno nie są tak nudne jak STM32L0. Wady jakie widzę, to jak już pisałem drogie płytki developerskie i mało kto jak widzę odważy się je programować bez ASF w ATMEL STUDIO. Ja się odważyłem w myśl zasady im większy trud tym większa satysfakcja :)

Samo przeniesienie wykontycypowanych w artykule ogólnych zapisów do programu nie sprawiło mi najmniejszego problemu. Nie zaglądałem nawet do plików nagłówkowych z nazwami modułów i rejestrów, oparłem się całkowicie na podpowiedziach środowiska SEGGER przy edycji. Szło to bardzo szybko i sprawnie. Raz zapamiętać jaka konwencja obowiązuje i tyle. Ilość linijek kodu da się zminimalizować  ,  po starcie procka niektóre wartości są takie jakich potrzebujemy w ustawieniach.

Projekt z GitHuba ściągamy lokalnie na dysk za pomocą komendy (Linux w konsoli):

git clone https://github.com/PICmajster/ATSAML21_SPI.git

i dodajemy w środowisku SEGGER za pomocą opcji File --> Open Solution
Środowisko SEGGERA ma tę ogromną zaletę oprócz niesamowitej szybkości działania, że generuje w projekcie pliki nagłówkowe dla dowolnego ATSAM-a. Nie trzeba się chrzanić z dołączaniem plików tak jak np. w ECLIPSE. Wszystko co jest potrzebne do programowania ATSAM-ów jest dostępne w środowisku.
Do zastosowań nie komercyjnych środowisko SEGGER-a jest za free bez ograniczeń (przynajmniej na razie ich nie widzę)

Pozdrawiam
picmajster.blog@gmail.com

 



Linki :

ATMEL START - aplikacja webowa , czasami się przydaje aby coś podpatrzeć na obrazkach np. zegar
ATSAML21G18B - strona producenta
Projekt na GitHub dla IDE SEGGER
Artykuł o ATSAML21

Brak komentarzy:

Prześlij komentarz