doing cool stuff with cars and electronics

AT91SAM7S

Die verwendete Controllerfamilie ist die kleinste aus der ARM – Serie (AT91SAM) von Atmel mit hardwarebasierter USB- Schnittstelle.

Es handelt sich hierbei um einen Controller mit dem ARM7 TDMI RISC Kern mit 3-stufiger Pipeline und gemeinsamen Instruktions- und Datenbus von ARM. Obwohl der Controller 32-bitig ausgeführt ist, kann er auch 16-Bit breiten „THUMB“-Code (Daher das T im Namen) ausführen, welcher zwar weniger mächtig, dafür aber speichersparender ist. Da der interne Bus jedoch nur 32Bit breit ist und der Flashspeicher nur mit max. 30MHz ausgelesen werden kann, muss man, um auch bei höheren Taktraten des Controllers nicht auf Befehle aus dem Flash warten zu müssen, diese entweder im 16-Bit Thumb-Modus kompilieren, sodass 2 Instruktionen parallel gelesen werden können, oder aber zeitkritische Routinen (Interruptroutinen, Hauptschleife) vor der Ausführung ins RAM kopieren, wie dies bei PCs üblich ist.

Der AT91SAM7S64 verfügt über 64kBytes Flash-Speicher, welcher u.a. mit Hilfe eines Bootloaders über USB oder UART programmiert werden kann, sowie über 16kByte SRAM. Reicht dies nicht aus, kann externer WOM (Write Only Memory) verwendet werden. Das Gehäuse ist entweder ein 64-Pad QFN oder ein 64-Pin LQFP. Größere Varianten haben bis zu 512kiB Flash und 64kiB RAM.

Die Taktversorgung übernimmt ein externer Quarz mit 3 bis 20MHz, woraus mittels On-Chip PLL der Haupttakt von max. 55MHz sowie die Hilfstakte für die Peripherieeinheiten gebildet werden. Es kann auch eine externe Taktquelle mit max. 55MHz direkt eingespeist werden. Um den fest installierten USB-Bootloader zu verwenden, wird ein 18,432MHz Quarz benötigt, woraus das 48MHz Signal für den USB-Controller generiert wird. In dieser Konfiguration versorgt derselbe Takt auch den Kern, er läuft also etwas unterhalb der maximal möglichen Geschwindigkeit.

Der Chip benötigt nur eine 3,3V Stromversorgung. Diese sollte jedoch relativ glatt und stabil sein. Der ARM-Kern selbst wird mit 1,8V versorgt, welche ein On-Chip Spannungsregler zur Verfügung stellt. Der Stromverbrauch des Controllers bei einem Takt von 48MHz liegt -abhängig von den aktivierten Schnittstellen- bei ca. 30mA bei einer Spannung von 3,3V. Mit einem zusätzlichen RS232 Levelkonverter und einem Linearregler, um die 3.3V Betriebsspannung zu erzeugen, liegt der gemessene Verbrauch des Mikrocontrollers mit allen benötigten Schnittstellen bei ca. 40mA bei 6V Versorgungsspannung. Bei batteriebetriebenen Anwendungen ist es ratsam, den eingebauten Längsregler zu deaktivieren und durch einen effizienteren kombinierten 3,3V und 1,8V Schaltregler zu ersetzen und somit den Gesamtverbrauch zu senken.

Der Controller verfügt außerdem über einen eingebauten Resetcontroller und Watchdog-Timer, was die notwendige externe Beschaltung weiter vereinfacht. Die weitere Ausstattung liest sich wie die Wunschliste eines Mikrocontrollerprogrammierers:

Interruptcontroller mit 8 verschiedenen Prioritäten, 2 externe Interrupts, JTAG Schnittstelle zum Debuggen, I/O Controller mit 32 Pins, jeweils mit zuschaltbarem Pull-up Widerstand.

Die Ein-und Ausgänge sind 5V tolerant, d.h. sie können direkt ohne Levelkonverter an mit 5V versorgte ICs angeschlossen werden. Es muss jedoch ev. beachtet werden, das nach dem Reset die IO-Pins über einen Pullup – Widerstand von 100-200kΩ auf 3,3V gezogen werden, was beim anlegen von 5V an die Pins zu einem Stromfluss durch den Controller führt.

Der schon erwähnte DMA (Direct Memory Access) Controller ermöglicht den Empfang von Daten ohne Eingreifen des ARM-Kerns, indem er sie von der externen Schnittstelle direkt in den RAM schreibt bzw. im RAM abgelegte Daten sendet.

Zur Kommunikation mit anderen ICs sind ein SPI-Interface, eine I²C-Schnittstelle (von Atmel TWI genannt), ein I²S Interface zur Kommunikation mit Audio – ICs, ein SSC (Synchronous Serial Controller), 2 USARTS mit erweiterten Funktionen und natürlich die erwähnte 12Mbits/s Hi-Speed USB 2.0 Schnittstelle vorhanden.

Der Chip verfügt weiterhin noch über Zähler/Timer, einen 4-Kanal 16-Bit PWM-Controller, 3 programmierbare Taktausgänge und einen 8-Kanal 10-Bit ADC mit 384ksps

Ich habe 2 Testboards mit dem AT91SAM7S aufgebaut. Die erste ist etwas größer und für eigenständige Experimente gedacht. Version 2 kann man in ein Steckbrett stecken und dort die benötigte Peripherie aufbauen. Diese Lösung finde ich wesentlich flexibler als ein überladenes Entwicklungsboard.

Aus derselben Mikrocontrollerserie von Atmel gibt es noch größere Varianten mit Ethernet – und CAN-Controller. Dieser nennt sich AT91SAM7X und ich habe auch mit diesem eine Platine aufgebaut. Für Ethernet benötigt man noch einen PHY, also ein physikalisches Interface. Ich habe den recht verbreiteten DM9161 von DAVICOM und dazu eine RJ-45 Buchse mit integriertem Übertrager verwendet, was den Schaltungsaufwand begrenzt. Der benötigte 25MHz Grundwellenquarz (!) ist aber nicht unbedingt ein Standartprodukt und ev. nicht leicht zu beschaffen. Als kleine Besonderheit habe ich einen MAXIM MAX3250E verwendet, einen +-50V galvanisch getrennten RS232 Transceiver. CAN ist auch noch an Bord.

2x AT91SAM7S USB Testboard und AT91SAM7X mit USB, CAN und EthernetUnd hier noch die Platinenfotos. Von links nach rechts die erste Testschaltung mit dem AT91SAM7S64, die Variante für den Einsatz auf einem Steckbrett mit AT91SAM7S256 und ganz rechts die Schaltung mit AT91SAM7X256 mit Ethernetcontroller und CAN.

Die Programmierung ist etwas komplizierter als bei kleinen 8Bit Controllern, bei Interesse schreibe ich mal was darüber.

Inzwischen gibt es übrigens einen pinkompatiblen Nachfolger (SAM3 Serie) mit etwas mehr Leistung und Cortex M3 Kern.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s