Forum: Mikrocontroller und Digitale Elektronik SPI -> STM32F100RB; ich finde den Fehler nicht.


von Fero (Gast)


Angehängte Dateien:

Lesenswert?

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!!!

von Uwe B. (derexponent)


Lesenswert?

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
von Fero (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Uwe B. (derexponent)


Lesenswert?

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
Noch kein Account? Hier anmelden.