Forum: Mikrocontroller und Digitale Elektronik nrf24l01 sendet nicht


von Johannes (Gast)


Lesenswert?

Hallo,
ich möchte gerne mit nrf24l01 Daten übertragen. Doch leider hapert es 
schon am Senden.
1
uint8_t spi_tx_address[5] = {0xD7,0xD7,0xD7,0xD7,0xD7};
2
uint8_t spi_rx_address[5] = {0xE7,0xE7,0xE7,0xE7,0xE7};
3
4
5
int main(void){
6
  timer_interrupt_init(); // Timer0 -> 1ms
7
  extern_interrupt_init();
8
  usart_init(USART_MYUBRR);
9
  usart_transmit_string("RX devices ready \r\n"); 
10
  
11
  nrf24_init(); // initialize hardware pins
12
  nrf24_config(2,4); // Channel #2, payload length: 4
13
  /* set the device addresses */
14
  nrf24_tx_address(spi_tx_address);
15
  nrf24_rx_address(spi_rx_address);
16
17
  sei(); // Global Interrupts activate
18
  //unsigned int rv = 0;
19
  while (1){
20
    //receive();
21
    transmit();
22
    usart_transmit_string("transmission over \r\n");
23
    _delay_ms(2000);
24
  }
25
}
26
27
ISR(INT0_vect){
28
  static unsigned int status;
29
  // Read wl_module status
30
  wl_module_CSN_lo; // Pull down chip select
31
  status = spi_fast_shift(NOP); // Read status register
32
  wl_module_CSN_hi; // Pull up chip select
33
  
34
  if (status & (1<<TX_DS)){ // IRQ: Package has been sent
35
    usart_transmit_string("Package has been sent \r\n");
36
    nrf24_configRegister(STATUS, (1<<TX_DS));
37
    PTX = 0;
38
  }
39
40
  if (status & (1<<MAX_RT)){ // IRQ: Package has not been sent, send again
41
    usart_transmit_string("Package has not been sent, send again \r\n");
42
    nrf24_configRegister(STATUS, (1<<MAX_RT));
43
    wl_module_CE_hi; // Start transmission
44
    _delay_us(10);
45
    wl_module_CE_lo;
46
  }
47
48
  if (status & (1<<TX_FULL)){ // TX_FIFO Full < this isnt an IRQ
49
    usart_transmit_string("TX_FIFO Full\r\n");
50
    wl_module_CSN_lo; // Pull down chip select
51
    spi_fast_shift(FLUSH_TX); // Flush TX-FIFO
52
    wl_module_CSN_hi; // Pull up chip select
53
  }
54
}

Ich bekomme immer die Ausgabe
Package has not been sent, send again

Diese Meldung kommt aus der Interrupt-Routine INT0 -> if (status & 
(1<<MAX_RT))

Das heisst ja eigentlich, dass kein Empfänger ermittelt worden ist, 
welcher ein Acknowledge zurückliefert oder?

Beim Empfänger habe ich
1
while (1){
2
    
3
    while (!nrf24_dataReady());
4
    usart_transmit_string("\r\n new data: ");
5
    nrf24_getData(spi_data_array);
6
    usart_transmit_char(spi_data_array[0]);
7
    usart_transmit_char(spi_data_array[1]);
8
    usart_transmit_char(spi_data_array[2]);
9
    usart_transmit_char(spi_data_array[3]);
10
    
11
    }

Es werden auch kontinuierlich Ausgaben über usart rausgegeben, 
allerdings sind die Werte alle 0x00 (sollten 0x11, 0x55, 0xAA, 0xFF 
sein). Und wenn ich den Sender Abstecke (Strom weg, sodass dieser nicht 
mehr senden kann), bekomme ich ebenfalls kontinuierlich die Ausgabe über 
neue Datas.

Wie kann/sollte ich jetzt vorgehen um meinen Fehler zu finden? Es 
scheinen ja beide Seiten einen Fehler zu haben (Sender sendet nicht, 
empfänger empfängt falsche Daten, obwohl keine Daten da sein dürften).

Johannes

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

wäre cool, wenn ihr mal über meiner Konfiguration vom Sender drüber 
gucken könntet, ob es dort richtig ist.

Die Funktion Senden sieht wie folgt aus
1
void transmit(void){
2
  /* Fill the data buffer */
3
  spi_data_array[0] = 0x11;
4
  spi_data_array[1] = 0x55;
5
  spi_data_array[2] = 0xAA;
6
  spi_data_array[3] = 0xFF;//spi_q++;
7
  
8
  /* Automatically goes to TX mode */
9
  nrf24_send(spi_data_array);
10
  /* Wait for transmission to end */
11
  while(nrf24_isSending());
12
  /* Make analysis on last transmission attempt */
13
  spi_temp = nrf24_lastMessageStatus();
14
  if(spi_temp == NRF24_TRANSMISSON_OK)
15
  {
16
    usart_transmit_string("> Tranmission OK\r\n");
17
  }
18
  else if(spi_temp == NRF24_MESSAGE_LOST)
19
  {
20
    usart_transmit_string("> Message is lost ...\r\n");
21
  }
22
  
23
  nrf24_powerUpRx(); // go back to RX mode ...
24
}

von Frickelfritze (Gast)


Lesenswert?

Johannes schrieb:
> Doch leider hapert es schon am Senden.

Aus den bisschen Symptomen kannst du das nicht feststellen.
Hast du das HF-Signal beobachtet dass es nicht aus dem
Sendmodul kommt? Ich vermute mal schwer: nein.
Der NRF24 unterscheidet je nach Konfiguration ob er ein
Acknowledge vom Empfänger bekommen hat oder nicht. Das
bedeuted aber nicht (wen kein ACK kommt) dass er nichts
gesendet hat.

Johannes schrieb:
> Wie kann/sollte ich jetzt vorgehen um meinen Fehler zu finden?

Den kompletten Aufbau (+Schaltplan) zeigen und das/die voll-
ständigen Programme.

Und:
-------------------------------------------
Wichtige Regeln - erst lesen, dann posten!
  Groß- und Kleinschreibung verwenden
  Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Formatierung .... C-Code .....
-------------------------------------------

von Johannes (Gast)


Angehängte Dateien:

Lesenswert?

Der Sender ist an einem Atmega328p angeschlossen, welcher sich auf einem 
Arduino Uno befindet. Das Modul habe ich an SPI angebunden und CE und 
CSN an PB0 und PB1.

Der Empfänger ist an einem Attiny2313. Da dieser einzeln ist, habe ich 
noch etwas Peripherie anebaut.
100nF zwischen Vcc und GND
10kOhm zwischen Vcc und RESET,
Quarz mit 8 MHz
Widerstand und LED an PD5
RX, TX an FT232 um mit dem Computer zu kommunizieren
SPI an nrf24l01
CE an PB0
CSN an PB1

Nur die main-Funktion und der SPI ist am attiny etwas anders. Ansonsten 
ist es so, das vom Atmega vorerst nur Daten gesendet werden sollen (wenn 
alles funktiniert soll dieser auch Daten empfangen) und der Attiny soll 
zunächst nur die Daten empfangen und ausgeben (später auch antworten 
zurückschicken).

von Johannes (Gast)


Lesenswert?

Ahso, den IRQ-Pin vom nrf24l01-Modul habe ich bei beiden Controllern an 
INT0 angeschlossen.

von Johannes (Gast)


Lesenswert?

Gibt es denn eine Möglichkeit, herausfinden, wo der fehler genau liegt?
Es gibt ja mehrere Stellen.
1. Kommunikation Mikrocontroller -> Sender (SPI)
2. Kommunikation Sender -> Empfänger (Funk)
3. Kommunikation Mikrocontroller -> Empfägner (SPI)

Wie kann ich die einzelnen Kommunikationen am besten testen?

von Georg G. (df2au)


Lesenswert?

Johannes schrieb:
> wo der fehler genau liegt

Da hast du noch vergessen:
- Sender / Empfänger falsch initialisiert.
- Sender / Empfänger falsch bedient bzw Fehler im Code.

Hast du leihweise Zugriff auf eine 2.4GHz Fernsteuerung?

von Johannes (Gast)


Lesenswert?

Georg G. schrieb:
> Hast du leihweise Zugriff auf eine 2.4GHz Fernsteuerung?

Das einzige was ich hätte, wäre eine Maus und eine Tastatur, die über 
2,4Ghz laufen

von Georg G. (df2au)


Lesenswert?

Johannes schrieb:
> Maus und eine Tastatur

Die werden mit großer Wahrscheinlichkeit nicht das NRF2401 Verfahren 
nutzen. Schade.

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.