Forum: Mikrocontroller und Digitale Elektronik Frage zu SPI.beginTransaction


von Kai Markus T. (kmt)


Angehängte Dateien:

Lesenswert?

Hallo, zusammen!

Ich versuche gerade, einem ESP32 Modul von Olimex die Kommunikation mit 
einem MAX3421e über SPI beizubringen. Mir ist allerdings nicht ganz 
klar, wie ich mit den Befehlen SPI.beginTransaction umgehen soll.

Die Doku schreibt, er initialisiert den SPI Bus mit den angegebenen 
Settings. Warum macht man das nicht direkt im Befehl SPI.begin()?

Oder anders herum gefragt: Haltet ihr es für sinnvoll, jede Aktion im 
SPI Bus mit beginTransaction()/endTransaction() zu kapseln?

Das Versenden von mehreren Bytes, ohne dass CS zwischendurch wieder HIGH 
geht, scheint ohnehin nur über writeBytes zu gehen, oder kann ich CS 
auch selbst steuern?

Beste Grüße
Kai

von Wolfgang (Gast)


Lesenswert?

Kai Markus T. schrieb:
> Oder anders herum gefragt: Haltet ihr es für sinnvoll, jede Aktion im
> SPI Bus mit beginTransaction()/endTransaction() zu kapseln?

Wozu brauchst du beginTransaction().
Zumindest die verlinkten Beispiele zur Nutzung der SPI Bibliothek kommen 
ohne aus. Das CS-Signal wird dort direkt per digitalWrite() gesetzt.
Sonst guck mal im Quellcode, was beginTransaction()/endTransaction() 
genau machen.
https://www.arduino.cc/en/Reference/SPI

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Kai Markus T. schrieb:
> Die Doku schreibt, er initialisiert den SPI Bus mit den angegebenen
> Settings. Warum macht man das nicht direkt im Befehl SPI.begin()?
Weil an 1 SPI Bus mehrere Teilnehmer hängen können, die jeweils eigene 
Timingparameter (Taktfrequenz, CPOL, CPHA) brauchen.

SPI.begin() ist wie wenn du im Auto den Motor anlässt.

SPI.beginTransaction()ist, wie wenn du den passenden Gang 
(vorwärts/rückwärts) einlegst, um nicht in die Garagenwand zu fahren.

Und die Daten im Telegramm bestimmen dann die Richtung, in die es geht.

> jede Aktion im SPI Bus mit beginTransaction()/endTransaction() zu kapseln?
Natürlich macht es nur eigentlich nur dann Sinn, irgendwelche Befehle 
auszuführen, wenn es nötig ist. Alles andere wäre 
Rechenzeitverschwendung.

> oder kann ich CS auch selbst steuern?
Im Prinzip kannst du jeden x-beliebigen Pin als SS# (so heißt der CS 
beim SPI) nehmen. Aber die vorgefertigte Bibliothek (hmmm..., oder war 
es sogar die vorgefertigte ESP-Hardware...) kann das nur mit den 
vordefinierten Pins.

: Bearbeitet durch Moderator
von Kai Markus T. (kmt)


Lesenswert?

Hallo, zusammen!

Schon mal vielen Dank für die hilfreichen Antworten!
Die Arduino Bibliothek habe ich deswegen nicht in Betracht gezogen, weil 
sie nicht auf meine Hardware passt. Der ESP32 hat m.W. ja schon 4 
SPI-Interfaces.

Ich brauche beginTransaction, um z.B. SPI_MODE und die Geschwindigkeit 
zu setzen.

Der Tipp mit den mehreren ICs am SPI Bus war sehr wertvoll; das hatte 
ich tatsächlich nicht auf dem Zettel (wobei da die ESP32 Bibliothek 
nicht ganz stringent ist. Eigentlich sollte ja jedes IC am SPI-Bus 
seinen eigenen CS/SS Pin haben, und dann gehört diese Einstellung m.E. 
nicht in das SPI.begin() Kommando, sondern in SPI.beginTransaction().

Ich hatte dieses ganze Transaktionskommando anfangs so verstanden: 
beginTransaction --> SPI CLOCK und MSB/LSB und MODE wird konfiguriert, 
CS wird LOW gezogen. Dann mach ich meine Transfers (die keine Auswirkung 
auf CS haben), und am Ende führe ich endTransaction aus (und CS wird 
dadurch wieder auf HIGH gesetzt) --> ist aber nicht so. Im 
Hardware-CS-Modus setzt die Bibliothek bei write(byte) nach jedem Byte 
CS wieder HIGH.

Was ich letzten Endes mache, muss ich mal sehen, denn ich versuche, die 
vorgefertigte MAX3421 Bibliothek zu benutzen, die ich dann von Arduino 
auf ESP32 anpasse. Und je weniger Stellen ich anpassen muss, desto 
lieber ist mir das...

Einen schönen Sonntag aus HH!
Kai

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.