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
Oszi vorhanden? Kommt vom F4 mal das erwartete an CLK und MOSI raus?
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
Wie hast du das verdrahtet? MOSI -> MISO CLK -> CLK Chip select?
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
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; |
Also wenn ich das richtig sehe, musst du doch MOSI auf MISO hängen. Siehe Datenblatt Half-duplex communication.
Das stimmt aber ich benutze ja nicht den Halbduplex sondern den Simplex-Modus (eine Leitung von MOSI zu MOSI)!
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
>> 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.
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.