Forum: Mikrocontroller und Digitale Elektronik STM32 SPI mehr als 16 Bit übertragen


von Stm32 M. (benson32)


Lesenswert?

Hallo liebe Stm32-Gemeinde,

ich versuche gerade ein 20 bit Protokoll per SPI auf meinem 
Mikrocontroller zu empfangen. Da die Empfängervariable nur 8 bit hat 
komme ich irgendwo durcheinander und bekomme keinen kontinuierlichen 
Empfangsablauf hin.

Hier meine Hardware
Sender ist eine Atmel DSP als Master
Empfänger Stm32100RB SPI als Receive Only slave

Software: Keil V5

Folgende Leitungen kommen aus der DSP
Datenleitung: 20 bit Strings
Sync-Leitung: geht 10µs auf low kurz auf high dann wieder low für 10µs
Clock: 2MHz

Konfiguration Stm32
Receive only Slave
8 bit mode
circulare datenübertragung (Mir fällt gerade auf das könnte das Problem 
sein, kann ich aber gerade nicht testen)
Datenrate: 2MBaud
ClkPhase und Polarität hab ich mal herumprobiert hat aber nicht geholfen

Ablauf
Ich habe eine DSP auf die ich keinen Zugriff habe und auch wenig drüber 
weiß.
Diese DSP sendet 20 bit Strings. Momentan sendet sie immer 0011 0001 
0001 1000 0011. Das kann ich auf dem Oszi sehen.

Ich stelle mir das jetzt so vor, die SPI empfängt 8 bit, schreibt sie in 
den Buffer welcher 3 Byte groß ist da ich ja 20 bit habe, dann die 
nächsten 8 bit wieder in den Buffer, und die letzten 4 bit ebenfalls. 
Der Buffer sollte mir ja dann konstant die gleichen Werte ohne Variation 
zeigen. HAL_GPIO_SPI(*hspix, uint8_t *pdata, uint16_t size, uint32_t 
timeout) ist der Befehl zu Empfang. Das ist Blocking_mode.

Auszug aus meinem Code:
uint8_t receive_data[3]={0}
size= 3 // Wegen 3 Byte oder?

HAL_GPIO_SPI(*hspi1, receive_data ,3 , 10000);

Problem
wenn ich mein Programm jetzt laufen lasse sehe ich das in den 3 
receive_data Feldern die richtigen Werte ankommen aber- und das ist das 
Problem- der Anfang des String steht mal in receive_data[0], dann in 
...[2], dann in ..[1] usw. mein String wird also völlig willkürlich auf 
die 3 Array Felder aufgeteilt. Das ist so nicht gewollt oder? Ich hätte 
gerne
receive[0]=ersten_8_bit;
receive[1]=zweiten_8_bit;
receive[2]=letzten_4_bit;.

Für jede  Hilfe bin ich Dankbar!
Beste Grüße
Torsten

von Vincent H. (vinci)


Lesenswert?

Musst du jeden String einzeln auswerten?
Sonst empfang doch einfach 2x Strings a 40Bit in 5Byte.

Ist das nicht möglich, empfehle ich dringends eine Realisierung in 
Software. Bei 2MHz ist das ja kein Problem.

von Joe F. (easylife)


Lesenswert?

Stm32 M. schrieb:
> Sender ist eine Atmel DSP als Master

Kannst du die 20 Bit beim Senden nicht einfach auf 24 Bit = 3 Bytes 
"aufblasen" (mit führenden Nullen padden)?

von Horst V. (hoschti)


Lesenswert?

Ohne den HAL (bzw. die Funktionen zum Arbeiten mit der SPI) genau zu 
kennen, vermute ich, dass sich das Interface nur mit "vollständig" 
empfangenen Bytes meldet.

Spontan fäält mir nur folgendes als Lösungsansatz ein:
Mit einem zusätzlichen Pin die Clockimpulse von SPI-Master mitzählen und 
daraus den Offest des Telegaramms bestimmen. Den Empfanghspuffer dazu 
deutlich größer als die 3 benötigten Byte machen (z.B. wie "Vincent 
Hamp" geschrieben hat). Und imer, wenn die 20 Bit eingesackt worden 
sind, die Nutzdaten aus dem Puffer entsprechend umkopieren.

Hoschti

von Vincent H. (vinci)


Lesenswert?

Horst V. schrieb:
> Ohne den HAL (bzw. die Funktionen zum Arbeiten mit der SPI) genau zu
> kennen, vermute ich, dass sich das Interface nur mit "vollständig"
> empfangenen Bytes meldet.

Das Interface kann sich gar nicht anders melden. Das interne 
Schieberegister ist eben nunmal auf vielfache von 8 Bit ausgelegt.

20 Bit als Einzel-Event zu empfangen ist somit ohne zusätzlichen Aufwand 
ohnehin schonmal unmöglich.

von TriHexagon (Gast)


Lesenswert?

Welchen STM32 µC hast du denn? Beim SPI vom STM32F303 ist die Datengröße 
auch auf 10-Bit konfigurierbar. Keine Ahnung wie genau sich das verhält, 
habe bisher nur 8- und 16-Bit benutzt, aber vielleicht ist das was für 
dich.

von Vincent H. (vinci)


Lesenswert?

TriHexagon schrieb:
> Welchen STM32 µC hast du denn? Beim SPI vom STM32F303 ist die Datengröße
> auch auf 10-Bit konfigurierbar. Keine Ahnung wie genau sich das verhält,
> habe bisher nur 8- und 16-Bit benutzt, aber vielleicht ist das was für
> dich.


Tatsächlich. Da hab ich doch glatt Blödsinn erzählt.
Viele STM32 haben im SPI Register CR2 eine einstellbare Datenlänge von 
4-16Bit...

Das löst natürlich das Problem!

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.