mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM69 - Beispiel für Initialisierung gesucht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus R. (maggggus)


Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich habe zwei RFM69W-Module vor mir liegen, die ich mit einem 
STM32-Nucleo Board verbunden habe (an getrennten SPIs; DIOs habe ich 
bisher nicht verwendet).

Ich möchte ein Byte von einem RFM69-Modul zum anderen senden.
Es ist mir egal
- mit welcher Datenrate
- ob verschlüsselt wird
- ob CRC geprüft wird
- ob die Sendeleistung automatisch angepasst wird
- usw
Einfach ein Byte von A nach B zu bekommen würde mir (vorerst) reichen.

Ich habe Probleme damit, alle Register korrekt zu initialisieren (auch 
nach mehreren Abenden Datenblattstudim).

Was schon geht:
SPI-Kommunikation vom µC zu den beiden Modulen, ich kann Register 
schreiben und deren Wert auch wieder abfragen.

Was ich suche:
Eine Sequenz an Register-Initialisierungen für ein Minimalbeispiel, z.B. 
sowas:

Reg 0x01 am Empfänger auf 0x12 setzen
Reg 0x02 am Empfänger auf 0x34 setzen
Reg 0x03 am Empfänger auf 0x56 setzen
Reg 0x04 am Sender auf 0x78 setzen
Reg 0x05 am Sender auf 0xAB setzen
...


Fertige Libs habe ich nicht viele gefunden, wenn dann waren sie für 
Raspi oder Arduino oder nicht in C geschrieben, also schwer 
auszuprobieren.

von Conny G. (conny_g)


Bewertung
0 lesenswert
nicht lesenswert
Hier findest Du eine Init-Sequenz gleich am Anfang:

https://github.com/LowPowerLab/RFM69/blob/master/RFM69.cpp

von Markus R. (maggggus)


Bewertung
0 lesenswert
nicht lesenswert
Das kenne ich natürlich, aber hier wird sehr viel mehr gemacht als 
unbedingt nötig, außerdem sehe ich zwar Werte für Register, das konkrete 
Prozedere für Senden/Empfangen auf SPI-Ebene ist aber aus dem Code sehr 
schwer herauszufinden.

von Felix P. (fixxl)


Bewertung
0 lesenswert
nicht lesenswert
Hast du das hier schon mal angeschaut:
Beitrag "Re: Wer verwendet RFM69?" ?

In der RFM69.c gibt es eine Funktion rfm_init(), in der die 
entsprechenden Kommandos stehen. Bei Rückfragen zu den einzelnen 
Einstellungen, bin ich gerne bereit zu helfen.

von Klaus I. (klauspi)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe heute auch mit dem RFM69CW angefangen. Es gibt eine Software 
für ein SX1231 Starter-Kit von Semtech zum Download. Ohne 
angeschlossenes Board ist die Software erstmal inaktiv, aber man kann 
mit Strg+Alt+N das übergehen (Weiß leider nicht mehr, wo ich das 
aufgeschnappt habe).

Damit kann man sich eine Konfiguration zusammen klicken und aus der 
gespeicherten Datei die Registerwerte recht komfortable extrahieren z.B. 
mit Excel Verketten-Funktion.

Fertiges Beispiel habe ich aber leider noch nicht aber gerade gesehen, 
dass sich grundsätzlich etwas halbwegs sinnvolles tut ;o)
Bin jetzt aber mehr mit Löten beschäftigt, als mit Programmieren.

von Markus R. (maggggus)


Bewertung
0 lesenswert
nicht lesenswert
Felix, ich spiele gerade mit deinem Code.

Ich kann Register nicht zuverlässig schreiben.
Wenn ich z.B. in Register 5 den Wert 2 schreibe und anschließend 
zurücklese steht eine 0 drin.
Bei manchen Registern funktioniert es, bei manchen nicht.
Woran könnte das liegen?
Ich kontrolliere die SPI-Kommunikation mit einem Logic Analyzer.


Zweite Frage: Warum initialisierst du in deinem Code 20 Mal in einer 
Schleife? Hängt das damit zusammen?

von Markus R. (maggggus)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal einen Screenshot des Logic Analyzers angehängt. Man 
erkennt, dass die Bytes 0x86 (= Schreibzugriff auf Register 6) und 0xE1 
(neuer Wert für das Register) gesendet werden. Genau das erwarte ich 
auch.

Auf MISO antwortet das RFM69-Modul mit 0x40, das ist der alte Wert des 
Registers. OK.

Aber wenn ich mehrmals hintereinander 0x86 0xE1 schicke, antwortet das 
Modul IMMER mit 0x40, d.h. es übernimmt meinen Wert nicht. Warum?

Muss man das Modul in einen bestimmten Modus schalten, bevor man die 
Register beschreiben kann? Im Datenblatt habe ich dazu nichts gefunden.

von Felix P. (fixxl)


Bewertung
0 lesenswert
nicht lesenswert
Dass Werte nicht direkt übernommen werden, kenne ich nur von den drei 
Frequenzregistern 0x07, 0x08 und 0x09. Die Werte in 0x07 und 0x08 werden 
erst aktualisiert, nachdem man auch 0x09 geschrieben hat.

Wie hast du den Reset-Pin am RFM69 beschaltet?

Hintergrund: Ich komme ursprünglich vom RFM12, wo ich immer einen 
10k-Pullup an Reset (beim RFM12 NRES) hatte, und habe den in meinen 
Layouts immer weiter verwendet - hat super funktioniert. Irgendwann las 
ich dann mal im Datenblatt, dass die Reset-Logik beim RFM69CW eine 
andere sein soll, habe auf den Pullup verzichtet und den Pin floaten 
lassen: Das führte dann zu seltsamem Verhalten und Empfangsausfällen. 
Solltest du also nicht erklärbares Verhalten feststellen und den 
Reset-Pin nicht beschaltet haben, versuch es mal mit einem 10k-Pullup 
oder -Pulldown.

Das mehrfache Schreiben der Config war ursprünglich als 
Sicherheitsmaßnahme gedacht, ja. Ob es irgendwas bringt, weiß ich nicht.

von Markus R. (maggggus)


Bewertung
0 lesenswert
nicht lesenswert
Ich hatte den Reset-Pin nicht verbunden gehabt. Ich versuche es jetzt 
mit einem 10K-Pulldown.

Über was ich auch gestolpert bin: Manche Bits in Registern lesen sich 
immer als 0, auch wenn man eine 1 drauf geschrieben hat ("write one to 
clear").
Hier muss man beim zurücklesen auch aufpassen.

Ich werde es weiter probieren und berichten...

von Klaus I. (klauspi)


Bewertung
0 lesenswert
nicht lesenswert
Markus R. schrieb:
> Muss man das Modul in einen bestimmten Modus schalten, bevor man die
> Register beschreiben kann? Im Datenblatt habe ich dazu nichts gefunden.

Ich setze SS auf low und schicke den Schreibbefehl auf Register 0x01 und 
dann die ganzen Bytes (Copy&Paste aus dem genannten Programm bis 
ausschliesslich Temperatur-Register 0x4E) über die SPI-Schnittstelle. 
Dann wieder SS auf high.

Bei mir gibt es beim Wiederauslesen der Register 0x01 bis 0x4D nur 
Abweichungen bei 0x0B (einige bytes unused) und 0x24 (read only). Sollte 
also ok sein.

Beim RFM69CW als Transmitter erscheint auf meinem GY561-Frequenzzähler 
auch die richtige Frequenz. Auch der Clockout wird geändert. Bei mir 
läuft die SPI-Übertragung vermutlich also.

von Klaus I. (klauspi)


Bewertung
0 lesenswert
nicht lesenswert
Felix P. schrieb:

> Hintergrund: Ich komme ursprünglich vom RFM12, wo ich immer einen
> 10k-Pullup an Reset (beim RFM12 NRES) hatte, und habe den in meinen
> Layouts immer weiter verwendet - hat super funktioniert.

Verstehe ich Dich wirklich richtig. Ein RFM69CW arbeitet gut mit einem 
Pullup am Reset-Eingang?

Ich habe arbeite gerade auch mit einem Leiterplatten-Design, dass 
ursprünglich für den RFM12 gedacht war (Reset mit uC verbunden und an 
Pullup) und bin heute auf die Stelle im Datenblatt bezüglich des Reset 
gestoßen. Ca. eine Stunde vor Deinem Posting habe ich die Leiterbahnen 
durchgetrennt ;o)

Das Datenblatt spricht ja schon vom Floaten lassen und der ClkOut läuft 
auch während des Reset weiter und man kann ihn nicht zur Überprüfung 
verwenden.
Vielleicht sicherheitshalber wirklich einen Pulldown anlöten?

Ansonsten muss ich eher noch mit den Einstellungen experimentieren.

von Felix P. (fixxl)


Bewertung
0 lesenswert
nicht lesenswert
Klaus I. schrieb:
> Verstehe ich Dich wirklich richtig. Ein RFM69CW arbeitet gut mit einem
> Pullup am Reset-Eingang?

Ja, das verstehst du richtig.

Offenbar sind die 10k genug, damit der Pin sich keine Störungen 
einfängt, aber auch nicht ausreichend, um wirklich einen Reset 
auszulösen.

Hatte wie gesagt nicht groß darauf geachtet, als ich die Module 
getauscht habe und es gab nie Probleme - die traten erst auf, als ich 
den Pin floaten ließ.

von Klaus I. (klauspi)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mit den Parametern gespielt und habe jetzt eine funktionierende 
Kommunikation zwischen zwei RFM69CW hinbekommen. Reichweite ist min. 17m 
in meiner Wohnung. Reset ist aktuell floatend.

@Markus
Die angehängten Beispiele sind für 433 MHz. Ich hoffe das passt für 
dich?
Wie gesagt ich schreibe sämtliche Register bis ausschließlich 
Temperatur-Register in einen Rutsch. Minimalbeispiele habe ich noch 
nicht probiert.

Edit: Für Verbesserungsvorschläge wäre ich sehr dankbar, aber so läuft 
es erstmal für die ersten Experimente

: Bearbeitet durch User
von Klaus I. (klauspi)


Bewertung
0 lesenswert
nicht lesenswert
Felix P. schrieb:
> Hatte wie gesagt nicht groß darauf geachtet, als ich die Module
> getauscht habe und es gab nie Probleme - die traten erst auf, als ich
> den Pin floaten ließ.

Super Hinweis, Merci vielmals.

Habe gerade ausprobiert: Floaten, Pull-up und Pull-Down. Funktioniert 
anscheinend alles, werde den RESET aber sicherheitshalber nicht mehr 
floaten lassen.

Im Moment macht mir die CRC-Funktion Kummer. Ohne CRC läuft es gut, aber 
mit CRC auf beiden Seiten aktiviert kommt nichts sinnvolles mehr an bzw. 
CrcOK-Pin wird nicht gesetzt. Wenn man dennoch den FIFO ausliest bekomme 
ich immer das gleiche Zeichen meistens 111111... (Fixed length 32 byte).

von Felix P. (fixxl)


Bewertung
1 lesenswert
nicht lesenswert
Um CrcOK habe ich mich nie gekümmert, ich habe die Funktion CrcAutoClear 
(d.h. Bit 3 im Register 0x37 = 0, Bit 4 = 1, damit Crc überhaupt aktiv 
ist) aktiviert und frage das Bit PayloadReady ab. Das wird nur gesetzt, 
wenn der CRC erfolgreich war, ansonsten wird das Empfangene gleich 
verworfen.

von Markus R. (maggggus)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir geht es mittlerweile, danke v.a. an Felix.

Da ich es auf einem STM32-Controller versucht habe, bei dem ich mich 
v.a. an die SPI-Kommunikation mit dem RFM69 herantasten musste, war 
meine Herangehensweise folgende:
Alle Register initialisieren und danach zurücklesen.

Das Zurücklesen hat jedoch seine Tücken:
1. Die "write one to clear" bits in manchen Registern lesen sich 
natürlich immer als 0, obwohl 1 reingeschrieben hat
2. Manche Register übernehmen den Wert nicht sofort, sondern ein anderes 
Register zeigt an, wenn der Vorgang abgeschlossen ist 
(Zustandsübergänge)
3. Die Register mit der Carrier- Frequenz übernehmen den Wert erst, wenn 
man alle drei geschrieben hat.

Dies alles muss man beim zurücklesen bedenken. Möglicherweise hatte ich 
auch mit dem Reset-Pin ein Problem.

Ich hänge mal mein funktionierendes Minimalbeispiel an (Controller ist 
ein STM32F302R8).

Vielen Dank an alle!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.