Hallo, ich verzweifle gerade dabei, einen STM32L151RE dazu zu bringen, als SPI-Master zu funktionieren. Die Verdrahtung ist soweit vorgegeben, dass ich SPI1 verwenden muss und das chip-select Signal nicht von der Hardware generieren lassen kann. MISO, MOSI und CLK sollen vom Peripheral verwendet werden. Mein Vorgehen: 1) IOs initialisieren - GPIO port A clock enable setzen (dort hängen MISO und MOSI) - GPIO port B clock enable setzen (CLK) - SPI1 clock enable 2) Alternative Funktionen einschalten - GPIOA/B->MODER für MISO, MOSI und CLK auf "Alternate function mode" setzen. - GPIOA/B->AFR für MISO, MOSI und CLK auf 5u gesetzt. Dieser Wert entspricht laut datasheet dann SPI1_MISO, SPI1_MOSI und SPI1_SCK 3) SPI1 konfigurieren - Softwareslavemanagement Enable + Internal slave select - SPI enable - SPI Master - Baudrate select = 1; ergibt laut Messung ~500KBaud Am Oszi, sehe ich die durch SW gesteuerte CS-Leitung regelmäßig auf aktiv (low) gehen. Innerhalb der Bereiche, sehe ich Clock in 5 8er Blöcken und auf MISO sehe ich plausibel aussehende Antworten vom Slave. Die Daten vom Slave sehe ich auch in der Software wieder. Was mir fehlt ist MOSI! Ich sehe da einfach kein Signal. Ich habe auch schon versucht, das Signal mal auf einen anderen Pin auszugeben, da sehe ich leider auch nichts. Erkennt jemand von euch an dem Vorgehen einen Fehler? mfg und vielen Dank für's Draufgucken, Torsten
Wahrscheinlich machst du irgendeine Einstellung bei Port A falsch. Port B mit dem SCK scheint ja zu funktionieren. An welchem Port haengt dein SW-CS?
Christopher B. schrieb: > Wahrscheinlich machst du irgendeine Einstellung bei Port A falsch. Port > B mit dem SCK scheint ja zu funktionieren. An welchem Port haengt dein > SW-CS? Der hängt auch an Port A. Ich habe MOSI gerade auch mal an einen PA12 gehängt, weil ich vermutet hatte, dass evtl. irgend eine Lötstelle etc. das Problem sein könnte. Das hat aber auch nichts gebracht. Danke für die Idee! Ich habe mal den Quellcode angehängt, falls jemand die Zeit hat, da mal rüber zu gucken. Edit: Ich habe auch noch mal ein Bild von CS und Clock angehängt.
Tipp 1: Setze das "Enable Bit" ganz zum schluss der Initialisierung als sepparate anweisung. Manche Bits lassen sich nicht ändern, wenn SPI bereits eingeschaltet ist. Tipp 2: SPI->CR1 hat zwar 0x0000 als reset value, ich würde mich aber nicht darauf verlassen. Setze es evtl. zuvor explizit auf 0! Tipp 3: in mode(): "( 0x03 << 2 * pin )" wäre mir nicht explizit genug, ich würde "( 0x03 << (2 * pin) )" schreiben analog natürlich auch bei allen anderen rotations-anweisungen
Vielen Dank an Alle. Ich habe den Fehler gefunden. Ich tatsächlich einfach nur 0en rausgeschoben, da die Abfrage, ob der Sendpuffer schon "alle" ist, flashc war.
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.