Hallo Ich bin in besitz eines STM32F100RB Discovery Board und möchte gerne mit einen Digitalpoti (AD5293) über die SPI reden. Hab mir zu den Thema etliche Beispiele auf mehreren Foren angeschaut und versucht nach Anpassung zum laufen zu bringen. Wenn ich den Code den ich im Anhang gepostet habe im Debug-Modus laufen lasse, konnte ich schon feststellen das die Konfiguration schon mal klappt. Leider wird aber das Daten-Register nie beschrieben und es gehen keine Daten raus. Hat vielleicht irgendwer eine Idee oder eine Quelle für eine funktionierendes Beispiel Würde mich sehr über Kritik und belehrende Worte freuen!!!
Hi Fero, wenn nur der SPI-Teil nicht funktioniert, dann mach doch erst mal ein Projekt "NUR" mit SPI (bis dieses anständig läuft) der Rest in deinem Projekt verwirrt nur den leser jetzt zu deinem Programm : bin mir zwar nicht sicher (weil ich den F1 nicht so gut kenne) aber beim F4 muss man die 3 SPI-Pins nocht mit PinAFConfig initialisieren
1 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); // SCK |
2 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1); // MISO |
3 | GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); // MOSI |
und hier :
1 | SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b |
stellst du auf 16bit Daten obwohl dein Array nur 8bit hat ! und falls es dann immer noch nicht geht versuch mal beim senden nicht auf "SPI_I2S_FLAG_BSY" sondern auf "SPI_I2S_FLAG_TXE" abzufragen Hinweis : die Variable "TxIdx" wird in deinem Programm nie mehr auf 0 zurückgesetzt !! Gruss
:
Bearbeitet durch User
Hallo Habe den Code jetzt einmal leserlicher gemacht und alles rausgenommen was nicht gebraucht wird für SPI1. Wegen den Tipp mit der Alternate Function für die Pin - Konfiguration, ich glaub das dieser Block nicht notwendig ist. Habe schon erfolgreich die USART zum laufen gebracht -> bei der wird die Alternate Function auch nur in der GPIO Konfiguration festgelet. Den Fehler mit den 16 Bit habe ich natürlich sofort ausgebessert. Auch die variable lass ich wieder zurücksetzten für mehrfaches Senden. Der Rat mit dem "SPI_I2S_FLAG_TXE" abfragen war SUPER, zumindest scheibt er jetzt etwas ins Daten-Register aber leider nur 0xFFFF und nicht das was im Daten-Buffer steht.
hast du es nur im Debugger angesehen ? ich vermute der Inhalt vom DR Register den du siehst, ist "nach" dem senden ...also das empfangene Wort (es gibt ja nur ein Register für TX und RX) und ohne Hardware kommt da wahrscheinlich 0xFF zurück mach mal noch nach dem senden, eine pause zum empfangen in der Art :
1 | // warte bis senden fertig |
2 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); |
3 | |
4 | // byte senden |
5 | SPI_I2S_SendData(SPI1, wert); |
6 | |
7 | // warte bis empfang fertig |
8 | while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); |
9 | |
10 | // Daten einlesen |
11 | ret_wert=SPI_I2S_ReceiveData(SPI1); |
und probier es dann in der realen Hardware (event mit Scope am MOSI nachmessen)
:
Bearbeitet durch User
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.