Yongnuo RF-603 Funkprotokoll – Teil 2

Im 2. Teil der Reihe zur Entschlüsselung des RF-603 Funkprotokoll geht es um den A7105 Transceiver. Nachdem die XL7105-SY Module von DX eingetroffen sind. Damit sollte das Senden/Empfangen der Yongnuo RF-603 Blitzauslöser Nachrichten endlich gelingen.

Aber auch mit einem identischen Funk Transceiver ist der Weg recht steinig und mühsam. Leider wird der A7105 Chip nicht so gut unterstützt, wie der NRF24L01. Der Funk Chip wird in einigen Quadrocopter eingesetzt, wie z.B. dem Hubsan X4. Dazu findet man einige Threads im RC-Forum und auf Instrctables:

Dort geht es aber nur um das Senden von Nachrichten, da die Quadrocopter ja keinen Rückkanal haben.

Hardware

Nebem dem XL7105-SY Modul wird ein Arduino mit 3,3V Betriebspannung benötigt.

Achtung: Das verwendete Modul hat keine 5V toleranten Eingänge!

XL7105 Modul

Das DX Modul kommt im 2mm Rastermass daher. Deshalb gilt es zunächst, daraus ein zum NRF24L01 pin-kompatibles Modul zu basteln. Damit kann einfach zwischen den verschiedenen Modulen hin-und hergetauscht werden.

xl7105.jpg

IMG_4757.JPG

Eine Besonderheit beim A7105 ist die 3-Pin SPI Schnittstelle, mit nur einer Datenleitung für Senden/Empfangen. Es gibt aber die Möglichkeit eine normale 4-Pin SPI Schnittstelle zu konfigurieren. Folgende Beschaltung hat sich für mich als sinnvoll werwiesen:

NRF24L01 ModulXL7105 Pin
1 GND7 GND, 10 GND
2 VCC9 VDD
3 CE12 SCS
4 CSN---
5 SCK13 SCK
6 MOSI14 SDIO
7 MISO2 GIO1
8 IRQ4 GIO2
A7105-Modul.jpg

Reverse Engineering

Um nun das RF-603 Übertragungsformat zu knacken, gibt es 2 Ansatzpunkte.

  1. Funk Sniffer, mit dem XL7105 Modul alle Pakete mitlauschen
  2. SPI Sniffer, die SPI Signale am RF-603 anzapfen

Bei Methode 1 hakt es wie schon beim NRF24L01 am fehlenden Promiscous Mode. Außerdem gibt es zahlreiche Einstellmöglichkeiten, die man erst mal alle finden und durchtesten muss. Hier schien mir die 2. Methode des SPI Sniffing die erfolgversprechende. Zum einen sind auf der RF-603 Leiterplatte die SPI Pins auf Testpins gelegt und markiert, zudem zudem verfüge ich mit dem LogicPort über einen Logik Analyzer mit SPI Protokoll Interpreter.

IMG_4752.JPG

RF603 Initialisierung

Schauen wir uns zunächst die Initialisierung des A7105 Chips an. Daraus lassen sich vielleicht schon einige wertvolle Rückschlüsse schließen. Leider reicht der Speicher des Logic Analyzers nicht aus, alle Initialisierungs-Befehle zu erfassen, aber die wichtigsten sollten dabei sein.

RegisterWert RF603AnmerkungenWert XL7105-SYAnmerkungenBeschreibung
0x000x00reset commandMode register
0x010x42Data filter by CD, FIFO ModeMode control register
0x02--Calibration control register
0x030x01FIFO end pointer 1FIFO register 1
0x040x00FIFO register 2
0x050x00FIFO data register
0x060x00ID 0000ID Data register
0x070x00RC OSC register 1
0x080x00RC OSC register 2
0x090x00RC OSC register 3
0x0a0x00CKO pin control register
0x0b0x01WaitTillRx or TX finished GIO1 enable0x19SDO 4 wire SPIGIO1 pin control register
0x0c0x21RxD direct mode0x05Frame syncGIO2 pin control register
0x0d0x05Clock register
0x0e0x00Data rate register
0x0f0x9EChannel number0x70default chanPLL register 1
0x100x9EPLL register 2
0x110x48PLL register 3
0x120x00PLL register 4
0x130x02PLL register 5
0x140x16TX register 1
0x150x2BTX register 2
0x160x12Delay register 1
0x170x00Delay register 2
0x180x62Bandwith 500kHzRX register
0x190x80RX gain register 1
0x1A0x80RX gain register 2
0x1B0x00RX gain register 3
0x1C0x0ARX gain register 4
0x1D0x32RSSI threshold register
0x1E0xc3ADC control register
0x1F0x074Byte Preambel, 2Byte ID, no CRCCode register 1
0x200x16Code register 2
0x210x00Code register 3
0x220x00IF calibration register 1
0x23--IF calibration register 1
0x24--VCO current calibration register
0x25--VCO single band calibration register 1
0x26--VCO single band calibration register 2
0x27--Battery detect register

RF603 Funkprotokoll

Das Protokoll auf der Funkstrecke ergibt sich aus der Initialisierung der A7105 Register und dem gesendeten/empfangenen Daten über die SPI-Schnittstelle.

SPI-receive-Focus.jpg


<4 Byte Präambel> <4 Byte ID> <2 Byte Daten>

Die Daten Bytes bestehen aus 2 Byte Folgen, die aus Doppelzahlen wie 0x44 oder 0xBB bestehen. Die Summe der Byte Folgen ergibt FF. Die Kommandos werden alle 20ms (16ms beim RF-603-II) wiederholt, solange die Taste gedrückt wurde. Bei Taste losgelassen gibt es kein eigenes Kommando, es wird einfach nichts mehr gesendet.

KommandoDaten RF-603
WakeUp/Fokus44, BB
Start88, 77

Die ID mit der gesendet/empfangen wird, bleibt noch offen. Diesen Teil konnte der Logic Analyzer leider nicht aufzeichnen.

RF-603 Funkkanäle

Die Funkkanäle des RF-603 lassen sich über 4 DIP Schalter im Batteriefach einstellen. Die Werte für die Kanalnummern wurden durch SPI Sniffing an einem RF-603 ermittelt. Die Sende- und Empfangsfrequenz liegen um 1 Kanal auseinander.

DIP Schalter 1234 (0=off, 1=on)Sendekanal (in Hex)Empfangskanal (in Hex)
00007170
10006B6A
01006564
11005958
00105352
10104D4C
01104140
11103B3A
00013534
10012928
01012322
11011D1C
00111716
10111110
01110B0A
11110504

A7105 Sniffer

Um die bisherigen Erkenntnisse zu prüfen, steht als nächster Schritt ein Arduino Sketch zum Sniffen der A7105. Ähnlich wie schon der NRF24L01 unterstützt auch der A7105 keinen ‚promiscous Mode‘ zum Empfang aller Daten. Aber auch hier hilft der Trick weiter, bei der Initialisierung des Chips die Präambel auf einen kleineren Wert zu stellen und die Geräte ID, die ja nach wie vor unbekannt ist, auf den Wert der Präambel (0x55) zu setzen.

Nach einigem Rumprobieren ergab sich eine für diesen Zweck recht günstige Konfiguration:

  • 2 Byte Präambel
  • 4 Byte ID (0x55555555)
  • 6 Byte Payload

Das Ergebnis sieht schon ganz gut aus, es gibt nur wenige falsche Pakete:

55 4D 66 66 96 91
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB
35 99 9A 5A 44 BB

Man erkennt die Folge 0x44 0xBB, das entspricht dem bereits bekanntem Befehl zum WakeUp/Fokus. Und jetzt haben wir auch die Geräte ID (0x35, 0x99, 0x9A, 0x5A). Damit sind eigentlich alle Geheimnisse gelüftet und das Senden/Empfangen von Paketen sollte kein Problem mehr darstellen.

Doch weit gefehlt. Stellt man die ID entsprechend ein, Präambel auf 4 Byte und die Payload auf 2 Byte, passiert nichts, weder Senden noch Empfangen funktioniert damit. Aber sei es drum, als ‚Proof of concept‘ geht es auch mit den jetzigen Einstellungen. Auch das Senden funktioniert, wenn man die ID als Payload mitsendet. Mission halbwegs erfüllt.

Das verwendete Sketch basiert auf dem Flysky Tx Code von midelic aus dem RCgroups.com Forum. Über das Terminal werden die empfangenen Befehle ausgegeben. Befehle senden geht ebenfalls, mit ‚f‘ für Focus und ’s‘ für Start lauten die Befehle, die über das Terminal gesendet werden müssen.
Der komplette Quellcode befindet sich auf GitHub.

Fazit

Mit dem entschlüsselten Protokoll und dem A7105_Sniffer Sketch ist der Grundstein gelegt, einen RF-603 Transceiver zu simulieren, bzw. auf die Kommandos des Funk Transceivers zu reagieren. Damit ergeben sich interessante Anwendungsmöglichkeiten:

  • Foto Controller drahtlos mit RF-603 starten
  • Mit dem Foto-Controller drahtlos Blitze und Kamera fernsteuern. Anhand der gefundenen Kanalliste lassen sich die Geräte auch einzeln ansteuern.
    • In einem weiteren Beitrag ist geplant, das A7105-Modul mit Hardware SPI im 4-Bit Mode zu betreiben. Vielleicht lassen sich auch noch die Probleme mit der Geräte ID klären.

      IMG_9023.JPGIMG_3942.JPGIMG_3945.JPGIMG_3943.JPGIMG_9451.JPGIMG_9454.JPGIMG_0441.JPGIMG_0445.JPGIMG_9021.JPGFunkModul_Steckplatine.jpgIMG_4739.JPGxl7105.jpgA7105-Modul_Steckplatine.jpgIMG_4757.JPGIMG_4758.JPGIMG_4759.JPGIMG_4752.JPGSPI-send-Focus.jpgSPI-receive-Shutter.jpgSPI-receive-Focus.jpgA7105-Modul.jpgSPI-send-Focus2.jpg

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

    neun − 8 =