Wie man Daten mit Arduino SPI

im Datenblatt liest, heißt es, dass ich 32 serielle Uhren anwenden sollte, um die 32 Datenbits zu erhalten Ich programmiere, dass dies Arduino ist?

Kommentare

  • Ich empfehle Ihnen, die Beispiele der SPI-Bibliothek zu öffnen und sie zu überprüfen. Wie auch immer, der Code sollte sein byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); und Sie finden in result die 32 Bits, die Sie benötigen
  • Ich habe das bereits getan. Aber den Energiechip Ich verwende STPM10 und es wird empfohlen, simplexes synchrones SPI zu verwenden, wenn das MOSI nicht angeschlossen ist. Es gibt nur ein Zeitdiagramm, um vom Lesen von Bytes und Schreiben von Bytes zu wechseln. Wenn ich SPI.transfer () verwendet habe, sind die Daten nicht stabil und ich denke nicht zuverlässig
  • Wie sagt man, ist es nicht zuverlässig? Das Peripheriegerät ist Vollduplex, und je nach Funktionsweise ist der einzige Weg, Daten zu empfangen, das Senden von Dummy-Daten. Wenn MOSI ist nicht verbunden, nun, es spielt keine Rolle, ‚ ;; Beachten Sie jedoch, dass Sie ‚ den MOSI-Pin nicht für andere Aufgaben verwenden können. Haben Sie übrigens daran gedacht, den Slave-Auswahl-Pin des anderen Peripheriegeräts richtig einzustellen? Haben Sie den SS-Pin auf dem Arduino-Board oder einem anderen verwendet?

Antwort

Sie rufen SPI.transfer() viermal, jedes Mal, wenn der zurückgegebene Wert nach ordnungsgemäßer Bitverschiebung in einer Variablen gespeichert wird.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Ich nehme die niedrigstwertige an Byte wird zuerst empfangen. Stellen Sie sicher, dass der SPI-Modus der richtige ist, wie in Ihrem Datenblatt angegeben.

Wenn der Slave nicht damit umgehen kann, zwischen Bytes deaktiviert zu werden (was SPI.transfer() ist wird dies am Ende der Transaktion tun), dann können Sie entweder den Hardware-SPI-Ansatz von st2000 ausprobieren oder Bitbanged-SPI mit shiftIn() verwenden.

Kommentare

  • Ich bin mir nicht sicher, ob dies funktioniert. Wir müssen wirklich wissen, wie der SPI-Slave funktioniert, bevor wir davon ausgehen können, wie er reagieren wird. Wie gut ist der SPI-Slave ausgelegt, wenn die Chipauswahlleitung bei jeder 8-Bit-SPI-Transaktion aktiviert und deaktiviert wird? Das heißt, ein solcher SPI-Slave kann leicht nicht mehr mit dem SPI-Master synchronisiert werden. Wie können Sie sicher sein, welches 8-Bit-Byte Sie tatsächlich lesen?
  • @ st2000 Die OP-Säge war geeignet, nicht genügend Details anzugeben. Bis dahin können nur Annahmen getroffen werden.
  • Alle Beispiele, die ich ‚ gesehen habe, verwenden SPI, transfer (0), um Daten zu lesen, anstatt SPI.transfer (0xff). Sie verwenden SPI.transfer auch zum Schreiben von Daten. Ich habe ‚ immer noch nicht herausgefunden, was SPI mit 0 oder 0xff macht, wenn Sie tatsächlich Daten lesen. Wird dies an den Slave gesendet?
  • @ S.Imp Sie ‚ sind Dummy-Bytes. Sie können alles senden, was Sie senden möchten. Das Gerät am anderen Ende verwirft sie weiterhin, wenn es die Daten überhaupt bezahlt. SPI.transfer() wird immer verwendet, teilweise aufgrund der intrinsischen Vollduplex-Natur von SPI und (aufgrund des ersten Faktors) teilweise aufgrund der Art und Weise, wie die meisten MCUs ihre SPI-Peripheriegeräte implementieren. Sobald die Uhr zu laufen beginnt, befinden sich auf den MOSI- und MISO-Leitungen immer “ -Daten „, ‚ Es liegt nur an jedem Teilnehmer im Bus, ob er es liest oder nicht, basierend auf dem vordefinierten Protokoll der höheren Schicht, ob die “ -Daten “ ist sinnvoll oder nicht.
  • Es wäre nicht ‚ nicht völlig falsch zu sagen, dass Sie ‚ Lesen Sie nicht wirklich, ohne auf einen SPI-Bus zu schreiben, und umgekehrt. Es ist daher sinnvoll, einfach ein Peripheriegerät zu entwerfen, das ein Byte in einem Register benötigt und 8 Zyklen später ein Byte in einem anderen (oder sogar demselben) Register zurückgibt, um nur die Anwendungsfälle zu verallgemeinern. Dann ist es ‚ Sache der Anwendung des Benutzers ‚, zu entscheiden, ob sie ‚ sind interessiert nur das Byte, das zuerst ausgeschrieben wurde (TX) oder das zurückgelesene (RX) oder beides (TX und RX). Daher auch der mehrdeutige Name transfer(), da er sowohl Lese- als auch Schreibrollen erfüllt.

Antwort

Sparkfun hat eine gute Erklärung für SPI:
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

Die Arduino-IDE verfügt über eine SPI-Bibliothek, die mit der IDE geliefert wird.
http://www.arduino.cc/en/Reference/SPI

Die Bibliothek enthält zwei Beispiele:
Verwenden von SPI zum Lesen eines Luftdrucksensors
Steuern eines digitalen Potentiometers mit SPI

Antwort

Ziel ist das Lesen von 32 Bit mit der SPI-Port des (unbekannten) Geräts.

Wenn das Gerät die SPI-Chip-Select-Leitungsaktivität toleriert (von inaktiv zu aktiv zu inaktiv für jeden gelesenen 8-Bit-Byte), sollten Sie in der Lage sein, die gewünschten 32 Datenbits zu erhalten, indem Sie 4 aufeinanderfolgende 8 ausführen Bit-SPI wird gelesen.

Wenn das Gerät die oben genannte SPI-Chipauswahl-Leitungsaktivität jedoch nicht toleriert (dh wenn das Gerät erfordert, dass die SPI-Chipauswahl für die gesamte 32-Bit-SPI-Transaktion aktiv ist), Sie können die 32-Bit-Transaktion nicht in 4 einzelne 8-Bit-SPI-Transaktionen aufteilen, ohne die SPI-Chipauswahlleitung zu steuern. Das folgende Codebeispiel zeigt, wie dies gemacht wird:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

Das obige Beispiel stammt aus der Arduino SPI-Bibliothek Webseite und ist eine 16-Bit-Übertragung (nicht 32-Bit-Übertragung). Um eine 32-Bit-Übertragung zu codieren, rufen Sie die SPI.transfer-Methode weiterhin mit dem Parameter SPI_CONTINUE auf.

wird später hinzugefügt …

Es scheint, dass die Verwendung der DueExtendedSPI-Methoden nicht empfohlen wird . Und SPISettings und SPI.beginTransaction () sollen verwendet werden? Wenn ja, zeigt diese Seite einen Beispielcode, in dem der Code die SPI-Chipauswahlzeile explizit steuert (suchen Sie nach SlaveAPin & SlaveBPin). Beachten Sie, wie der Code 24 Bit von Slave A liest und 8 Bit auf Slave B schreibt. Um 32 statt 24 Bit zu lesen, müssen wir ein Segment des Codes (zusammen mit einigen anderen unterstützenden Änderungen) auf folgende Weise ändern:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Kommentare

  • Wir müssen wirklich die Spezifikationen des Slave-SPI-Geräts sehen, um mehr zu komponieren spezifische Antwort.
  • Ich verwende das STPM10-Evaluierungsboard. Die Verbindung ist ein simplexes synchrones SPI, und das MOSI des Arduino ist mit nichts verbunden. Es gibt ein Zeitdiagramm zum Umschalten von schreibgeschützt und schreibgeschützt. Meine Probleme sind, wie man die Daten aus den Registern des Chips liest. Ich habe SPI.transfer verwendet, aber ‚ glaube nicht, dass die Daten zuverlässig sind.
  • Das STPM10-Zeitdiagramm auf Seite 11 sieht nicht wie eine Standard-SPI-Transaktion aus. Ich bin geneigt zu sagen, dass Sie die Arduino SPI-Bibliothek nicht verwenden können. Stattdessen müssen Sie dies möglicherweise vollständig in der Software ausklingen lassen. Zum Beispiel glaube ich nicht, dass es im Standard-SPI-Bus eine “ SYN “ -Leitung gibt. Und ich glaube nicht, dass die Chip Select-Zeile vor dem Ende der SPI-Transaktion hoch gehen sollte.

. Id id = „c0d27f4588“>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.