Forum: Mikrocontroller und Digitale Elektronik SPI Bus: Anfängerfrage zur adressierung


von Sebastian Salzgeber (Gast)


Lesenswert?

Morgen

Ich habe mich am Wochenende mal an SPI gewagt. Nachdem ich bisher nur 
allgemeines mit dem Arduino gemacht hatte, hat mich die komplexität 
etwas übermannt.

Ich habe einen MCP23S17 
(http://ww1.microchip.com/downloads/en/devicedoc/21952b.pdf) welcher 
über SPI mit meinem Arduino sprechen soll. Ich hatte glücklicherweise 
einen BEispielcode auf pastebin dazu gefunden 
(http://pastebin.com/xgJr1uLz). Dort steht dann soetwas:
1
  writeData(GPIOB,0xff);
2
  delay(300);
3
  writeData(GPIOB,0x00);

Diese var GPIOB scheint eine Art vordefinierte Adresse zu sein. Im 
Datasheet fand ich auf Seite 5 unter Punkt 1.3 einen Text samt Tabelle 
der die Technik erklärte.

Was mir allerdings noch unklar ist und womit wir zu meiner Frage kommen: 
Wenn ich GPIOB den Wert 0/255 gebe, wem gibt er da diesen Wert? Ich 
verstand GPIOB als "GP I/O B", also der I/O-Pin des B-Registers. Aber 
welcher von den 8 spricht man damit an? Wie kann ich sagen dass Pin GPB3 
ein Output sein soll, bzw GPB4 ein Input der HIGH sein soll?

Ich bin wie gesagt etwas erschlagen von der Thematik.

Grüße
Sebastian

von Krapao (Gast)


Lesenswert?

> Was mir allerdings noch unklar ist und womit wir zu meiner Frage kommen:
> Wenn ich GPIOB den Wert 0/255 gebe, wem gibt er da diesen Wert?

Den REGISTER 1-10: GPIO – GENERAL PURPOSE I/O PORT REGISTER (ADDR 0x09) 
je eins für A und B.

Wenn du einzelne Pins manipulieren willst, dann zuerst Einlesen, dann 
Bitmanipulation und dann Zurückschreiben.

IMHO passiert nix, wenn du auf einen als Input konfigurierten Pin einen 
Wert schreibst. Writing to this GPIO register modifies the Output Latch 
(OLAT) register (und dadurch den output driver). Aber: Pins configured 
as inputs turn off the associated output driver and put it in 
high-impedance. Aufpassen muss man dann allerdings, wenn man den Pin 
dann doch mal als Output Pin konfiguriert, weil dann OLAT einen 
Nicht-Defaultwert hat.

> Wie kann ich sagen dass Pin GPB3
> ein Output sein soll, bzw GPB4 ein Input der HIGH sein soll?

Dafür sind IMHO die REGISTER 1-1: IODIR – I/O DIRECTION REGISTER (ADDR 
0x00) da, je eins für A und B

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Oje,

als Hilfe:

Bei dem Baustein gibt es 2 Adressen für die Register, je nach Inhalt des 
BANK-Registerbits. (Reihenfolge der PORTA/B-Register)

Bei dem Baustein ist es üblich,

-Die Richtungen der Datenbits in das TRIS-Register zu schreiben,
-Die Ausgabe-Daten in das LAT-Register zu schreiben,
-Die Eingabe-Daten aus dem Port-Register zu lesen.

Ich mache das immer so, daß ich im Prozessor Schattenregister habe, in 
die ich alle Bits reinschreibe (und auch auslese) und dann in einem 
Schwund die TRIS-Daten(Init), die LAT-Daten ausgebe(Push) oder die 
PORT-Daten einlese(Pull). Das ist einfacher, als immer per SPI jedes 
Register einzeln zu bedienen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.