Display Chip_ST7789V sporadische Abstürze wenn SPI>10MHz

OP #7523058
Lesenswert?

Hallo, ich habe ein Display mit o.g. Chip per SPI an meine MCU PIC32MZ angeschlossen. MISO ist nicht angeschlossen, es kann also nur ins Display geschrieben werden. Wenn ich das Datenblatt richtig verstanden habe, kann der Chip maximal 15 MHz SPI Takt. Größere Datenmengen werden per DMA-SPI zum Display geschaufelt. Kleine Steuerbefehle via normal SPI.

Bei 10 MHz läuft alles sauber. Wenn ich 20 MHz SPI Frequenz oder größer einstelle, kommt es sporadisch nach Sekunden/Minuten zum Reset der MCU. Warum ist das so ? Ich hätte erwartet, dass das Display eben nicht mehr funktioniert, aber warum schmiert die MCU ab ? Es kommen ja keine Daten vom Display zurück, die falsch sein könnten.

#7523087
Lesenswert?

Dirk F. schrieb:

Ich hätte erwartet, dass das Display eben nicht mehr funktioniert, aber warum schmiert die MCU ab ?

Eine CPU schmiert nicht einfach so ab. Sie führt eine Exception oder ein Reset aus. Der Grund läßt sich dann in den entsprechenden Registern auslesen. Am einfachsten setzt man dazu entsprechende Breakpoints und läßt sich die Register im Debugger anzeigen.

OP #7523091
Lesenswert?

Peter D. schrieb:

Eine CPU schmiert nicht einfach so ab. Sie führt eine Exception oder ein Reset aus. Der Grund läßt sich dann in den entsprechenden Registern auslesen. Am einfachsten setzt man dazu entsprechende Breakpoints und läßt sich die Register im Debugger anzeigen.

Er zeigt nach dem Reset 7 an:

1
//... perform application specific startup tasks
2
// next, check the cause of the Reset
3
debug[4] = 1;
4
    
5
if(RCON & 0x0003)
6
 {
7
// execute a Power-on Reset handler
8
   debug[4] = 2;
9
 }
10
 if(RCON & 0x0002)
11
 {
12
// execute a Brown-out Reset handler
13
    debug[4] = 3;
14
 }
15
if(RCON & 0x0080)
16
 {
17
// execute a Master Clear Reset handler
18
    debug[4] = 4;
19
 }
20
 if(RCON & 0x0040)
21
 {
22
 // execute a Software Reset handler
23
    debug[4] = 5;
24
 }
25
 if (RCON & 0x0200)
26
 {
27
// execute a Configuration Mismatch Reset handler
28
   debug[4] = 6;
29
 }
30
 if (RCON & 0x0010)
31
 {
32
// execute Watchdog Time-out Reset handler
33
    debug[4] = 7;
34
 }
#7523101
Lesenswert?

Dirk F. schrieb:

Aber warum geht es bei 10 MHz ?

Irgendwas ist zu schnell fertig und Du machst irgendwas zu spät. Oftmals ist ein Fehler in der Reihenfolge von Zugriffen die Ursache.

Du kannst ein Timeout aufsetzen, das kürzer als der Watchdog ist und mit dem Watchdog rücksetzen. Im Timerinterupt gibst Du dann die Adresse auf dem Stack aus, d.h. die von ihm unterbrochen wurde.

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