Hallo,
ich versuche den Transceiver von Semtech in Betrieb zu nehmen. An und
für sich funktioniert das (wider Erwarten, mangels RF-Erfahrung) auf
Anhieb ziemlich gut, nur dieser ListenMode macht mir Probleme.
Und zwar kann man den Chip damit ja so konfigurieren, dass er im
Schlafmodus läuft und periodisch aufwacht und eine Weile nach RF sucht,
um dann wieder schlafen zu gehen.
Ich habe ihn nun so eingestellt, dass es je eine Sekunde läuft und eine
Sekunde schläft.
Was mir nun als erstes auffällt: Laut Datenblatt soll der Chip die
Nachtruhe im Mode verbringen, also dem Modus, den man im RegOpMode
einstellt. In der Wachphase läuft er natürlich sinnvollerweise im
RxMode.
Wenn ich nun das RegOpMode polle, während der Chip seinem
Tagesrhythmus nachgeht, dann stelle ich aber fest, dass er zwischen
RxMode und SleepMode wechselt:
1 | ... 00 00 00 00 00 00 00 00 04 04 04 04 04 04 04 04 04 00 00 00 00 00 00 00 00 00 ...
|
(Einfach nur in einer Schleife das Register gepollt und 2 Bit nach
rechts geschoben, damits leichter zu lesen ist; 04 ist Rx, 00 ist
Sleep).
Das ist blöd, weil im SleepMode der Quarz abgeschaltet wird, und aus
dem gewinne ich per ClkOut-Ausgang meinen Prozessortakt. Gut, testweise
lasse ich den Prozessor nun mit internem RC laufen.
Bug im Chip oder Fehler im Datenblatt? Das Datenblatt spricht von
"Idle"-Modus, den gibts aber nirgendwo. Eventuell meinen die damit ja
den Sleep-Modus.
Dann habe ich den Ausgang Dio0 auf PayloadReady konfiguriert, um den
Prozessor später aufzuwecken bzw. einen Interrupt auszulösen. Das
/PayloadReady/-Signal kommt auch und der Interrupt startet. Im Interrupt
lese ich dann das RegIrqFlags2 aus, in dem sich das dazugehörige
/PayloadReady/-Bit befindet. Aus mir unverständlichen Gründen wird
dieses Bit automatisch gelöscht:
1 | for (;;) {
|
2 | uint8_t f = read(RegIrqFlags2);
|
3 | if (f & IrqFlags2_PayloadReady) {
|
4 | uint8_t b[16];
|
5 | for (int i = 0; i < 5; i++)
|
6 | b[i]=read(RegIrqFlags2);
|
7 |
|
8 | for (int i = 0; i < 5; i++)
|
9 | printf("flags %02X\n", b[i]);
|
10 |
|
11 | // Payload aus dem FIFO abholen...
|
12 | }
|
13 | }
|
Ergibt mit einem Sender, der im Sekundentakt ein Paket schickt, im
Sekundentakt folgendes:
1 | flags 66
|
2 | flags 60
|
3 | flags 60
|
4 | flags 60
|
5 | flags 60
|
Die untere 0x06 enthält PayloadReady und CrcOk, d.h. die Übertragung
funktioniert einwandfrei. Wohl gemerkt, die beiden Bits verschwinden von
alleine, bevor die Payload aus dem FIFO gelesen wurde!
Das ist auch wieder ziemlich doof, denn wenn der Interrupt ausgelöst
wird, könnte das Bit schon weg sein - warum auch immer.
Bis auf die Paketlänge und das SyncWord ist der Chip weitestgehend in
den Standardeinstellungen aus dem Datenblatt konfiguriert.
Für Ideen wäre ich dankbar...
Danke und Grüße,
K