Hallo
Ich habe wieder mal ein kleines Problem, dass sich einfach nicht lösen
lassen will:
Es geht um den SPI im STM32f103. TX funktioniert (Oszi) aber RX kommt
nur 0 zurück. Elektrischer Fehler ist eigentlich ausgeschlossen: wenn
ich MISO fest auf VCC hänge zeigt GPIOA->IDR zwar eine 1, aber Send()
gibt 0 zurück!
Code ist nur das hier:
holger schrieb:>>aber Send() gibt 0 zurück!>> Lass dir x ml per UART susgeben. Oder mach es volatile.> x wird nirgendwo verwendet und könnte wegoptimiert werden.
Das ist es nicht, ich habe x mit dem Debugger angeschaut. Zudem habe ich
es auch mal versucht mit mehreren zugriffen auf x, das ändert nichts.
Auch SPI1->DR bleibt leer!
Das ist Wasser auf meine Mühlen. Ich hatte genau das gleiche mit einem
32F3xx. Ich hab irgendwann nach jedem Strohhalm gegriffen und
angefangen, am Prescaler zu drehen. Bei einer einzigen Einstellung
klappts. Einen drunter oder drüber ist das Ding tot...
Ich habs nicht weiter verfolgt, weil reines Hobby und keine Zeit.
Versuch mal "SPI_InitStructure.SPI_BaudRatePrescaler = 12;"
Nimm mal RCC_APB2Periph_AFIO mit rein und schalte die Clocks auf
BEVOR du irgendwas initialisierst.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,
ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
.....
>So siehts jetzt aus, hat sich aber nichts geändert.
Ich werde das Gefühl immer noch nicht los das das
nur ein Missverständnis zwischen dir und deinem Debugger ist.
Gib x über UART aus. Da MOSI ja was sendet sollte
das SPI Modul funktionieren. SCK funktioniert auch?
while(!(SPIx->SR&SPI_I2S_FLAG_TXE));// wait until transmit complete
2
while(!(SPIx->SR&SPI_I2S_FLAG_RXNE));// wait until receive complete
Bist du sicher, dass receive complete nötig ist ?
SPI ist eigentlich bidirectional, es könnte sein, dass du damit nur
sein (leeres) SPI-Register empfängst...
>while(!(SPIx->SR&SPI_I2S_FLAG_TXE));// wait until transmit
2
>complete
3
>while(!(SPIx->SR&SPI_I2S_FLAG_RXNE));// wait until receive
4
>complete
5
>
>> Bist du sicher, dass receive complete nötig ist ?> SPI ist eigentlich bidirectional, es könnte sein, dass du damit nur> sein (leeres) SPI-Register empfängst...
Dachte ich auch schon, aber in allen Libs wird's so gemacht, und ohne
ändert sich nichts!
holger schrieb:>>So siehts jetzt aus, hat sich aber nichts geändert.>> Ich werde das Gefühl immer noch nicht los das das> nur ein Missverständnis zwischen dir und deinem Debugger ist.>> Gib x über UART aus. Da MOSI ja was sendet sollte> das SPI Modul funktionieren. SCK funktioniert auch?
SCK und MOSI funktionieren. Ich kanns mir einfach nicht vorstellen, ich
habe EXAKT die gleiche Methode beim F4 angewendet. Funktioniert super
(mit dem Debugger...)
UART müsste ich halt auch zuerst implementieren.
Ich hab aber jetzt mal folgendes gemacht:
>SCK und MOSI funktionieren.
Bist du sicher das du MISO am richtigen Pin vermutest?
Vieleicht verzählt beim anschliessen?
Irgend sowas banales wird das sein;)
holger schrieb:>>SCK und MOSI funktionieren.>> Bist du sicher das du MISO am richtigen Pin vermutest?> Vieleicht verzählt beim anschliessen?> Irgend sowas banales wird das sein;)
Sieht leider für mich nicht so aus, denn erstens ist das ne Platine, die
garantiert korrekt ist und zweitens wenn ich den Pin auf VCC Brücke sehe
ich ihn im GPIOA->IDR auf eins gehen (Debugger). Drittens habe ich ihn
auch schon als Ausgang konfiguriert und zappeln lassen -> Oszi sagt es
ist der richtige :(
Sean Goff schrieb:> Dachte ich auch schon, aber in allen Libs wird's so gemacht, und ohne> ändert sich nichts!
Probier es mal ganz ohne Flags, etwa so:
holger schrieb:> Letzter Versuch:>> Schalte MISO mal auf GPIO_Mode_IPU und lass ihn offen.
Hat nichts gebracht :(
Marc Vesely schrieb:> Sean Goff schrieb:>> Dachte ich auch schon, aber in allen Libs wird's so gemacht, und ohne>> ändert sich nichts!> Probier es mal ganz ohne Flags, etwa so: SPIx->DR = data;> while (!(SPIx->SR & RXNE)); // 0x01> return (SPIx->DR);
Das akzeptiert der Compiler so nicht (er sagt RXNE sei nicht bekannt.)
Wenn ich direkt 0x01 nehme, ändert sich am Ergebnis nichts (leuchtet
rot.)
Sean Goff schrieb:> Das akzeptiert der Compiler so nicht (er sagt RXNE sei nicht bekannt.)> Wenn ich direkt 0x01 nehme, ändert sich am Ergebnis nichts (leuchtet> rot.)
Mein letzter Versuch:
SPI-Mode ändern.
> ich habe EXAKT die gleiche Methode beim F4 angewendet
Haben die beiden die gleiche BUS Matrix? Hast du beim F1 das richtige
Target im Projekt ausgewählt?
mal so ins Blaue schrieb:>> ich habe EXAKT die gleiche Methode beim F4 angewendet>> Haben die beiden die gleiche BUS Matrix? Hast du beim F1 das richtige> Target im Projekt ausgewählt?
Mit Methode meinte ich eigentlich eher den Wert per debugger abzufragen,
ohne ihn sonst zu benutzen. Prozessor stimmt!
Marc Vesely schrieb:> Sean Goff schrieb:>> Das akzeptiert der Compiler so nicht (er sagt RXNE sei nicht bekannt.)>> Wenn ich direkt 0x01 nehme, ändert sich am Ergebnis nichts (leuchtet>> rot.)> Mein letzter Versuch:> SPI-Mode ändern.
Wie meinst du das? Auf Slave? Dann funktionierts!
Sean Goff schrieb:> Wie meinst du das? Auf Slave? Dann funktionierts!
War auch so mal ins Blaue.
Ich dachte wie die Daten eingelesen werden (welche Flanke).