SPI Bus: Anfängerfrage zur adressierung

Gast #2648420
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
Gast #2648756
> 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
(Firma: Promaxx.net) #2649082
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.