Forum: Mikrocontroller und Digitale Elektronik SPI transfer length


von Andre R. (arduino_90)


Lesenswert?

Hallo Forum,

ich bin gerade dabei einen WiFi-Chip von Redpine Signals zum laufen zu 
bringen. Genauer ist es ein RS9113 Dualband mit integrierter Antenne.

Ich steuere das Ganze mit einem Arduino UNO über SPI an. Die 
Initalisierung klappt, das heißt prinzipiell funktioniert die 
Übertragung anscheinend. Auch die Antwortbits lassen sich, zumindest 
beim Initialisieren, korrekt auslesen.

Jetzt ist es so, dass vor jedem Tranfser immer einige Kommando-Bytes 
geschickt werden müssen, in denen Bit-weise codiert Informationen wie 
read/write, memory/register usw. stehen. Jetzt steht in dem Userguide 
folgende Codierbeschreibung für das C1 Kommando, was jedem Transfer 
vorraus geschickt werden muss:

C1
Bit [7:6] Command Type
          "00" Init Command
          "01" read/write Command
          "10", "11" reserved

... restliche Bits sind klar verständlich

Bit 2     2-bit or 16-bit length for the transfer
          "0" 2-bit length for transfer
          "1" 16-bit length for tranfser

Bit [1:0] 2-bit length (in terms of bytes) for the transfer (valid only 
if  bit 2 is cleared)
          "00" 4 bytes length
          "01" 1 bytes length
          "10" 2 bytes length
          "11" 3 bytes length


Meine Frage:

Wie soll ich die Bits 0-2 verstehen? Ich bekomme es nicht ordentlich 
übersetzt. Heißt es, dass hier angegeben werden soll, wieviele Bits mit 
einmal übertragen werden? (SPI.tranfser() von der Arduino lib überträgt 
8 Bits)
Andererseits muss man im C2 Kommando schon die "granularity of the 
write/read data", also die Feinheit der Schreibe- und Lesedaten angeben 
(wählbar sind 8-bit oder 32-bit mode).

Für eventuelle Erfahrungen oder Vorschläge für eine richtige Übersetzung 
wäre ich sehr dankbar.

Grüße Andre

von Jim M. (turboj)


Lesenswert?

Andre Richter schrieb:
> Heißt es, dass hier angegeben werden soll, wieviele Bits mit
> einmal übertragen werden?

Nein. Da steht doch ausdrücklich "bytes".

Hier hat wohl jemand die Anzahl der zu übertagenen Bytes optimiert. Denn 
für den Fall Bit 2 = "1" müssen ja die 16 Bit (2 Byte) als Tansferlänge 
extra übertragen werden, was bei sehr kurzen Transfers natürlich einen 
signifikanten Overhead erzeugen würde.

Bei Transferlängen von 4,3,2 oder 1 kann man daher mit Bit2="0" die 
Länge codiert in Bit 0 und Bit 1 angeben und so 2 Bytes sparen. Wenn Bit 
2="1" ist, dann werden Bit 0 und Bit 1 offenbar nicht beachtet (don't 
care).

von Rainer U. (r-u)


Lesenswert?

Ich lese es eher so, dass Du Dich entscheiden sollst, wie Du die 
Übertragungslänge angeben willst.

Wenn Du Bit2 = 0 setzt, kannst Du 1 bis 4 bytes senden (je nach bits 
1,0)

Wenn Du Bit2 = 1 setzt, hast Du 2 Byte für die Längenangabe, aber wie 
die 2 Byte dann interpretiert werden, steht evtl. woanders.

Und wenn ein SPI.tranfser() 8 bit überträgt, musst es einfach 
entsprechend oft aufrufen..

von Andre R. (arduino_90)


Lesenswert?

aha! jetzt macht es auch sinn, warum C3 (LSB of transfer length) und C4 
(MSB of transfer length) weg fallen, wenn C1 [2] = 0 !

peinlich!

vielen dank für den anstoß!

thread kann als gelöst markiert werden

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.