Hi,
ich habe einen Raspberry Pi und einen mbed Nucleo ST32F411RE miteinander
verbunden. Mittels SPI-Bus möchte ich vom Raspberry Pi Daten an den mbed
senden und empfangen.
Das ist das Pythonprogramm auf dem Raspberry Pi:
In dieser Datei werden die Hexwerte für die SPI-Befehle, die vom
3
SPI-Master kommen, mit lesbaren Worten codiert.
4
*/
5
6
#ifndef SPI_COMMANDS_H
7
#define SPI_COMMANDS_H
8
9
enumSPICommands{
10
ADC_TASK_ISRUNNING=0x00A0,
11
ADC_TASK_START=0x00A1,
12
ADC_TASK_STOPP=0x00A2,
13
ADC_TASK_SETFREQUENCY=0x00A3,
14
15
FIFO_ANZAHL_ELEMENTS=0x00B0,
16
FIFO_GET_ONE_ELEMENT=0x00B1,
17
FIFO_GET_ELEMENTS=0x00B2
18
};
19
#endif
Die anderen Headerdateien wie der Fifo werden in dem aktuellen Programm
noch nicht benutzt. Die mbed.h wird vom Internetcompiler bereitgestellt.
Mein Problem ist folgendes:
Drücke ich mehrmals hintereinander schnell auf dem Raspberry den Button
"FIFO GET ONE ELEMENT", dan bekomme ich einen Wert zurück, der bei jedem
Aufruf um einen Wert nach oben addiert wird. Manchmal bekomme ich ein
paar mal hintereinander den gleichen Wert - woran liegt das?
Mit dem Button "ADC TASK FREQUENCY" möchte ich später die Zeit eines
Timers einstellen. Dazu möchte ich einen Wert an den mbed senden. Nicht
immer wird der Wert empfangen und dann wartet das Programm in der
Schleife:
1
caseADC_TASK_SETFREQUENCY:
2
...
3
while(abort){
4
if(spidevice.receive()){
5
...
obwohl vom Raspberry Pi gleich danach noch ein Wert gesendet wird:
1
defdo_adc_task_setfrequency():
2
print("ADC TASK SETFREQUENCY")
3
spi.writebytes([0x00,0xA3])
4
time.sleep(0.1)
5
spi.writebytes([0x00,100])
Es ist sogar extra noch ein sleep-Befehl dadrin, weil ich dachte, dass
der mbed vielleicht nicht schnell genug ist und etwas Zeit braucht, bis
die while-Schleife etc. verarbeitet ist.
Die Kommunikation funktioniert also nicht fehlerfrei zwischen dem
Raspberry Pi und dem mbed und ich habe keine Idee, wie ich das Problem
in den Griff kriegen kann.
Ich möchte später z.B. in einem Rutsch hintereinander 100 Messwerte vom
mbed an den Raspberry Pi senden - aber wenn es schon bei einem Wert
nicht richtig funktioniert und manche Werte doppelt empfangen werden,
dann ist das problematisch. Woran könnte das liegen?
A. K. schrieb:> Kann es sein, dass sich SPI und UART beim Zeitverhalten in die Quere> kommen? Eine nicht tief gepufferte UART Ausgabe blockiert den µC.
1
caseFIFO_GET_ONE_ELEMENT:
2
// pc.printf ("\n\r FIFO GET ONE ELEMENT");
3
spidevice.reply(get_element);
4
get_element++;
5
break;
Ich hab die printf-Anweisung schon herausgenommen. Oder meinst Du, die
Printf-Anweisung auf Seiten des Raspberry Pis kann auch problematisch
sein?
Ich hab das Programm jetzt etwas abgeändert. Auf dem mbed:
1
caseFIFO_GET_ONE_ELEMENT:
2
// pc.printf ("\n\r FIFO GET ONE ELEMENT");
3
spidevice.reply(get_element);
4
get_element++;
5
break;
Auf dem Raspberry Pi:
1
defdo_fifo_get_one_element():
2
print("FIFO GET ONE ELEMENT")
3
elements=[]
4
forlalalainrange(0,10):
5
spi.writebytes([0x00,0xB1])
6
time.sleep(0.00001)
7
elements.append(spi.readbytes(2)[1])
8
# print (spi.readbytes(2))
9
time.sleep(0.00001)
10
print(elements)
Während der SPI-Kommunikation sind nun keine print-Anweisungen mehr
vorhanden. Dennoch kommt es zum Datenverlust - nicht immer werden die
10ner-Blöcke sauber übertragen.
Hugo Gruffy Duck schrieb:> time.sleep(0.00001)
Ich bezweifle dass du es schaffst in ner scriptsprache auf nem raspi
10µS zu warten. Und selbst wenn, ist denn der MBED in der lage in den
10µS:
-das SPI Kommando in die Main-Loop zu bekommen
-auszuwerten
-und das ergebnis wieder in den spi-buffer zu schreiben?
spendiere zum test mal deutlich mehr zeit. wenns dann noch nicht
funktioniert, ist der fehler woanders.
dunno.. schrieb:> Ich bezweifle dass du es schaffst in ner scriptsprache auf nem raspi> 10µS zu warten.
Warum bezweifelst Du das? Meinst Du, der Raspi ist schneller oder eher
langsamer?
Ich hatte auch schon vorher längere Intervalle angegeben, sogar mal eine
ganze Sekunde, was ja eigentlich ne Ewigkeit für den mbed und den
Raspberry sein müsste.