Hallo ich habe Probleme mit einem SPI Ringpuffer für den STM32F103. Das
Senden und Empfangen funktioniert ohne Interrupt. Auch mit einem
Interrupt funktioniert es. In dieser Implementation mit Ringpuffer wird
der letzte Wert nicht empfangen. Also zum Beispiel sende ich 6 Zeichen
empfange aber nur 5. Wenn ich im nachhinein schaue, ist das
SPI_I2S_FLAG_RXNE Bit sogar gesetzt, ich bekomme jedoch keinen
Interrupt. Wieso nicht? Seltsam ist, dass wenn ich
1
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE,DISABLE);
auskommentiere nichts mehr funktioniert.
Habt ihr eine Idee hier ist meine ISR, vielleicht sehr ihr ja was da
falsch läuft.
Danke
mein Ringpuffer ist 16 Zeichen lang. Ich schreibe in einem Beispel 6
Zeichen und bekomme über SPI nur 5 zurück. Gleiches passiert, wenn ich
nur ein Zeichen sende. Dann bekomme ich kein Zeichen zurück.
Die Variable bufferPos gibt die aktuelle Position des Schreibzeigers an.
Also wenn ich Daten senden will erhöht sich bufferPos. Wenn sie gesendet
wurden, rückt outCurrent nach und wenn ich ein Zeichen zurück bekomme,
wird inCurrent erhöht.
Da ich nicht weiss, wo Du und wie bufferPos veränderst, würde ich
trotzdem sagen, dass Deine Prüfung if(outCurrent != bufferPos) falsch
ist. So wie es für mich aussieht, müßte es if(outCurrent == bufferPos)
Gruß
Frank
Also nochmal zu bufferPos:
Wenn xxxCurrent noch nicht gleich bufferPos, dann existieren noch Daten,
die gesendet, empfangen werden. Wenn es gleich ist (else) wurde alles
gesendet/empfangen. Ist doch egal wie rum man es dreht ... oder etwa
nicht? :/
1
||||||||||||||||||||| ... |||| <- Daten
2
| | |
3
| | bufferPos
4
| |
5
| outCurrent
6
|
7
inCurrent
Wenn Daten hinzukommen wird auch bufferPos erhöht. outCurrent und
inCurrent werden erst erhöht, wenn Daten gesendet/empfangen wurden.
Sorry, ich sehe nur das inCurrent und outCurrent verändert werden.
Wo bufferPos geändert wird sagt mir selbst meine Glaskugel nicht.
So wie Du es beschreibst und so wie Dein Code es darstellt, kann es
passieren, inCurrent outCurrent überholt...
Vielleicht solltest Du mal Deinen ganzen Code zeigen...
Gruß
Frank
Also ich hoffe es ist klar geworden, dass nur bufferPos manuell gesetzt
wird. inCurrent und ourCurrent sind also die beiden "Read" Zeiger in
Ringpuffer sprache. Ich dachte, dass ich bei SPI immer so verfahren
kann, da ich pro gesendetem Zeichen auch eines zurückbekomme.
Nochmals meine Bitte, zeig Deinen kompletten Code oder reduziere ihn auf
ein lauffähiges Stück Code mit dem das ganze nachvollzogen werden kann.
So ist meine antwort "42" weil die paar Zeilen aus Deinem letzten
Posting helfen nicht weiter.
Gruß
Frank
Ich verstehe nicht ganz, warum die Init Routine noch entscheidend ist.
Die Kommunikation läuft ja. Ist nur der Ringpuffer der nicht
funktioniert.
Hier ist der Code: http://codepad.org/RHoJqQPJ
Hoffe das es Hilft ...
J. S. schrieb:> Ich verstehe nicht ganz
Weißt du, was ich nicht verstehe?
Ich verstehe nicht, warum das so schwer ist seinen Source Code so wie er
ist, hier ganz einfach im Forum als Attachment anzuhängen.
Interessant, ja du hast recht, für den Fall dass der inCurrent Zeiger
den outCurrent Zeiger überholt, kann es zu einem Fehler führen. Ich
werde es nachher mal testen.