Hallo,
ich baue mir eine Fernbedienung mit dem RFM70 2,4GHz Funkmodul von
HOPERF.
Die Registerbänke 0 und 1 habe ich gesetzt (hoffentlich korrekt)aber ich
bekomme das Teil nicht in den TX-Mode.
Ich prüfe das mit einer Strommessung. Lt. Datenblatt soll das Modul im
TX-Mode ca. 11 bis 23mA benötigen (je nach output power Einstellung).
Ich bewege mich dzt. so um die 5mA (inkl. Mikrokontroller)
Da ich derzeit keine Idee mehr habe, bitte ich um Hilfe!
Link zum Datenblatt:[[http://www.hoperf.com/upfile/RFM70.PDF]]
Lt. Datenblatt muss ich folgende Schritte durchführen:
1.) PWR UP Bit auf 1 und PRIM RX Bit auf 0 setzen
2.) Payload in das TX FIFO laden
3.) High-Impuls auf dem CE-Pin ausgeben
Hier mein Code der Register-Settings:
1
#ifndef RF_init_h
2
#define RF_init_h
3
4
5
//************ Bank1 register 0-13 initialization value
6
7
//In the array RegArrFSKAnalog,all the register value is the byte reversed!!!!!!!!!!!!!!!!!!!!!
Also bei mir läuft das RFM70 perfekt mit dem Beispielcode von HopeRF
(1:1 übernommen). Einzig die SPI-Funktionen habe ich etwas angepasst, da
ich den USART im SPI-Mode betreibe.
ok. Heute Abend nach dem Job.
Ich liste dann mal die relevanten Code-Teile.
Vorab schon mal als Zusammenfassung:
2 mal ATMEGA 328 (Arduino Nano). 5V. RFM70 VCC an 3V.
MISO, MOSI, SCK an Standard-Pins. CS nicht am ATMEGAs SS, sondern
anderem freien Pin. CE an freiem Pin.
SPI-Kommunikation zwischen den ATMEGAs und den RFM70s läuft tadellos.
Kann Register setzen und lesen.
Der Code entspricht dem aus dem Pic-Example von der Hersteller Web-Site.
SPI habe ich angepasst.
Register habe ich zunächst mal gesetzt wie im Datasheet beschieben. Da
macht der Beispielcode von HOPERF was anderes :-) Habe da bereits
unterschiedliche Varianten ausprobiert. Auch den Registerswap, der im
Beispielcode drin ist, habe ich mal versucht und mal weghgelassen.
Insbes mache ich:
CONFIG.PWR-UP=1
PTX setze ich CONFIG.PRIM_RX = 0
PRX setze ich CONFIG.PRIM_RX = 1
Ausserdem aktiviere ich die features im FEATURE Register.
Um den TX zu aktivieren setze ich CE auf 1, und packe Payload in den
TX_FIFO
Auf RX-Seite setze ich ebenfalls CE = 1
Ergebnisse:
1. Versuch: ENAA_P0 = 1 und senden mit SPI-Command W_TX_PAYLOAD
Ergebnis: PTX STATUS Register zeigt instant MAX_RT=1, IRQ geht active
low und TX_OBSERVE-Register zeigt ARC=15. So, als ob er den Auto
Retransmit-Delay gar nicht beachtet. Ab der 4. Payload in den TX_FIFO
zeigt dann Status auch FIFO_FULL.
2. Versuch: Wie 1) aber versenden mit SPI-Command W_TX_PAYLOAD_NO_ACK
Ergebis: STATUS-Register und TX_OBSERVE-Register verändern sich nicht
bis auf: TX_DS=1. IRQ geht active low.
3. Versuch: ENAA_P0 = 0 und senden mit SPI-Command W_TX_PAYLOAD
Ergebnis: Wie 2.
Auf RX-Seite: Langeweile. CD-Register bleibt auf 0, IRQs werden keine
ausgelöst.
Vermutungen:
1) 6 Test-chips kaputtgelötet beim Anschluß (unwahrscheinlich :-)
2) Hardwaredefekt ab Werk (möglich aber unwahrscheinlich)
3) Denkfehler. (möglich)
Ad 3) Kann es sein, dass ich da was mit dem CE-Pin falsh verstehe? Darf
der ggf. nur gepulst werden und wenn ich den HIGH lasse, so wie ich es
tue, dann gehts nicht?
Leider habe ich auch keine Idee, wie ich nun testen kann, weil ich habe
kein Equip um zu messen ob da was "on air" passiert.
Gruß
Odo
Also bei mir ist CE immer HIGH, nur wenn ich auf Rx bzw. Tx Mode
umschalte wird es kurz auf LOW gesetzt und zwar nur solange wie ins
CONFIG-Register geschrieben wird.
Wie im Beispielcode eben:
1
voidSwitchToRxMode()
2
{
3
UINT8value;
4
5
SPI_Write_Reg(FLUSH_RX,0);//flush Rx
6
7
value=SPI_Read_Reg(STATUS);// read register STATUS's value
8
SPI_Write_Reg(WRITE_REG|STATUS,value);// clear RX_DR or TX_DS or MAX_RT interrupt flag
9
10
CE=0;
11
12
value=SPI_Read_Reg(CONFIG);// read register CONFIG's value
Ja schade. So mache ich es auch.
Bleibt also nur noch Chips kaputt, Chips kaputt gemacht beim
Kabel-anlöten, Interferenzen, unentdeckter Software-Fehler ?
Ich schicke heute Abend mal einen total abgespeckten Referenzcode.
Vielleicht kannst Du / könntet Ihr den mal bei Euch laufen lassen...
Zum Thema löten: Ich habe 2 chips auf 350 Grad und die restlichen auf
250 Grad gelötet. Die Löstellen sehen gut aus. Hab mal mit der Lupe
geschaut. Sonst würde ja auch nicht no viel klappen, wie es aktuell der
Fall ist.
Soll ich mal Code laufen lassen, der z.B. Kanäle scannt, also alle x
sekunden weiterschaltet und neuen Sende / Empfangsversuch machen?
@Heimo: Läuft das bei Dir denn jetzt auch?
Gruß
Odo
Hmm.
Das verrückte ist: auch mein Testcode, den ich letzte Nacht hier
zunächst aus Versehen gepostet habe, erzeugt den gleichen Debug-Output,
wie der "echte" Code, den ich ja noch hinterher gepostet habe.
Der Unterschied ist, dass ich in dem Test-Code Code CE nicht auf HIGH
setze. RFM verhält sich aber bei CE=1 und CE=0 gleich. Das darf doch lt.
Manual so gar nicht sein... CE=1 und CE=0 muss doch einen gewaltigen
Unterschied machen.
Ich hab dann mal geprüft, ob da überhaupt Spannung am CE-Pin des RFM
anliegt, wenn ich den ATMEGA-Pin high setze. Antwort "JA" (puh ;-)
Also back to the roots.
Beschaltung stimmt, Stromversorgung stimmt, SPI-Kommunikation stimmt,
State-Machine des RFM tut so, als ob sie was tut, Over-the-Air: Klappt
nicht.
Kann mal jemand die Register-Setting checken Habe ich da alles richtig
gemacht?
ok. bei mir ist Activation vor RB1 + Reg 14 setting.
Ich stell das heute Abend mal um.
Kannst Du / kann jemand evtl mal funktionierende Init-Werte für die
Register posten? Es gibt ja einige threads mit unterschiedlichen
Auffasungen zu Reihenfolgen der bytes und einiger Werte und
byte-toggle-patches etc.. Kann ja sein, dass ich da ein nicht
funktionierendes setup habe.
Siehe auch meinen Code. Ich lese die in meinem Code definierten Werte
alle von links nach rechts in die Register ein.
odo.m schrieb:> Kannst Du / kann jemand evtl mal funktionierende Init-Werte für die> Register posten?
Gibts doch bei HopeRF. So wie die da sind funzt das einwandfrei.
Also mit gedrehten Bank1 Reg 9-13 ? Warum ist das so schräg
programmiert?
Auszug des HOPERFM-Codes:
1
for(i=0;i<=8;i++)//reverse
2
{
3
for(j=0;j<4;j++)
4
WriteArr[j]=(Bank1_Reg0_13[i]>>(8*(j)))&0xff;
5
6
SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);
7
}
8
9
for(i=9;i<=13;i++)
10
{
11
for(j=0;j<4;j++)
12
WriteArr[j]=(Bank1_Reg0_13[i]>>(8*(3-j)))&0xff;
13
14
SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4);
15
}
Ich hab da mal einfach meine Konstanten für die initialisierung
umgedreht und Register 0-13 alle mit dem gleichen code geschrieben
und: brauch ich das auch? Das steht nicht so im Datenblatt:
odo.m schrieb:> Also mit gedrehten Bank1 Reg 9-13 ? Warum ist das so schräg> programmiert?
das ist nicht schräg programmiert, sondern die Hardware erwartet diese
Bits verdreht.
Siehe Datenblatt:
Ha!
Timmo, Du bist ein Held. Da war ein Dreher in den Register-Settings.
Jetzt klappt der Transfer.
Aber einen Carrier Detect bekomme ich leider trotzdem nicht. Da habe ich
dann wohl das Datasheet noch nicht so ganz verstanden. Dachte, wenn ich
was empfange, muss CD zwangsläufig auf 1 gehen... Ist das nicht so?
Hier schicke ich mal die Register-Settings, die zum Erfolg führten. Ich
clocke die alle von links nach rechts via SPI.
Hallo Ihr da draussen ;-)
Wir kämpfen hier auch mit der Erstinbetriebnahme vom RFM70. Um uns die
Arbeit leichter zu machen, haben wir zwei Demo_Boards RFM70 V2.0 gekauft
(weil ja die Software dabei sein sollte) um dann zuschauen, ob es funzt.
Die zwei Demo-Boards machen auch was sie sollen - nur leider ist nicht
die komplette Software incl. einlesen der Schalter und das Testprogramm
dabei. Also "etwas" schwierig auf unserer Seite Software zu
implementieren um diese dann gegen so ein Demo-Board zu testen....
Deshalb die Frage: Hat einer da draussen den kompletten Demo-Board-Code?
Wir wollen das auch auf SPI umswitchen. hat jemand einen Beispielscode
dafür? Würde hier eventuelle Bugs gerne ausschließen....
Bin für jeden Tipp dankbar....
Ralf
hallo,
erst mal vielen Dank für die vielfältigen Tips in Sachen RFM70. Ich
möchte auch mit den Modulen einen Datenlink herstellen. Ich werde
allerdings den Arduino (5 V Versorgung) nicht direkt mit den RFM70
(Versorgung 3,3 V) verbinden, da dies ggf. auch zu unkorrektem
Datenaustausch führen kann. Abhilfe Data Level Converter 3/5 V bzw. 5/3
V z.B. von Linear
Gerhard