Forum: Mikrocontroller und Digitale Elektronik STM32F4->SPI->STM32F0 TX/RX 1 Line


von Tim M. (cptmauser90)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe mich schon durch etliche Beiträge durchgekämpft und bin
trotzdem noch nicht weiter mit meinem, meiner Meinung nach simplen,
Problem.

Ich habe sowohl das STM32F4 also auch das F0-Discoveryboard vorliegen
und möchte einen 10 bit-Wert (0...1023) des ADC vom F4 über SPI an das
F0 senden. Der Datenstrom soll auch nur vom F4 zum F0 verlaufen. Dazu
habe beide Boards im Simplex-Modus konfiguriert, also das F4 als TX-only
und das F0 als RX-only.

Im Debugger kann ich sehen, dass der Wert vom ADC korrekt in das DR von
SPI1 des F4 übertragen wird. Allerdings empfängt das F0-Board den Wert
nicht.

Ich habe meine Initialierungen und mains angehängt, allerdings gekürzt.
Clocks für GPIOs und Peripherie wurden an früherer Stelle schon
aktiviert.

Vielen Dank im Voraus, ich bin langsam echt am Verzweifeln, das kann
doch nicht so schwierig sein, solch eine unidirektionale Verbindung
zustande zu bekommen.

Beste Grüße,
Tim

von foo (Gast)


Lesenswert?

Oszi vorhanden? Kommt vom F4 mal das erwartete an CLK und MOSI raus?

von foo (Gast)


Lesenswert?

Noch was, .c statt .c.txt wäre besser.

von Tim M. (cptmauser90)


Lesenswert?

Hallo foo,

derzeit habe ich kein Oszi zur Verfügung, erst wieder Montags auf der 
Arbeit. Kannst du was zu meinem Code sagen, speziell zum F0?

Gruß,
Tim

von foo (Gast)


Lesenswert?

Wie hast du das verdrahtet?
MOSI -> MISO
CLK -> CLK
Chip select?

von Tim M. (cptmauser90)


Lesenswert?

MOSI ist mit MOSI verbunden, MISO ist ja deaktiviert im TX/RX-only Mode.

CLK ist mit CLK verbunden, NSS ist nicht verbunden.

Gruß,
Tim

von foo (Gast)


Lesenswert?

Tim Meyer schrieb:
> NSS ist nicht verbunden.

Leg den mal auf Masse beim Slave.

von foo (Gast)


Lesenswert?

foo schrieb:
> Leg den mal auf Masse beim Slave.

Hm, machst wohl schon in SW.
1
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;

von foo (Gast)


Lesenswert?

Also wenn ich das richtig sehe, musst du doch MOSI auf MISO hängen.
Siehe Datenblatt Half-duplex communication.

von Tim M. (cptmauser90)


Lesenswert?

Das stimmt aber ich benutze ja nicht den Halbduplex sondern den 
Simplex-Modus (eine Leitung von MOSI zu MOSI)!

von foo (Gast)


Lesenswert?

Tim Meyer schrieb:
> Das stimmt aber ich benutze ja nicht den Halbduplex sondern den
> Simplex-Modus (eine Leitung von MOSI zu MOSI)!

Bist sicher?
1
#define   SPI_Direction_1Line_Rx   ((uint16_t)0x8000)
Setzt bidi und somit half-duplex

von holger (Gast)


Lesenswert?

>> Leg den mal auf Masse beim Slave.
>
>Hm, machst wohl schon in SW.
>
>SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;

Ich würde sagen der Slave hat sich damit selber abgeschaltet.

SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;

Sollte reichen.

von Tim M. (cptmauser90)


Lesenswert?

So ich habe mittlerweile den Ausgang des F4 mit dem Oszi überprüft, der 
Wert wird korrekt von 0...1023 übertragen. Ich habe jetzt wie von Foo 
angemerkt, MOSI vom F4 mit MISO vom F0 verbunden, und Daten kommen beim 
F0 an, allerdings auf eine merkwürdige Art und Weise.

Im Debug-Modus landen im DR-Register des F0 manchmal Werte von 0...1023, 
nach Reset dann mal 0...65535 oder 0...511.

Kann mir das jemand erklären? Beide SPI-Configs haben CPOL/CPHA = 0, MSB 
First und 16b.

Beim F0 hab ich mittlerweile den MOSI-Pin deaktiviert, weil ja nur der 
MISO benötigt wird.

Vielen Dank für die Hilfe bisher!

von foo (Gast)


Lesenswert?

Tim Meyer schrieb:
> Im Debug-Modus landen im DR-Register des F0 manchmal Werte von 0...1023,
> nach Reset dann mal 0...65535 oder 0...511.

Die beiden Systeme sind ja nicht synchronisiert.
Der SPI Slave wartet einfach immer auf 16 Takte und schiebt die in sein 
Schieberegister.
Wenn Du nun resetierst kann es sein, dass Du mitten in einem 16bit Paket 
mit dem Empfangen anfängst -> falsche Daten.

Du müsstest also beide Systeme synchronisieren. Am einfachsten in dem Du 
NSS benutzt. Somit wären zumindest einzelne 16bit Pakete konsistent.

von Tim M. (cptmauser90)


Lesenswert?

Danke für die Antwort, Foo.

Das bedeutet, dass ich die beiden NSS-Pins verbinden müsste und 
SPI_NSS_Hard wählen muss oder?

Beim F4 wäre der NSS dann ein Output, beim F0 ein Input?

Ich probiere mal!

Vielen Dank nochmal für deine Bemühungen, ich bin langsam so verwirrt 
von dem ganzen Kram und bin froh, dass ich hier wirklich konstruktive 
Hilfe bekomme.

Gruß,
Tim

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.