Forum: Mikrocontroller und Digitale Elektronik NRF24L01 SPI Problem bringt mich noch zum Wahnsinn!


von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

das Forum ist echt die letzte Hoffnung weil ich nach 4 Tagen Sucherei 
keine Antwort mehr weiss. Alles scheint richtig zu sein aber diese 
verfl. Module hängen sich nach einer Weile einfach auf und antworten 
nicht mehr :-(((

Setup:
Empfämnger: STM32F4 CPU (Empfänger) im Interrupt
Sender: Arduino Pro Mini mit MIRF Library

Senderseitig ist alles ok, die LIb habe ich mir angeschaut, so sieht es 
auch bei mir aus. Es kommen ja auch laufen die richtigen Messwerte der 
Sensoren an.

Aber der Empfänger .... inzwischen alles runtergestripped, nur noch die 
Routinen, die ich brauche.

IM Bild eine typische SPI Kommunikation mit 1.3 Mhz , einfach mal eine 
Statusabfrage READ+Register 07 100 Mal rausgehauen, es müsste immer der 
gleiche Wert kommen. Nämlich 0x40.

Ab dem 32.ten Byte bricht es ab, dann antwortet das Modul nicht mehr. 
Niemals mehr, außer ich starte das System per Warmstart neu und 
initialisieren das Modul erneut.

32 Byte, das ist genau die maximale Payload Size, wobei 3 x 32 Byte in 
den Fifo passen. Zumindest auffällig.

Woran könnte das noch liegen? Mir fällt absolut nichts mehr ein!

Gruss,
Christian

von Christian J. (Gast)


Lesenswert?

PS: Einen Fallstrick habe ich gefunden, bei 8 Bit Arduino und 32 Bit STM 
sind zwei gleiche Structs mit "gemischten Werten" eben nicht gleich 
lang, weil da "aligned" wird. Die auf dem STM32 sind immer größer. Daher 
musste ich alle Zahlenwerte auf 32 Byte arduino seitig erweitern. Sonst 
"treffen" die bei ihrem Empfänger nicht auf die richtigen Speicherzellen 
des Structs.__attribute_packed(()) für den Szructs wollte ich nicht 
verwenden, davor lese ich überall Warnungen.

Aber das hat nichts mit der Hardware zu tun....

von Daniel R. (sparker)


Lesenswert?

Ich entschuldige mich, aber ich muss schon etwas schmunzeln. ;-)

Ich habe diese Dinger vor über einem Jahr beiseite gelegt (um nicht zu 
sagen: an die Wand geworfen), weil ich dieselben Probleme hatte. Das war 
auch das erste Mal, dass ich ein Problem nicht auf Anhieb lösen konnte.

Sämtliche angeblich funktionierende Routinen vereinfacht, trotzdem 
rätselhaftes Verhalten (Aufhänger, keine Datenpakete beim Empfänger).
Versorgungsspannung stabilisiert, Durchkontaktierung versucht 
nachzulöten...

Ein Programm hat interessanterweise fast funktioniert, aber da sind nur 
sporadisch Datenpakete empfangen worden. (so mit 80% Ausfallsquote)

von S. R. (svenska)


Lesenswert?

Du machst natürlich mal wieder alles falsch und wunderst dich, dass 
nichts geht. Für dein struct-Problem ist __attribute__((packed)) nämlich 
die Lösung, die du absichtlich ablehnst. Zugriffe darauf werden auf dem 
STM32 passend ausmaskiert und sind daher geringfügig langsamer.

Du darfst auch __attribute__((packed)) mit __attribute__((align(4))) 
verbinden, dann erweitert der Compiler automatisch passend und 
garantiert dir, dass die Felderoffsets auf beiden Systemen gleich sind.

Mit den nRF24L01 habe ich in der Uni mal gearbeitet. Mein Sender ist 
immer abgestürzt, wenn ich größere Datenmengen verschickt hatte. Danach 
hatte ich mich auf "10 Pakete á 16 Byte pro Sekunde" beschränkt und es 
lief einigermaßen stabil - solange ich nicht versucht habe, mehr Daten 
in den FIFO zu schieben, als reinpassten.

von Philipp K. (philipp_k59)


Lesenswert?

Schonmal Arduino gegen Arduino versucht als vergleichsfall?

Habe aus Spaß einen Joystick mit nem quadcopter verbunden..

das geht naja Slowly ab mit 50x6Byte die Sekunde,halt nur Arduino gegen 
Arduino... sehr zuverlässig.

von Adib (Gast)


Lesenswert?

Hallo Christian,

Lass doch mal deinen Code sehen ... ansonsten lässt sich keine seriöse 
Antwort finden.

Adib.

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Adib schrieb:
> Hallo Christian,
>
> Lass doch mal deinen Code sehen ... ansonsten lässt sich keine seriöse
> Antwort finden.
>
> Adib.

Ist nur Testcode derzeit..... ganz unten die Routine auf die es ankommt. 
Da steht natürlich jetzt nur ne Schleife drin, damit ich die Screenshots 
machen konnte. Normalcode unten als Kommentar beiseite geschoben.

Ich pfeffer die Module bald an die Wand, so einen Shice habe ich noch 
nie gehabt.

von Heinz A (Gast)


Lesenswert?

Sollte CSN nicht innerhalb statt ausserhalb der for-Schleife im 
EXTI1_IRQHandler getoggelt werden?

von Christian J. (Gast)


Lesenswert?

Heinz A schrieb:
> Sollte CSN nicht innerhalb statt ausserhalb der for-Schleife im
> EXTI1_IRQHandler getoggelt werden?

Nein. Multibyte SPI Transfer. CSN schaltet die SPI ab, dann wären Read 
Befehle sofort "vergessen"

von Heinz A (Gast)


Lesenswert?

Sieht in deinem Screenshot aber merkwuerdig aus, CSN ist da immer low, 
und da du NSS als "soft" einstellst, macht dein SPI-Modul da gar nix 
automatisch. Wie sieht's denn aus wenn CSN in der Schleife getoggelt 
wird?

von Christian J. (Gast)


Lesenswert?

Philipp K. schrieb:
> Schonmal Arduino gegen Arduino versucht als vergleichsfall?

Müsste ich zusammen frickeln ..... fehlt mir derzeit der Nerv zu, da es 
mich noch weiter weg führt. Wenn das funktioniert nützt mir das auch 
nichts für den STM32. Wer weiss, vielleicht streikt ja auch die SPI ....

PS: Die teuren Module mit der Antenne dran laufen gar nicht, weder als 
Sender noch als Empfänger. Und ich hab rudelweise diese Dinger hier, 
alle Varianten.-

von Christian J. (Gast)


Lesenswert?

Heinz A schrieb:
> Sieht in deinem Screenshot aber merkwuerdig aus, CSN ist da immer low,
> und da du NSS als "soft" einstellst, macht dein SPI-Modul da gar nix

Ich checke es grad ... sieht seltsam aus....

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Erzeugt das Gleiche... war mir aber schon klar. Das NRF24 Modul 
antwortet immer mit dem Status, egal was reinkommt....

So schauts jetzt aus, nach genau 32 Bytes steigt es aus.... zuzüglich 
dem Müll da noch weiter rechts. Das kann doch nicht normal sein! Oder 
das Modul liegt zu nahe an der CPU, die müllt emv mässig auch nett rum.

SPI Baudraten habe ich schon variiert... unter 250khz geht nix mehr, 
über 4 Mhz auch nicht. Unter 250khz ist seltsam. Aktuell eben 1.3 Mhz. 
Ändert aber nix.

von Heinz A (Gast)


Lesenswert?

Kannst du das gleiche auf dem Arduino ausprobieren? Oder die Module 
austauschen?

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Heinz A schrieb:
> Kannst du das gleiche auf dem Arduino ausprobieren? Oder die Module
> austauschen?

Nee.... so auf die Schnelle nicht. Müsste ich erst aufbauen, 
programmieren usw. Das wird aber nicht das STM32 Problem lösen. Der 
Arduino sendet derzeit nur Pakete und das macht er richtig.

Das STM32 Programm oben macht nichts weiter als Bytes raushauen. Völlig 
ohne Sinn. Und reicht um die Kiste abschmieren zu lassen.

Ist das hier so ok? Start der Kommunikation? Vielleicht irgendwas 
übersehen.

von Heinz A (Gast)


Lesenswert?

Christian J. schrieb:
> Ist das hier so ok? Start der Kommunikation?

Sieht mit blossem Auge gut aus...

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Ergebnis von 100 x 0xff, also nur Statusabfrage. (2 
Möglichkeiten, entweder Register lesen oder 0xff senden)

Nach 32 Bytes ist Ende.... später dann etwas Müll....




    for (uint16_t i = 0; i <100; i++) {
        CSN_LOW;
        SPI_TransferByte(0xff);
        CSN_HIGH;
    }

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

Auch etwas Müll mittendrin. Ich habe so das Gefühl, dass da irgendwas 
"out of sync" ist, also ein sich quasi addierender Fehler auftritt und 
das RF Modul kann da nicht mehr interpretieren was es sieht. Oder 
irgendein Zähler in dem Ding läuft über....

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

So... noch jemand da?

Es geht (vorerst!!) und zwar indem ich die Leseroutine verändert habe, 
dass ich bei Eintritt das Modul in den Power Down Mode setze. Alternativ 
geht auch nach dem Lesen ein PowerDown und PowerUpRX. Und der Datensatz 
darf nicht zu lang sein.

Fazit: Mit der SPI in diesem China Kracher stimmt was nicht aber 
scheinbar kann man das Problem umgehen, indem man das Modul nach jedem 
Empfang einfach aus und wieder einschaltet.

Ich schaue mir das nochj ne Weile an, wie die Daten von der Küche ins 
Arbeitszimmer flitzen und werde diese verfluchte Routine dann nicht mehr 
anfassen......
1
oid EXTI1_IRQHandler()
2
{
3
    uint8_t *ptr;
4
5
    /* IRQ Flag prüfen auf Fehlinterrupt*/
6
    if (EXTI_GetITStatus(EXTI_Line1) == RESET)
7
        return;
8
9
    /* Power down zum Lesen */
10
    RF_PowerDown();
11
12
    GPIO_SetBits(TM_DISCO_LED_PORT,LED_GREEN);
13
14
    if (RF_DataReady())
15
    {
16
        GPIO_SetBits(TM_DISCO_LED_PORT,LED_ORANGE);
17
        ptr = (uint8_t*)&rf_data;
18
        CSN_LOW;
19
        SPI_TransferByte(NRF24L01_CMD_R_RX_PAYLOAD);
20
        for (uint8_t i = 0; i < PAYLOAD_SIZE; i++)
21
             *(ptr++) = SPI_TransferByte(0xff);
22
        CSN_HIGH;
23
    }
24
25
    /* Fifo löschen, Status löschen */
26
    RF_PowerUpRx();
27
28
    /* Lösche interrupt flag */
29
    EXTI_ClearITPendingBit(EXTI_Line1);
30
31
}

von Philipp K. (philipp_k59)


Lesenswert?

Christian J. schrieb:
> Und ich hab rudelweise diese Dinger hier,
> alle Varianten.-

Ja ich auch.. wenn es probleme gab egal ob mit SMA Verstärker oder ohne, 
hat immer nen 10uF direkt an den Pins geholfen. Teils war auch mal nen 
Pin vom Header nicht richtig verlötet.

von Jojo S. (Gast)


Lesenswert?

Zeichne mal das IRQ Bit im LA mit auf. Im Datenblatt steht:

'Note:
The 3 bit pipe information in the
STATUS
 register is updated during the
IRQ
pin high to low
transition. The pipe information is unreliable if the
STATUS
 register is read during an
IRQ
pin
high to low transition.'

Dann kommt der 'Müll' evtl. daher?

von Christian J. (Gast)


Angehängte Dateien:

Lesenswert?

War ne kurzer Traum ...... es lief kurz und dann blockte es wieder. 
Immerhin etwas länger als vorher, etwas scheint es zu bringen. 10uf hab 
ich natürlich dran, liest man ja überall diese Wunderpille.


Und was soll man da jetzt sehen am Int Pin? Der ganz unten...

von Christian J. (Gast)


Lesenswert?

PS:

Das Funkmodul fliegt raus aus der Anwendung. Mehr als 4 Tage reichen um 
festzustellen, dass dieser Mist nichts taugt. Kennt jemand ein Modul, 
was zuverlässig auf ähnlicher Basis arbeitet? RFM12 scheinen ja nicht 
mehr ganz so aktuell zu sein, die gabs schon vor 10 Jahren. Was ist denn 
so Neues auf dem Markt?

von Christian J. (Gast)


Lesenswert?

Tja....

wie soll man das erklären? Das ganze Projekt auf das Notwendige runter 
gestripped und die Schaltung auf einem neuen Bord aufgebaut, nur noch 
das Funkmodul dran und nichts anderes. Dazu den LA.

Sobald ich genau diese Sequenz herausnehme, die mit dem Modul nichts zu 
tun hat läuft es durch, ohne zu mucken. Nehme ich die wieder rein, geht 
es sofort nicht mehr. Ebenfalls wenn Port Mode auf Input gestellt wird. 
Das sind nur Leds dran.

Solche Dinge sind für mich einfach nicht erklärbar. Port E hat mit dem 
Modul absolut nichts zu tun. Und auch sonst ist keine Hardware vom Disco 
auf PortE angeschlossen, die da stören könnte.

Das war es definitiv, läuft einwandfrei durch!

Ich kann den Code gern jemand geben, der ebenfalls ein 407 Disco hat und 
ein Funkmodul. Die Erklärung hätte ich wirklich gern, was Port E mit dem 
Einfrieren des SPI Busses zu tun hat !!!

1
    // Port E mit den Wetter Tendenz LED einstellen
2
//    GPIO_StructInit (&GPIO_InitStructure);
3
//    GPIO_InitStructure.GPIO_Pin     = WLED_ROT1 | WLED_ROT2| WLED_GLB | WLED_GRN | WLED_BLAU;
4
//    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_OUT;
5
//    GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;
6
//    GPIO_InitStructure.GPIO_Speed   = GPIO_Low_Speed;
7
//    GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;
8
//    GPIO_Init(GPIOE, &GPIO_InitStructure);

von Jojo S. (Gast)


Lesenswert?

Glückwunsch! Ich finde so hast du einen Fehler gut gesucht. Wenn das 
offensichtliche nicht der Fehler ist dann muss man die Kreise grösser 
und grösser ziehen. So war auch meine Idee mit dem IRQ überwachen zu 
verstehen, der hätte ja auch irgendwie flattern können. Wenn ich dir 
gesagt hätte, schalte den PortE ab hättest du mir auch den virtuellen 
Vogel gezeigt...
Aber wenn das mein akutes Problem wäre dann wäre ich auch glücklicher 
wenn so etwas in irgendeinem Errata auftauchen würde oder im Datenblatt 
in einem Nebensatz erwähnt würde. Ist das wirklich der einzige 
Unterschied zur nicht funktionierenden Umgebung? Meine nächste Idee wäre 
sonst das es irgendwo in der Systeminitialisierung liegt weil du ja 
schon einige merkwüdige Fehler beobachtet hast.
Ich drücke dir weiterhin die Daumen für maximale Erfolge.

von Christian J. (Gast)


Lesenswert?

Jojo S. schrieb:

> Ist das wirklich der einzige
> Unterschied zur nicht funktionierenden Umgebung? Meine nächste Idee wäre
> sonst das es irgendwo in der Systeminitialisierung liegt weil du ja
> schon einige merkwüdige Fehler beobachtet hast.

Mich lässt das auch nicht los.

- Anderes Disco Board was nicht in der Anwendung steckt mit ihren vielen 
Teilen
- NRF24L01 direkt an die Pins dran gestöpselt
- LA Logger mit drüber
- Keinerlei Extra Hardware
- Das Projekt schrittweise gelöscht bis fast nichts mehr da war.

Durch Zufall, weil eine LED nicht leuchtete auf die Init Port Routine
gekommen, da stufenweise alles wegkommentiert, immer wieder am LA 
nachgeschaut ...... peng, Port E! Entweder alles raus oder die Direction 
ändern.

Wäre an Port E was dran würde ich auch auf Überlastung tippen aber Port 
E ist ja leer, die LED sind in der Anwendung drin.

Das ist der Rest:
1
//////////////////////////////////////
2
/*         Hauptprogramm            */
3
//////////////////////////////////////
4
5
/* Delay Timer */
6
volatile uint32_t        delaytimer;
7
volatile uint32_t        millis;                // Millisekunden seit Systemstart
8
9
void SysTick_Handler() {
10
11
    delaytimer++;
12
    millis++;
13
}
14
15
// Verzögert die Ausführung um N Millisekunden
16
void DelayMs(uint32_t msec) {
17
18
    delaytimer = 0;
19
    while (delaytimer < msec);
20
}
21
22
23
int main(void)
24
{
25
26
    //////////////////////////////////////
27
    /* Initialisierung des Systems      */
28
    //////////////////////////////////////
29
30
    SystemInit();                                           // Init der Clocks und wichtiger Register
31
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);        // Systick einstellen
32
    SysTick_Config(SystemCoreClock/1000);
33
    TM_DELAY_Init();
34
    TM_DISCO_LedInit();
35
    Init_Ports();
36
37
    /* Funkmdoul einstellen */
38
    RF_SPI_Init();                                          // SPI justsieren
39
    RF_Configure();                                         // NRF24L01+ einstellen
40
    RF_NVIC_Init();                                         // ISR Vektor umbiegen
41
42
    if (RF_Available()) {
43
        flags.NRF24L01_IsPresent = true;
44
        flags.rf_timeout = true;
45
    }
46
    else
47
        while (1);
48
49
    NVIC_EnableIRQ(EXTI1_IRQn);
50
51
52
    while (1) {
53
        DelayMs(1000);
54
55
        if (nrf24l01_NewTempAvailable) {
56
            GPIO_ResetBits(GPIOD,LED_GREEN);
57
            GPIO_ResetBits(GPIOD,LED_RED);
58
            GPIO_ResetBits(GPIOD,LED_ORANGE);
59
            GPIO_ResetBits(GPIOD,LED_BLUE);
60
            nrf24l01_NewTempAvailable = false;          /* Flag reset, Wert wurde verarbeitet */
61
        }
62
63
    }
64
65
}


Einmal hatte ich was Ähliches... LED Flattern. Pin 1 ein, Pin 4 ging mit 
an und dimmte so vor sich hin. Da war aber die CPU kaputt, EMV 
vermutlich.

Ich schaue mir die Errate mal an, Port E ist auf dem Disco frei, da ist 
nix dran auf den Bits 4-9.

von Jojo S. (Gast)


Lesenswert?

Welches Board ist da denn genau? Habe auch eines der ersten F4 und 
gerade ein neues mit M4 und eins mit M7 bekommen. Aber die STM32 werden 
mir gerade immer unsympathischer :-) Weiß nicht warum die ganze Welt da 
gerade so drauf abfährt, meine favorisierten LPC verhalten sich da 
wesentlich unauffälliger.

von Christian J. (Gast)


Lesenswert?

Nüscht..... Errata ist endlos lang aber alles nur so Spezialsachen, die 
so keiner braucht. I2C ok.... da ist einiges zu drin und auch DMA.

Ich habe 3 Boards mit dem 407VG drauf, die STM32F407Vg Disco. Früher 
habe ich auch LPC2368 benutzt, immer schön Register Programmieren, ganz 
ohne Libs. Grad aber im Markt verkauft das Board. Lief nur mit Jtag und 
Wiggler in Verbindung mit Rowley Crossworks, keine swd Unterstützung, 
st-link sowieso nicht.

Entweder habe ich das was übersehen und Port E hängt doch irgendwie mit 
der SPI 1 zusammen oder da bricht irgendwie die Spannung im Chip 
zusammen. Es muss nicht das RF Modul sein, es kann genauso gut sein, 
dass die SPI ein Problem hat! Das ist nicht unterscheidbar auf dem LA.

Aber diesen Effekt habe ich jetzt auf 2 Boards nachvollzogen, die sind 
nagelneu.

Montag werde ich in der Firma erstmal alle Chips runter-heisslöten, die 
ich eh nicht brauche, den Audio DAC, Gyro und Mikrofon usw.

PS: Es läuft immer noch, 1090 Datensätze fehlerfrei vom Arduino zum 
STM32. Toi, toi, toi... ich wünschte Merkel hätte auch solch lösbaren 
Probleme grins

von Jojo S. (Gast)


Lesenswert?

Ich habe zum Ausgleich erstmal Rammstein live Amerika reingeworfen. 
Hilft auch :-)

von Christian J. (Gast)


Lesenswert?

Jojo S. schrieb:

> Ich habe zum Ausgleich erstmal Rammstein live Amerika reingeworfen.
> Hilft auch :-)

https://www.youtube.com/watch?v=e-f9ulkmdcA
https://www.youtube.com/watch?v=OIZDwDZ2yM8

:-)

von Jojo S. (Gast)


Lesenswert?

Beides Top! Habe auch mal eine PN geschickt.

von Dr. Sommer (Gast)


Lesenswert?

Christian J. schrieb:
> Entweder habe ich das was übersehen und Port E hängt doch irgendwie mit
> der SPI 1 zusammen oder da bricht irgendwie die Spannung im Chip
> zusammen.

Hast du mal die I/O Compensation Cell versucht? Kannst du mal 
Oszillogramme (nicht LA!) von den SPI-Leitungen machen, mit PortE an vs. 
aus? Vielleicht sieht man einen Unterschied...

von Christian J. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Kannst du mal
> Oszillogramme (nicht LA!) von den SPI-Leitungen machen, mit PortE an vs.
> aus? Vielleicht sieht man einen Unterschied...

Mangels Oszi leider nicht. Muss mir mal wieder einen anschaffen.

Ich schalte auch gern den Flux-Kompensator ein, wenn Du mir sagst 
welches Register das ist...

Moment.... ist in stmF4xx_syscfg....

SYSCFG_CompensationCellCmd(ENABLE);      // Was auch immer das ist...

Port E wieder ein....Flashen.... Board ausschalten um Bits zu resetten 
.....starten..... gucken.....

Nö! Schmiert wieder ab. :-( Aber ich lass sie mal an, fürs gute Gefühl.

Vielleicht mal den Prescaler des APB2 runtersetzen? Der steht auf 1:1. 
Aber dann läuft alles langsamer, auch die SPI usw.

Das kann alles nicht sein, das müsste schon vorher 10.000 anderen 
aufgefallen sein. Vielleicht liegt es aber eben auch am Disco Board.

von Dr. Sommer (Gast)


Lesenswert?

Christian J. schrieb:
> Vielleicht mal den Prescaler des APB2 runtersetzen? Der steht auf 1:1.
> Aber dann läuft alles langsamer, auch die SPI usw.

Ja, das ist falsch. Der APB2 darf auf maximal 84MHz laufen (siehe S. 77 
im Datasheet), und wenn du den Prozessorkern auf seinem Maximum von 168 
MHz betreibst muss der Prescaler also mindestens 2 sein. Um SPI schnell 
genug zu machen, musst du ja nur den SPI-Prescaler wieder erhöhen, denn 
ich bezweifle dass du SPI gerade beim jetzigen Maximum von 168 MHz 
betreibst.

von Tomas (Gast)


Lesenswert?

Versteh gar nicht wo das Problem liegt. Mit einem Arduino und den 
kleinen Transmittern gabs hier noch nie Probleme. Die lib ist wohl recht 
gut

von Dr. Sommer (Gast)


Lesenswert?

Tomas schrieb:
> Versteh gar nicht wo das Problem liegt.
Wir auch nicht. Daher wird hier Fehlersuche betrieben.

von Christian J. (Gast)


Lesenswert?

Tomas schrieb:
> Versteh gar nicht wo das Problem liegt. Mit einem Arduino und den
> kleinen Transmittern gabs hier noch nie Probleme.

Die Arduinos laufen auch nicht mit 168 Mhz, haben 8 Busse mit zig 
Vorteilern! Und wie ich jetzt weiss liegt das Problem auch eher am 
Cortex 4 und nicht an dem Modul. Bzw. vermute ich das. Kann natürlich 
sein, dass die Funken eine zu starke Pin-Last sind usw. usw.

In der Radio Head Lib ist jedenfalls ein Fehler, den habe ich schon 
gesehen. CSN wird nicht Low gesetzt vor dem Lesen. Dass es trotzdem 
klappt ok, ist aber nicht wie im Datenbuch.

Kann jedenfalls jeder nachvollziehen: Disco Board, 7 Female Stecker, 1 
NRF Modul und meine Test-Software.

Nacht!

von Christian J. (Gast)


Lesenswert?

PS:

Problem ist gelöst, Port E ist auch wieder dabei!

.... mit einem Drehmel :-)

Gruss,
Christian

von Adib (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Christian,

ich weiss jetzt, su arbeitest mit dem STM32F4.
Schau dir doch bitte mal das CubeMx an.
Es gibt da einen Konfigurator für die Clocks.
Es sagt ja keiner, dass du das Ding nehmen musst. Es reicht ja schon, 
aus dem generierten Code die Parameter rauszuklauen ....
Anbei mal ein Screenshot von einer F1-Konfiguration.
Die Dinger mit 1000 Optionen haben leider auch 999 Möglichkeiten, was 
falsch zu konfigurieren.

Ich habe auch irgendwie das Gefühl, du bleibst immer die fehlerursache 
und deren Lösung schuldig.

Was genau hast du denn gedrehmelt ... ?

Grüße, Adib.

von Christian J. (Gast)


Lesenswert?

Adib schrieb:

> ich weiss jetzt, su arbeitest mit dem STM32F4.
> Schau dir doch bitte mal das CubeMx an.
> Es gibt da einen Konfigurator für die Clocks

Ich lads grad runter. Habe auch so eine Excel Tabelle aber letzlich 
stell ich die einmal ein und dann nie wieder. Vollgas und gut ist es.

Naja, mal auf die Uhr geschaut meiner letzten Beiträge? Über die viele 
Frickelei mit dem Disco Board und immer mehr dran bauen habe ich 
übersehen, dass das Ding oben drauf auch ne Menge Gemüse hat. Und die 
SPI1 ist über ihre I2C Funktion an den Gyrosensor angetackert. Naja, und 
der scheint sich wohl zwischendurch mal "gemeldet" zu haben :-( Das tut 
er jetzt nicht mehr, da ich den bis aufs Board runter gedrehmelt habe. 
Montag in der Firma lasse ich auch die anderen Boards alle ent-IC'en, da 
ich das Zeug da drauf eh nicht brauche, wie Audio DAC usw. Das stört nur 
die anderen Pins. Habe mir auch die SPI verhundelt durch Änderung der 
Taktgeschwindigkeiten der Pins und dann lief nichts mehr. 
Glücklicherweise habe ich einen kleinen Server, der alle Stunde ein 
Backuip zieht, eines zurückgezogen grad wo noch alles lief und dann die 
Änderungen wieder eingebaut. Man muss echt jeden Schritt testen, sost 
geht nachher gar nichts mehr und man weiss nicht welche Schraube man 
zurückdrehen muss.

So, Download ist fertig...

von Jojo S. (Gast)


Lesenswert?

Christian J. schrieb:
> Über die viele
> Frickelei mit dem Disco Board und immer mehr dran bauen habe ich
> übersehen, dass das Ding oben drauf auch ne Menge Gemüse hat.

Darum verstaubt das Disco Board auch bei mir im Regal. Mit dem Zeug 
drauf kann man ein bisschen programmieren üben oder verschiedene Libs 
austesten, aber um es irgendwo sinnvoll einzusetzen taugt es nicht. Ist 
viel zu gross für einfache Steueraufgaben, da finde ich die einfachen 
Breakout Boards viel praktischer. Interessant wäre das Disco F4 mit 
Ethernet, aber für den Phy war ST dann wohl doch zu geizig (ist auf den 
Nucleos auch nicht zu finden, oder?).
Richtig geil ist dafür das STM32F469 mit Chrome-ART Beschleuniger und 
einem guten Display. Das ist schon eine Steuerzentrale, Grafik wie ein 
Handy und dazu Steuermöglichkeiten eines µC. Für die Grafik wird da 
TouchGFX verwendet, da habe ich aber noch keinen Einstieg gefunden. Es 
gibt zwar auch eine Eval Version, aber in der Runtime tauchen dann immer 
TouchGFX Einblendungen auf. Eine Vollversion ist für Hobby leider zu 
teuer.
Sorry wenn Off Topic aber das wollte ich mal sagen.

von Adib (Gast)


Lesenswert?

Hallo Christian,

wo hast du das denn gelernt?
1
/* Extrahierter Inhalt des Status Registers */
2
typedef struct {
3
    _Bool    rx_dr;         // Data Ready RX Fifo Interrupt
4
    _Bool    tx_ds;         // Data Sent FIFO Interrupt
5
    _Bool    max_rt;        // Maximum Numer of Retransmits reached
6
    _Bool    tx_full;       // TX FIFO Full flag
7
    uint8_t  rx_p_no;       // Data pipe for paypload avalable for reading (0..5)
8
} status_t;

besser Bitfelder benutzen:
1
typedef struct {
2
    unsigned int    rx_dr: 1;         // Data Ready RX Fifo Interrupt
3
    unsigned int    tx_ds: 1;         // Data Sent FIFO Interrupt
4
    unsigned int    max_rt: 1;        // Maximum Numer of Retransmits reached
5
    unsigned int    tx_full: 1;       // TX FIFO Full flag
6
    unsigned int  rx_p_no: 4;       // Data pipe for paypload avalable for reading (0..5)
7
} status_t;

wie empfängst du denn Daten im STM32 mit dem 24l01?
Ic hhabe nur die SendPayload Methode gesehen.

Grüße, Adib.

von Christian J. (Gast)


Lesenswert?

Adib schrieb:
> besser Bitfelder benutzen:

Nein. Man benutzt die Datentypen, die der Compiler vorgibt und das ist 
Bool.
Bei 192kb ist es völlig wumpe wieviel Platz ein Flag einnimmt und der 
Stm32 kann außer Bitbanding keine Einzelbits ansprechen. Bitbanding wird 
aber natürlich nicht automatisch erzeugt.

Alles schon so in Ordnung.... das bleibt so.

von Christian J. (Gast)


Lesenswert?

Adib schrieb:
> wie empfängst du denn Daten im STM32 mit dem 24l01?
> Ic hhabe nur die SendPayload Methode gesehen.

Per Interrupt natürlich. Das klappt alles bestens jetzt, wunderbar. Duie 
Bits fliegen nur so durch die Wohnung, man muss sich fast ducken um 
nicht getroffen zu werden :-)

von Adib (Gast)


Lesenswert?

Was war denn jetzt genau das Problem?
Wie sieht deine Lösung aus?

Grüße, Adib.
--

von Nobody (Gast)


Lesenswert?

Adib schrieb:
> Wie sieht deine Lösung aus?
Statt den CS Pin des Gyros auf High zu ziehen, lieber das Dingen mit dem 
Dremel töten.
;-) (sorry) ;-)

von Jojo S. (Gast)


Lesenswert?

Der Dremel ist die Hardware Lösung, aber bevor du deine anderen Boards 
schredderst: Laut Doku ist der MEMS Sesnor ja mit CS an Port E3. Wenn 
der nicht initialisiert ist floated der vor sich hin und wird sporadisch 
die Störungen verursacht haben.
Die SW Lösung wäre demnach Port E zu initialisieren und E3 auf 0 zu 
setzen.

von Christian J. (Gast)


Lesenswert?

Nobody schrieb:

> Statt den CS Pin des Gyros auf High zu ziehen, lieber das Dingen mit dem
> Dremel töten.
> ;-) (sorry) ;-)

Ich habe die anderen Boards bei uns mit Profi Equipment auslöten lassen. 
Alles runter was im Wege ist. Da alle Pins direkt mit den Außenpins 
verbunden sind kann man da grossflächig "abernten" bzw "runterschaben". 
Schön mit Bildschirm Mikroskop Lupe alles geprüft auf Kurzschlüsse. Die 
Module spielen einwandfrei, seit 2 Tagen. Der Außensensor funkt alles 
durch, Luftdruck, Feuchte, Temperatur, Regensensor, Batteriespannung 
usw.

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.