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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.