Hallo,
zur Situation: ich bin zwar schon lange Softwareentwickler, beschäftige
mich aber erst seit Kurzem mit Mikrocontroller-Programmierung.
Entschuldigt daher, wenn ich nicht immer die korrekten Begriffe verwende
(bitte korrigiert mich).
Ich arbeite gerade mit dem SAM4S_EK2-Evaluierungsboard und möchte eine
SPI-Kommunikation mit einem SSD1351-LCD-Controller basteln. Es gibt von
Atmel einiges an Material und Beispiele. Was ich aber nicht gefunden
habe, wie ich die verwendeten Pins ändern kann. Am Board sind die Pins
für die SPI-Kommunikation vorkonfiguriert:
http://asf.atmel.com/docs/latest/sam.drivers.spi.example.sam4s_ek2/html/index.html
Das Datenblatt stimmt damit überein:
http://www.atmel.com/Images/Atmel_11176_32-bit-Cortex-M4-Microcontroller-SAM4S-EK2_User-Guide.pdf
*** Frage 1: wie kann ich diese vorgegebenen Pins ändern?
*** Frage 2: aus dem Datenblatt des LCD-Controllers sehe ich, dass für
das 4-wire-SPI-MCU-Interface folgende Pins nötig sind:
SDIN => MOSI
SCLK => SPCK
CS => NPCS0
D/C => ?
RES => ?
Links seht ihr die Pin-Bezeichnungen aus dem LCD-Controller-Datenblatt,
rechts davon, wie ich annehme, dass die Bezeichnungen aus dem
Datenblatt/Beispiel von Atmel sind - stimmen diese und welche Zuordnung
fehlen noch?
Danke
Martin
Hat jemand vielleicht einen Tipp, wie ich das auf meinem Board machen
könnte? Die Methode ioport_configure_port_pin gibt es in meiner ioport.h
nicht.
Bin für jeden Hinweis dankbar.
LG
Martin
Mit welcher Entwicklungsumgebung arbeitest du denn?
Im Atmel Studio 7 sind unzählige Beispielprojekte.
Wenn man diese Anschaut, kommt man schon dahinter wie das alles
zusammenhängt.
Hallo,
danke für deine Hilfe! Ich arbeite mit Atmel Studio 7.
Dieses SPI-Beispiel (und auch andere) bin ich bereits durchgegangen und
habe sie auch so einigermaßen verstanden.
In diesem SPI-Beispiel von Atmel werden die bereits definierten SPI-Pins
verwendet. Was ich aber noch nicht gefunden habe ist, wie ich diese Pins
ändere bzw. definiere. Ich könnte mir vorstellen, dass das so gehen
könnte, wie ich in meinem zweiten Post geschrieben habe - aber ich bin
mir nicht sicher.
Was vielleicht auch interessant ist zusätzlich zu dem Code von meinem 2.
Post: mit diesem PORTD wird dann ein SPI-Device erstellt.
1
structspi_devicespi_device_conf={
2
.id=IOPORT_CREATE_PIN(PORTD,1)
3
};
Was meinst du? Wenn ich diesen Weg weiterverfolge, müsste dieser Code
genügen, um die SPI-Pins umzukonfigurieren? Und sollte dann diese
Definition des SPI-Devices genügen, damit die SPI Master driver alle
neuen Pins verwendet?
Danke!
Du kannst nicht jedem belibigen Pin jede Funktion zuordnen.
Ich fürchte du musst mal genauer in das Datenblatt schauen.
Die Belegung für dein EVK ist in der ASF in
src\ASF\common\boards\board.h
und
src\ASF\sam\boards\4s_ek2\sam4s_ek2.h
hintelegt.
entweder änderst du diese Dateien ab oder du stellst dein Project auf
BOARD == USER_BOARD
in den Tool setting um und definierst deine Portpins nach dem Muster aus
den EVK2 Dateien
Das waren jetzt wichtige Hinweise. Ich habe da Konfigurationen, die SPI
betreffen, in diversen Dateien gefunden - diese Settings stimmen auch
mit den Angaben im Datenblatt überein:
Aber das Seltsame ist, dass keine dieser Definitionen sonstwo im Code
vorkommen - also ich finde keinen Code, der sagt, dass z.B. PA11 eben
als NPCS0 genommen werden soll - nur in dieser Zeile (ist auch oben
drin):
==> das würde bedeuten, dass genau mit diesen Methoden die SPI-Pins
definiert werden. Sehe ich das richtig?
Aber dann frage ich mich, wozu gibt es diese Zeile:
Habe gerade etwas Passendes gefunden. Diesen Weg werde ich nun
beschreiten ;-) und dann von meinem Erfolg bzw. Mißerfolg berichten:
http://electronics.stackexchange.com/a/194184
Danke.
verwendet einen Index der alle verfügbaren Portpins durchnummeriert.
Und damit für Funktionen passt, welche einen solchen Index erwarten.
Interne wird dann wieder auf den Port und eine Bitmaske umgerechnet um
die entsprechenden SFR anzusteuern.
während durch
1
/* ========== Pio definition for SPI peripheral ========== */
eine Bitmaske definiert wird. Dies kann ja auch mal nützlich sein.
Vor allem wenn man mal selber direkt auf die SFR zugreifen will.
Über nichtbenutzte Defines, die vom Hersteller geliefert werden, würde
ich mir keine allzu große Gedanken machen.
Ok, verstehe. Danke!
Und weil du gesagt hast, dass ich vielleicht gar nicht beliebige Pins
verwenden kann. Ich habe im Datenblatt z.B. Angaben wie im angehängten
Screenshot datenblatt-pins.png .
Diese Pins sind ja schon belegt mit diversen "Aufgaben". Nur die Spalte
bei "Peripheral C" ist leer. Das heißt doch, dass pro Peripheral die
"Aufgabe" eines Pins eine andere ist und dass diese Pins für Peripheral
C unbelegt sind. Stimmt das so? Und - ich weiß nicht, ob ich mich
technisch richtig ausdrücke - wenn ich diese Pins auf Peripheral C
schalten würde, dann könnte ich sie nutzen wie ich möchte?
Stimmt das so oder bedeutet der Ausdruck Peripheral etwas ganz anderes?
Ich habe schon danach gegoogelt, aber keine zufriedenstellenden
Antworten bekommen.
Mann kann pro Pin desen Funktion auf A, B oder C festlegen.
Welche Funktion dann gemeint ist steht in der Tabelle. Wenn in einer
Zelle nichts steht, dann wird auch nichts funktionieren.
hier sieht man das die Funktion auf "A" (PIO_PERIPH_A) festeglegt wird.
Also kannst du z.b. für SPCK nur die Pins benutzen für die es in der
Tabelle hinterlegt ist. Andere gehen nicht
Überleg ma wie groß eine Matrix sein müsste, die jeden Pin mit jedem
beliebigen Peripherie Signal verbinden könnte.
Und diese Matrix würde man pro Pin benötigen.
Ok, verstehe ich das richtig:
1. wenn im Datenblatt eine Zelle der Pin-Belegung leer ist, dann kann
ich dort auch nichts belegen, weil dieser Pin nicht mit dieser
Peripherie verbunden ist?
2. Ich kann nur die Pins für SPI verwenden, die im Datenblatt dafür
definiert sind?
=> wenn 2. mit Ja zu beantworten ist, dann frage ich mich, ob das nun
durch die Konstruktion des Boards vorgegeben ist oder durch die
Konstruktion des Microcontrollers. Gibt es also am SAM4S-Microcontroller
Pins, die speziell für SPI konstruiert sind?
Danke für deine Geduld! Mir kommen erst langsam die ganzen
Zusammenhänge...
Martin Z. schrieb:> => wenn 2. mit Ja zu beantworten ist, dann frage ich mich, ob das nun> durch die Konstruktion des Boards vorgegeben ist oder durch die> Konstruktion des Microcontrollers. Gibt es also am SAM4S-Microcontroller
Das gibt der Mikrocontroller vor.
Nochmal zum Klarstellen:
Die GPIO können 3 unterschiedliche alternative Funktionen haben. und
zwar bis zu 3. Welche das jeweils sind steht im Datenblatt des
Bausteins.
die 3 sind auch nicht in Stein gemeiselt. Es gibt andere Kontroller mit
mehr oder weniger Alternativen Funktionen je Pin. Auch bei den STM ist
das ähnlich gelöst.
Man ist in der Auswahl einfach eingeschränkt.
Wenn keine Altenative Funktion ausgewählt ist kann man den Pin als
"einfacher" IO Pin benutzen