Hallo Leute, ich brauche dringend eure Hilfe! Und zwar muss ich für mein Praktikum die PER eines RF-SoC mit Hilfe von dem Signal Generator Rohde&Schwarz SMIQ bestimmen. Den Aufbau habe ich mir folgendermaßen gedacht. Ich generiere in LabView eine zu IEEE 802.15.4 kompatible Datenliste schicke sie zum Signal Generator über GPIB und der soll diese dann auf 2,45Ghz mit OQPSK modulieren. Das RF Modul empfängt das Signal und demoduliert es, falls es richtig angekommen ist. Das wird wiederum über SPI ausgelesen. Was haltet Ihr soweit von der Idee?? Also zunächst habe ich einen fertiges Packet Sniffer, welcher über das Debug Interface, alle RX Signale auf IEEE 802.15.4 des RF moduls empfängt. Also deswegen kann ich hierbei Fehler ausschließen. Nun zu meinen Problemen: Ich weiß nicht genau, wie ich den Signal Generator richtig konfiguriere. Ich habe ihn im Moment auf Modulation GMSK Symbol rate 2 Msym/s Filter Gauss/2.0 Source: Datalist Clock: Coupled/Symbol Muss ich noch einen Trigger einstellen? oder ein Coding? Kennst sich von euch jemand mit der Thematik aus? Im Praktikum kann mir dazu leider keiner weiterhelfen. Vielen Dank!! Viele Grüße Andi M.
sorry war gerade nicht angemeldet: Also eine weitere Sache ist das erstellen der Datenliste. Vorallem die Softwareimplementierung der FCS/Frame Check Sequence, welche "normalerweiße" immer via Hardwarechip erstellt wird. Hat das schoneinmal jemand gemacht? Hat jemand ein Beispiel? Gerne auch eine andere Programmiersprache! Danke
Andi M. schrieb: > Vorallem die > Softwareimplementierung der FCS/Frame Check Sequence, welche > "normalerweiße" immer via Hardwarechip erstellt wird. Dafür gibt's doch ein Beispiel im IEEE-802.15.4-Standard. Hier ein Progrämmchen, das ich vor Jahren mal zusammengehackt habe:
1 | /*
|
2 | * ----------------------------------------------------------------------------
|
3 | * "THE BEER-WARE LICENSE" (Revision 42):
|
4 | * Joerg Wunsch wrote this file. As long as you retain this notice you
|
5 | * can do whatever you want with this stuff. If we meet some day, and you think
|
6 | * this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
|
7 | * ----------------------------------------------------------------------------
|
8 | */
|
9 | #include <stdint.h> |
10 | #include <stdio.h> |
11 | #include <stdlib.h> |
12 | #include <unistd.h> |
13 | |
14 | static uint16_t crc_ccitt_update (uint16_t crc, uint8_t data) |
15 | {
|
16 | data ^= crc & 0xff; |
17 | data ^= data << 4; |
18 | |
19 | return ((((uint16_t)data << 8) | ((crc & 0xff00) >> 8)) |
20 | ^ (uint8_t)(data >> 4) |
21 | ^ ((uint16_t)data << 3)); |
22 | }
|
23 | |
24 | static void |
25 | usage(void) |
26 | {
|
27 | fprintf(stderr, "usage: gencrc [-b base] number...\n"); |
28 | exit(64); |
29 | }
|
30 | |
31 | int
|
32 | main(int argc, char **argv) |
33 | {
|
34 | long i; |
35 | int c, base; |
36 | uint16_t crc = 0; |
37 | uint8_t byte; |
38 | |
39 | base = 0; |
40 | while ((c = getopt(argc, argv, "b:")) != -1) |
41 | switch (c) |
42 | {
|
43 | case 'b': |
44 | base = strtol(optarg, 0, 0); |
45 | break; |
46 | |
47 | default:
|
48 | usage(); |
49 | }
|
50 | argc -= optind; |
51 | argv += optind; |
52 | |
53 | while (argc-- > 0) { |
54 | i = strtol(argv[0], 0, base); |
55 | byte = (uint8_t)i; |
56 | crc = crc_ccitt_update(crc, byte); |
57 | argv++; |
58 | }
|
59 | printf("CRC = 0x%04x\n", crc); |
60 | return 0; |
61 | }
|
vielen Dank fuer die Antwort! Werde es die Tage testen. Hab im Moment was anderes zu tun bekommen, aber sobald das fertig ist, werde ich mal testen. Danke! :)
Ahh jetzt bin ich unerwartet schnell fertig geworden, sodass ich mich jetzt doch schon wieder daran machen werde. In den 15 Minuten, wo der alte Beitrag editiert werden kann, hab ichs leider nicht mehr geschafft ;) Also mein erstes Hindernis ist erstmal eine Datenliste auf dem Signalgenerator zu erstellen und rueberzuschicken, sodass diese von dem SoC RF-Modul erkannt wird. Ich habe ein Programm runtergeladen, in welchem ein/1 MAC/PHY Beispiel command frame angezeigt wird: 0x 00 00 00 00 A7 0A 03 00 10 01 01 42 0C 39 B3 69 SHR PHR MHR MAC Payload FCS Also theorethisch sollte das frame stimmen. Nun muss man ja diese Symbole(4Bit) zu einer 32bit chip folge nach folgender Tabelle konvertieren: Quelle: Agilent.com http://edocs.soco.agilent.com/download/attachments/100337712/ZigBee_Introduction-4.gif?version=1&modificationDate=1260242976000 und danach dann modulieren oder? Danke!
Andi M. schrieb: > Ich habe ein Programm runtergeladen, in welchem ein/1 MAC/PHY Beispiel > command frame angezeigt wird: > 0x 00 00 00 00 A7 0A 03 00 10 01 01 42 0C 39 B3 69 > SHR PHR MHR MAC Payload FCS > > > Also theorethisch sollte das frame stimmen. Ja:
1 | ./gencrc -b16 03 00 10 01 01 42 0C 39 B3 69 |
2 | CRC = 0x0000 |
(Präambel, SFD und PHR zählen nicht mit in die CRC-Generierung.) Wobei 03 00 10 kein sinnvoller MHR ist; das wäre ein MAC command, aber ohne jegliche Adressierungsfelder. > Nun muss man ja diese Symbole(4Bit) zu einer 32bit chip folge nach > folgender Tabelle konvertieren: Davon habe ich leider keine Ahnung, mit einem Signalgenerator musste ich sowas bislang noch nicht selbst tun.
Ahhhh merci!!! Klappt aber leider immer noch nicht. Ich habe gerade mal mit einem zweitem Modul etwas rübergesendet und mit dem Packet Sniffer aufgefangen. Ich habe das Bild angehängt. Kann man aus den Daten dort das komplette gesendete Frame rekonstruieren? Auch wenn ich c++ (noch) nicht kann, müsste man dein programm ja so verändern können, dass die FCS direkt ausgegeben wird und nicht nur das ganze auf richtigkeit überprüft wird, oder? Im IEEE Datenblatt gibts dazu in 7.2.1.8 FCS field den entsprechenden Algorithmus, den ich aber nicht so ganz verstehe... Hab dazu leider überhaupt nichts im Internet gefunden und wüsste auch sonst nicht, an wen ich mich damit wenden kann. Vielen Dank für dein Unterstützung!
Andi M. schrieb: > Kann man aus den Daten dort das komplette gesendete Frame > rekonstruieren? Der Frame steht doch direkt drunter, wobei die CRC nicht mit dabei steht. Den kann der hier vermutlich benutzte CC2420 nämlich nicht mit liefern, wenn er ihn zugleich überprüfen soll: stattdessen liefert er dann ein "CRC OK"-Flag und den LQI-Wert. Allerdings ist der Frame auch wieder Nonsense. Das sieht man beginnend am frame type 4 ("R100"), der ein "reserved frame type" im Standard ist. Weiterhin wird behauptet, dass er verschlüsselt sei, was deinen Sniffer dann dazu bewegt, alle möglichen Annahmen über den benutzten Schlüssel zu implizieren und diese in die dekodierte Ausgabe einzubauen. Dadurch enthält die dekodierte Ausgabe deutlich mehr Informationen als die 3 abschließenden Bytes MAC Payload, die da eigentlich drin sind. ;-) > Auch wenn ich c++ (noch) nicht kann, müsste man dein programm ja so > verändern können, dass die FCS direkt ausgegeben wird und nicht nur das > ganze auf richtigkeit überprüft wird, oder? Das macht es schon jetzt. ;-)
1 | ./gencrc -b16 03 00 10 01 01 42 0C 39 |
2 | CRC = 0x69b3 |
Wenn du die CRC weglässt, wird sie berechnet; gibst du sie mit an, so muss das Ergebnis 0 sein. Das ist genau die Funktionsweise einer CRC ... > Im IEEE Datenblatt gibts dazu in 7.2.1.8 FCS field den entsprechenden > Algorithmus, den ich aber nicht so ganz verstehe... Den muss man auch nicht verstehen, um ihn benutzen zu können. Es genügt völlig, dass Mathematiker und Informationstheoretiker diese Algorithmen verstehen können. ;-) Die Umsetzung in C hast du ja weiter oben stehen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.