NRF24L01 scheint nicht zu senden (MAX_RT)

Gast #4221181
Lesenswert?

Hallo Leute,

ich bin jetztt schon ewig dabei, einen Fehler zu suchen und komme 
alleine nicht drauf. Ich möchte gernen eine Funkbrücke über zwei 
NRF24L01+ Modulen realisierenh, über welche ich UART Daten übertragen 
kann. Dazu habe ich unter

https://github.com/pvishal/nrf24l01-rc

einen Sourcecode gefunden, den ich für mein Atmega32 Board entsprechend 
angepasst habe. Stand ist jetzt, dass ich bereits DEBUG Ausgaben über 
UART an den PC sende, um zu analysierenh, wo der Fehler liegt.

Sol#bald ich etwas senden möchte, bekommt der Atmega einen Interrupt, 
was ja auch so sein muss. Allerdings wird in der Interrupt Routine 
nichts gesendet, da er aus dem Statusregister vom NRF 1E ausliest...... 
Diesen Wert kann ich aber nicht wiklich analysieren.

Folgenden Codeausschnitt zeigt mein Problem denk ich:

Sobald ich etwas sende, bekomme ich folgende Ausgabe über UART:
1
ISR(INT0_vect)
2
{
3
    uint8_t status;
4
    uint8_t pipe_number;
5

6
    uart_puts("Interrupt\r\n");
7
    CE_LOW();
8

9
    status = get_status();      // Hier wird der status auf UART ausgegeben
10

11

12
    if (status & _BV(RX_DR))
13
    {
14
        uart_puts("Empfang\r\n");
15
        pipe_number =  (status & 0xE) >> 1;
16
        radio_rxhandler(pipe_number);
17
    }
18
    // We can get the TX_DS or the MAX_RT interrupt, but not both.
19
    if (status & _BV(TX_DS))
20
    {
21
        uart_puts("Senden\r\n");
22
        // if there's nothing left to transmit, switch back to receive mode.
23
        transmit_lock = 0;
24
        reset_pipe0_address();
25
        set_rx_mode();
26

27
        // indicate in the history that a packet was transmitted successfully by appending a 1.
28
        tx_history <<= 1;
29
        tx_history |= 1;
30

31
        tx_last_status = RADIO_TX_SUCCESS;
32

33
        // finally, notify the application.
34
        radio_txhandler();
35
    }
36
    else if (status & _BV(MAX_RT))
37
    {
38
        uart_puts("MAX_RT\r\n");
39
        send_instruction(FLUSH_TX, NULL, NULL, 0);
40

41
        transmit_lock = 0;
42
        reset_pipe0_address();
43
        set_rx_mode();
44
        // indicate in the history that a packet was dropped by appending a 0.
45
        tx_history <<= 1;
46

47
        tx_last_status = RADIO_TX_MAX_RT;
48
    }
49

50
    // clear the interrupt flags.
51
    status = _BV(RX_DR) | _BV(TX_DS) | _BV(MAX_RT);
52
    set_register(STATUS, &status, 1);
53

54
    CE_HIGH();
55
}

Sobald ich etwas sende, bekomme ich folgende Ausgabe über UART:

<\0>Device Ready for RX/TX!<\r><\n>
Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.Interrupt<\r><\n>
30MAX_RT<\r><\n>
Data not transmitted. Max retry.

Könnt ihr mir noch einen Denkanstoss geben, wo der Fehler liegen könnte?

main und radio. c habe ich in den Anhang gepackt.
Angehängte Dateien:
Gast #4221224
Lesenswert?

Ich glaube, dass die paar Abfragen in der ISR nicht der Auslöser sind.

Wegen dem Zerschiessen vom Modul das glaueb ich nicht, da ich komplett 
alles auf 3,3V Vcc laufen habe und außerdem bekomme ich ja einen 
Interrupt vom NRF Modul zurück. Aber anscheinend passen die 
zurücjkgegebenen Werte nicht...
Gast #4221248
Lesenswert?

Thomas schrieb:
> Ich glaube, dass die paar Abfragen in der ISR nicht der Auslöser sind.

Entweder du weißt es oder du weißt es nicht. Glauben hilft nicht weiter.

Den Chip kenne ich nicht, daher die Frage: unter welchen Bedingungen 
werden die Interrupt ausgelöst.
Gast #4222332
Lesenswert?

Also,

ich habe grade einmal die Abfragen aus der ISR geschmissen und nur das 
Register ausgelesen und über UART ausgegeben. Es ist immer noch das 
gleiche Problem.

Der Interrupt wird ausgelöst, sobald eine Nachricht empfangen oder 
gesendet worden ist. Dieser kommt dann vom NRF Modul und löst eben den 
Interrupt beim Atmega32 aus.
Gast #4222466
Lesenswert?

Funktioniert das Lesen. Zum Init laut Programm wird zwar gelesen, aber 
wenn dort das falsche Ergebnis kommt, dann hat das keine Auswirkungen. 
Das Lesen der Nutzdaten ist da anspruchsvoller.
Also nochmal: kann man Daten von nRF lesen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren