Forum: Mikrocontroller und Digitale Elektronik CC2420 liefert seltsame Daten


von d-roehrig (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem ordentliche Daten am CC2420 zu empfangen. 
Möchte einen Packet Sniffer bauen.

Zur Zeit bekomme ich über SPI immer die gleichen Daten, auch wenn kein 
Knoten sendet.

Folgende Register habe ich bisher gesetzt:
1
  // Adress_decode disabled
2
  MDMCTRL0_reg = SPI_ReceiveReg(0x51);
3
  MDMCTRL0_reg &= ~(0x0800);
4
  SPI_SendReg(0x11, MDMCTRL0_reg);
5
6
  // XOSC16M_PD + BIAS_PD = 0 für Crystal Oscillator (Command Strobe 0x01)
7
  MANAND_reg = SPI_ReceiveReg(0x61);
8
  MANAND_reg &= ~(0x4080);
9
  SPI_SendReg(0x11, MANAND_reg);
10
11
  PORTB &= ~(1<<DD_CS);             // CS\ low
12
  SPI_TxRx(0x01);
13
  SPI_TxRx(0x03);
14
  PORTB |= 1<<DD_CS;                // CS\ high
15
16
  setKanal();

Kann das von euch einer erklären wieso ich Daten bekomme, obwohl gar 
nichts gesendet wird? Das setzen und lesen der Register, sowie das 
einstellen des Kanals funktioniert 100%ig, auch wenn die Methoden nicht 
sichtbar ist.

Hoffe ihr könnt einem Anfänger helfen ;-)

Grüße
Dennis

von Christian R. (supachris)


Lesenswert?

Woher weißt du denn, dass neue Daten empfangen wurden? Fragst du den 
FIFOP ab? Hast du dir die AppNote AN033 von TI angesehen? Da ist doch 
die komplette Ansteuerung des Chips für den Anschluss an MSP430 oder 
ATMega drin, du musst lediglich bei rfBasicReceive() was mit den 
empfangenen Daten machen...

von d-roehrig (Gast)


Lesenswert?

Hallo,

danke für die schnelle Antwort.
FIFOP frage ich wie folgt ab:
1
if(PORTE & (1<<CC_FIFOP)) {
2
  USART_Tx(SPI_ReceiveReg(0x7f));
3
  _delay_ms(25);
4
}

Jedoch hatte ich es raus genommen, da ich mit dieser Abfrage gar keine 
Daten empfange.
Die Appnote werde ich mir morgen ansehen. Für heute ist erst mal 
Feierabend ;-)

Melde mich morgen wieder mit neuen Informationen.

Noch einen schönen Sonntag abend!

von d-roehrig (Gast)


Lesenswert?

Also, ich habe mir heute Vormittag die AppNote angesehen. Eigentlich 
würde ich die Konfiguration der Knoten gerne auf unterster ebene 
Durchführen. Somit helfen mir die Fertigen Methoden aus dem AppNote 
nicht. Aber ich habe mir die Vorgehensweise angesehen. Was nacheinander 
gemacht wird. Dazu ein paar Fragen:

1. Der Knoten sollte nur Pakete empfangen. Muss dazu STXON auch gesetzt 
werden? Wahrscheinlich nicht, oder?
2. Sind die Interrupts (FIFO / FIFOP) nötig, oder gehts auch ohne?
3. Ist eine Ad Hoc komunikation möglich indem ich einfach keinen PAN 
Koordinator festlege?

Und was bei mir auf jeden fall fehlt ist die Adresse des Knotens :D

Irgendwie denke ich jedoch, dass mich eine Besetigung der Fragen/Fehler 
noch nicht zum gewünschten Ziel bringen. Kann mir nicht vorstellen, dass 
ich dann trotz dem Daten empfange, die es eigentlich nicht geben sollte.

Vielleicht hast du noch eine Idee.

Grüße
Dennis

von Christian R. (supachris)


Lesenswert?

Also die Appnote von TI ist doch schon unterste Ebene. Für deinen 
Sniffer kannst du einfach einen Kanal einstellen und den Transceiver 
initialisieren. STX wird ja nur aktiviert, wenn du wirklich sendest. 
Koordinator-Adresse ist nicht nötig, wenn du eh was eigenes machen 
willst. FIFO/FIFOP musst du natürlich nicht verwenden, kannst ja auch 
das Register abpollen. Ist aber sinnbefreit.
Du kannst die Quellcodes ja 1:1 übernehmen, nur beim Initialisieren 
(basic_rf_init.c) musst du die Bits für die Paket-Filterung und das 
Auto-Ack  rausnehmen, damit du alle Pakte empfängst und nicht nur 
welche, die an dich gerichtet sind.

Klar kannst du auch das Rad nochmal erfinden, aber wozu?

von d-roehrig (Gast)


Lesenswert?

Hallo,

leider ist es eine Vorgabe, dass ich das "selber" mache. Aber wenigstens 
habe ich jetzt schon einmal einen Ablauf, wie ich vorgehen kann. 
Schreibe nämlich gerade meine Abschlussarbeit.

Eine Frage zum schreiben in den RAM:

Wenn ich versuche die Adresse zu setzen, dann übernimmt er das LSB, aber 
nicht das MSB (bleibt immer 0x00). Mein Code dazu sieht wie folgt aus:
1
uint8_t SPI_TxRx(uint8_t cData)
2
{
3
  SPDR = cData;
4
  while(!(SPSR & (1<<SPIF)));
5
  return SPDR;
6
}
7
8
uint8_t SPI_RxRam(uint16_t Address)
9
{
10
  uint8_t status;
11
  uint16_t data;
12
13
  PORTB &= ~(1<<DD_CS);             // CS\ low
14
15
  _delay_us(25);          
16
17
  status = SPI_TxRx((uint8_t)(Address>>8));
18
  SPI_TxRx((uint8_t)(Address & 0x00ff));
19
  data = (SPI_TxRx(0xff)<<8);
20
  data = data + (SPI_TxRx(0xff) & 0x00ff);
21
22
  PORTB |= 1<<DD_CS;                // CS\ high
23
  return data;
24
}
25
26
void SPI_TxRam(uint16_t Address, uint16_t data)
27
{
28
  uint8_t status;
29
30
  PORTB &= ~(1<<DD_CS);             // CS\ low
31
  
32
  _delay_us(25);          
33
  
34
  status = SPI_TxRx((uint8_t)(Address>>8));
35
  SPI_TxRx((uint8_t)(Address & 0x00ff));
36
  SPI_TxRx((uint8_t)(data>>8));
37
  SPI_TxRx((uint8_t)(data & 0x00ff));
38
39
  PORTB |= 1<<DD_CS;                // CS\ high
40
}

und in der main rufe ich es so auf:
1
SPI_TxRam(0xda80, 0xabcd);  // 0x016a
2
3
_delay_ms(1000);
4
5
USART_Tx((uint8_t)(SPI_RxRam(0xdaa0)>>8));    // 0x016a MSB
6
USART_Tx((uint8_t)(SPI_RxRam(0xdaa0) & 0x00ff));  // 0x016a LSB

Hoffe das es nur ein kleiner Fehler ist...

Grüße
Dennis

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
Noch kein Account? Hier anmelden.