Folgendes habe ich bei diesem Code gefunden:
- Print Ausgaben während des Sendezyklus (von TX on bis TX off) sollten nicht sein, da die recht viel Zeit brauchen und der Sendepuffer rechtzeitig gefüllt werden muss.
- Rf12_ready brauchst du nur zur Übertragung der Sendedaten in den Puffer, nicht zum Beschreiben der Register selbst. Zuerst rf12_ready, dann rf12_trans ausführen. Mit Rf12_ready bekommt der RFM erst dann Daten, wenn er diese braucht.
- Zwischen der Übertragung der Nutzdaten und dem Dummybyte ist kein Rf12_ready, damit wird das Byte unkontrolliert in den Puffer geschrieben. Damit die Übertragung entweder gestört oder das Byte wird intern verworfen.
- Prinzipiell kann man auf das Senden der Preambel an den RFM verzichten, da der TX-Puffer selbst eine 2 Byte lange Preambel erzeugt.
So sollte der Code dann aussehen:
Code:
Sub Rf12_txdata(byval Txlen As Byte)
Temp = Rf12_trans(&H8238) 'Power CMD: synt.& PLL on
Temp = Rf12_trans(&H8230)
Temp = Rf12_trans(&H0000) 'Status holen
Rf12_status = Temp
Rf12_ready 'Status einlesen
Temp = Rf12_trans(&Hb8aa) 'Preamble
Rf12_ready 'Status einlesen
Temp = Rf12_trans(&Hb8aa)
Rf12_ready 'Preamble
Temp = Rf12_trans(&Hb8aa)
Rf12_ready 'Preamble in FIFO schieben
Temp = Rf12_trans(&Hb82d)
Rf12_ready 'Startzeichen: 2D für den Empfänger
Temp = Rf12_trans(&Hb8d4) 'Startzeichen: D4 für den Empfänger
'Print "sende1"
For Lv = 1 To Txlen
Rf12_ready
Temp = &HB800 + Rf12_data(lv) 'Sende Nutzdaten
Temp = Rf12_trans(temp)
'Toggle Led2
'Print "temp" ; Temp
Next Lv
Rf12_ready 'Status einlesen
Temp = Rf12_trans(&Hb8aa)
Rf12_ready 'Status einlesen
Temp = Rf12_trans(&Hb8aa) 'Dummybyte nachschieben
Temp = Rf12_trans(&H8208) 'Power CMD: synt.& PLL off, Quarz-clk läuft weiter
Print "sende2"
End Sub
Lesezeichen