Forum: Mikrocontroller und Digitale Elektronik SPI Display mit PIC32


von Mia sain mia (Gast)


Lesenswert?

Hallo,

ich habe das folgende Display:

http://www.buydisplay.com/default/tft-5-inch-lcd-display-module-w-controller-board-serial-i2c-ra8875

per 4-wire SPI (SDI1, SDO1, CS u. SCK) und eine gesonderte RESET Leitung 
erfolgreich per Starterkit und Expansion Board angesteuert.

Das Starterkit ist mit dem PIC32MX795F512L bestückt.

Funktioniert alles tadellos.

Ich habe mir eine eigene Platine fertigen lassen, ebenfalls mit dem 
PIC32MX795F512L und einen SPI Header (1: CS; 2: RESET; 3: SDI; 4: SDO 
und 5: SCK). SCK, SDI und SDO sind definitiv an den richtigen PINs des 
PIC32 und auch RESET und CS sind an denselben Pins wie auf dem 
Starterkit. Zusätzlich habe ich an RESET einen 10K Pull Up und an CS 
einen 10K Pull Up angebracht.

Das Display schließe ich jetzt genauso an wie ehemals an dem Starterkit. 
Die Fehlerquelle sollte also hier gering bis ausgeschlossen sein.
Spi Leitungen auf der Platine sind auch sehr kurz gehalten.

Problem ist dass dasselbe Programm welche auf dem Starterkit 1A läuft 
bei der eigenen Platine nicht mal das Display richtig initialisiert.
Ich habe die Pull UPs an RESET und CS runtergelötet, SDI und SDO 
vertauscht usw, alles ohne Erfolg.

Wie gesagt ist ein Software Fehler auszuschließen, da dasselbe Programm 
bei selben Leitungen, selbiger Verdrahtung, selber MCU usw. tadellos 
läuft.

Wenn ich die Config Bits des PICs ändere initialisert sich das Display 
zumindest. Trotzdem funktionieren alle weitere Funktionen nicht.

Normal müßte dasselbe Programm 1 zu 1 vom Starterkit auf die Platine 
portierbar sein.

Jemand Ideen welche Fehlerquellen in Frage kommen könnten?

Vielen Dank!

von Erdverbundener (Gast)


Lesenswert?

Mia sain mia schrieb:
> SPI Header (1: CS; 2: RESET; 3: SDI; 4: SDO
> und 5: SCK). SCK, SDI und SDO sind definitiv an den richtigen PINs des
> PIC32 und auch RESET und CS sind an denselben Pins wie auf dem
> Starterkit.

Und was ist mit GND?

von Mia sain mia (Gast)


Lesenswert?

Erdverbundener schrieb:
> Mia sain mia schrieb:
>> SPI Header (1: CS; 2: RESET; 3: SDI; 4: SDO
>> und 5: SCK). SCK, SDI und SDO sind definitiv an den richtigen PINs des
>> PIC32 und auch RESET und CS sind an denselben Pins wie auf dem
>> Starterkit.
>
> Und was ist mit GND?

GND und VCC natürlich auch :)

von Arc N. (arc)


Lesenswert?

Dasselbe Programm oder nur dieselben Routinen zum Ansteuern des 
Displays?
Sind die Analogfunktionen der Pins, die für SPI verwendet werden, in 
AD1PCFG ausgeschaltet (Bit = 1, Default nach Reset ist 0 d.h. analog)?

: Bearbeitet durch User
von Mia sain mia (Gast)


Lesenswert?

Arc N. schrieb:
> Dasselbe Programm oder nur dieselben Routinen zum Ansteuern des
> Displays?
> Sind die Analogfunktionen der Pins, die für SPI verwendet werden, in
> AD1PCFG ausgeschaltet (Bit = 1, Default nach Reset ist 0 d.h. analog)?

ich hab per Default mal alle Pins auf digital gestellt.

AD1PCFG = 0xFFFF;   // Pins to digital

Wie gesagt funktioniert dies ja auch auf dem Starterkit ohne diese 
Einstellung, aber danke für den Einwand!

Ich habe das Gefühl, dass es was mit den Config Bits zu tun haben muss, 
obwohl es mir trotzdem unerklärlich ist, da es sich wie gesagt um ein 
und denselben MCU handelt.

von morph1 (Gast)


Lesenswert?

Anderer Quarz? Rennt der PIC vl durch unpassende Config-Bits auf dem 
internen Quarz (typischer Fallback)?

Wenn der Takt zu hoch oder das Timing fürs Display unpassend ist, dann 
kann das die Effekte schon erklären.

von morph1 (Gast)


Lesenswert?

Meinte den internen RC-Oszillator (FRC)

von Mia sain mia (Gast)


Lesenswert?

hier mal die CONGIF Bits:
1
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
2
3
#pragma config FNOSC = PRIPLL
4
5
// XT osc mode
6
7
#pragma config POSCMOD = XT
8
9
// PLL Input Divider: 1 2 3 4 5 6 10 12
10
11
12
#pragma config FPLLIDIV = DIV_2
13
14
// PLL Multiplier: 15 16 17 18 19 20 21 24
15
16
17
#pragma config FPLLMUL = MUL_20
18
19
20
// System PLL Output Clock Divider: 1 2 4 8 16 32 64 256
21
22
23
#pragma config FPLLODIV = DIV_1
24
25
// Peripheral Clock Divisor: Pb_Clk = Sys_Clk / DIV_1, DIV_2, DIV_4, DIV_8
26
27
#pragma config FPBDIV = DIV_8
28
29
30
// Secondary Oscillator Enable: ON OFF
31
32
#pragma config FSOSCEN = OFF
33
34
// Internal/External Switch Over: ON OFF
35
36
#pragma config IESO = OFF
37
38
// Clock Switch Disable, FSCM Disabled
39
40
#pragma config FCKSM = CSDCMD
41
42
// CLKO Output Signal Active on the OSCO Pin: ON OFF
43
44
#pragma config OSCIOFNC = OFF
45
46
47
// Watchdog Timer Enable: ON, OFF (WDT Disabled (SWDTEN Bit Controls))
48
49
50
51
#pragma config FWDTEN = OFF
52
53
54
55
// Watchdog Timer Postscaler: 1:1, 1:2, 1:4, ... 1:65536, 1:1048576
56
57
58
59
#pragma config WDTPS = PS1024
60
61
// Code Protect: ON, OFF
62
63
#pragma config CP = OFF
64
65
66
67
// Boot Flash Write Protect bit: ON, OFF
68
69
#pragma config BWP = OFF
70
71
72
73
// Program Flash Write Protect: PWP512K, PWP508K, ... PWP504K, OFF
74
75
#pragma config PWP = OFF
76
77
#pragma config DEBUG = OFF

so funktioniert es alles auf dem Starterkit einwandfrei mit Primary OSC 
und selben Takt.

Ich muss gestehen, dass ich jetzt nicht jede Zeile der Config Bits 
erklären kann, aber es wird ja kein secondary Oscillator auf dem 
Starterkit genutzt den ich auf der Platine nicht habe.

von morph1 (Gast)


Lesenswert?

Der Config nach würde das einen externen Quarz mit 8MHz voraussetzen und 
einen internen Takt von 80MHz ergeben (wenn ich mich grad nicht 
verrechnet habe).

Hast du einen externen 8MHz Quarz dran?

von Mia sain mia (Gast)


Lesenswert?

morph1 schrieb:
> Der Config nach würde das einen externen Quarz mit 8MHz
> voraussetzen und
> einen internen Takt von 80MHz ergeben (wenn ich mich grad nicht
> verrechnet habe).
>
> Hast du einen externen 8MHz Quarz dran?

Vielen Dank, ich glaube die "Spur" ist die Richtige.
Vorweg, ich habe keinen 8 Mhz angeschlossen, ich lese aus den CONFIG 
Bits aber auch nicht heraus, warum dies der Fall sein sollte.

Habe mir gerade das Reference Manual für Oscillator durchgelesen und 
versucht meine Config Bits einmal zu entschlüsseln, mit folgenden 
Ergebnis:
1
#pragma config FNOSC = PRIPLL // Oscillator Selection Bits -> Primary Oscillator
2
#pragma config POSCMOD = XT   // Primary Oscillator -> Resonator, crystal or resonator
3
#pragma config FPLLIDIV = DIV_2   // PLL Input Divider = 2
4
#pragma config FPLLMUL = MUL_20   // PLL Multiplier = 20
5
#pragma config FPLLODIV = DIV_1   // System PLL Output Clock Divider
6
#pragma config FPBDIV = DIV_8     // Peripheral Clock Divider; Pb_Clk SystemClock/8
7
#pragma config FSOSCEN = OFF      // Secondaray Osc disabled
8
#pragma config FCKSM = CSDCMD
9
#pragma config OSCIOFNC = OFF
10
#pragma config FWDTEN = OFF
11
#pragma config WDTPS = PS1024
12
#pragma config CP = OFF
13
#pragma config BWP = OFF
14
#pragma config PWP = OFF
15
#pragma config DEBUG = OFF

Wo genau steht hier etwas von externen Quarz?
Ich habe doch nur den internen Primary Oscillator ausgewählt?
Wie genau bekomme ich mein System ohne externen 8 mhz Quarz zum laufen? 
Wie müßten die Config Bits dann aussehen.
Wie hast du die 80 Mhz Systemtakt errechnet?

Es stimmt schon, dass meines Wissens auf dem Starterkit ein externer 8 
Mhz Quarz drauf ist. Ich kann dies nur noch nicht mit den Config Bits in 
Zusammenhang bringen, da ich gerade erst anfange mich mit PIC32 zu 
beschäftigen.

Vielen Dank an Morph für die Hilfe!

von Mia sain mia (Gast)


Lesenswert?

Ich habe es jetzt mal mit dem internen Fast RC Ozillator with PLL 
versucht und den Systemtakt auf 80 MHz versucht einzustellen:
1
#pragma config FPLLIDIV = DIV_2
2
#pragma config FPLLMUL  = MUL_20
3
#pragma config FPLLODIV = DIV_1
4
#pragma config FWDTEN   = OFF
5
#pragma config POSCMOD  = OFF
6
#pragma config FNOSC    = FRCPLL
7
#pragma config FPBDIV   = DIV_1
8
#pragma config FCKSM    = CSECME

Leider bekommen ich jetzt gar keine Ausgabe.

Ich fasse nochmal zusammen:
1. Starterkit mit 8 Mhz externer Quarz funktioniert
2. eigene Platine mit selbigen MCU ohne externen 8 Mhz Quarz 
funktioniert nicht. Wie muss ich die Config Bits genau setzen, damit das 
alles wieder reibungslos funktioniert?

von Peter C. (peter_c49)


Lesenswert?

Hallo,

auf deinem starterkit hast du:
#pragma config FPBDIV = DIV_8 !!!

jetzt auf dem bastelboard:
#pragma config FPBDIV   = DIV_1

du weisst schon was das macht?
vorher CPU = 80Mhz PBus = 10Mhz (dein starterkit)
jetzt  CPU = 80Mhz PBus = 80Mhz (bastelboard ohne quarz)

so, jetzt weiss aber niemand wie du delays etc erzeugst (timer?).
oder von welchem takt dein SPI modul lebt, also ohne code zeigen, dauert 
mir das zu lange.

Ach, immer ALLE config wörter zeigen, sonst kann dir nur schwer geholfen 
werden.
Also alle pragmas für DEVCFG0 - DEVCFG3.

ps: ich mache IMMER zuerst ein blinky, mit sw delay, dann erwetern mit 
timer usw,
um ein "neues" board zu prüfen und welcher takt denn wirklich wo am 
werkeln ist.

mfG
Peter

von morph1 (Gast)


Lesenswert?

Mia sain mia schrieb:
> Vorweg, ich habe keinen 8 Mhz angeschlossen, ich lese aus den CONFIG
> Bits aber auch nicht heraus, warum dies der Fall sein sollte.

Wegen des Aufbau des Oszillators im PIC :)
Beim Eingangsteiler von 2 muss der Quarz 8Mhz haben, weil das PLL-Modul 
nur 4MHz akzeptiert.

Ich würde mir das Kapitel mal genauer ansehen. Wie der Vorposter schon 
schrieb, du hast 80MHz Peripheral-Clock, dein Starterkit nur 10.

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.