Hintergrund zum Problem:
Das CC1101 Funkmodul empfängt sporadisch keine Nachrichten mehr und hält den Zustand bis eine Nachricht gesendet wird, oder das Modul per Reset neu gestartet wird. Das Problem scheint nur unter bestimmten Voraussetzungen oder Einstellungen vorzukommen und wurde von mehreren Benutzern im Homematic und Fhem Forum gemeldet. Ich selbst hatte auch das Problem bei 2 von 8 STM32L152 Dimmern.
Bei der Analyse des Problems verhielt sich das Funkmodul recht normal, auch die Kommunikation über den SPI-Bus funktionierte reibungslos.
Der einzige Anhaltspunkt war, dass das FSCAL1 Register im Betrieb einen Wert kleiner 0x3F hatte und im "tauben" Zustand 0x3F.
Damit scheint auch die Ursache des Problems gefunden - das CC1101 Funkmodul kalibriert die Frequenz im Betrieb selbstständig und in vereinzelten Situationen scheint da was schief zu gehen und damit hört das Modul auf eine andere Frequenz, was zu oben beschriebenem Problem führt.
Die Ursache des Problems konnte ich nicht finden, aber zumindest einen Workaround entwickeln.
Wir fragen das FSCAL1 Register per Watchdog alle 500ms ab und falls der Rückgabewert 0x3f ist, wird der Empfangsmodus neu gestartet. Dabei wird die Frequenz neu kalibriert und das Funkmodul arbeitet wieder wie gewünscht.
Gebraucht wird diese Funktion nur bei dauerhaft empfangenden Geräten, wie Dimmer oder andere Schalt Aktoren.
Batterie Geräte gehen regelmäßig in den Schlafmodus und werden beim Aufwachen neu kalibriert, Schalter oder Sensoren haben das Problem auch nicht, da sie recht häufig senden und beim Wechsel vom Senden zu Empfangen eine Rekalibrierung auslösen.
Wie aktiviert man die Funktion? Recht einfach über den Typedef des Radios.
Ohne Watchdog:
Code: Alles auswählen
typedef Radio<RadioSPI, CC1101_GDO0_PIN> RadioType;
Code: Alles auswählen
typedef CalibratedRadio<RadioSPI, CC1101_GDO0_PIN> RadioType;