Hallo,
ich habe immer wieder dasselbe Problem.
Ich nutze ein 240x120 Pixel Display mit dem folgenden Displaycontroller:
http://www.orientdisplay.com/pdf/UC1608.pdf
Ich steuere das Display via 4 wire SPI an und via Ansteuerung auf dem
Starterkit funktioniert wiederum alles tadellos.
Das Starterkit ist mit einem PIC32MX795F512L bestückt.
Auf meiner eigenen Platine sieht das ganze wie folgt aus:
- PIC32MX795F512L
Config Bits:
1 | #pragma config FNOSC = FRCPLL // Oscillator Selection Bit -> Fast RC Osc with PLL
|
2 | #pragma config POSCMOD = OFF // Primary Oscillator disabled
|
3 | #pragma config FPLLIDIV = DIV_2 // PLL Input Divider
|
4 | #pragma config FPLLMUL = MUL_20 // PLL Multiplier
|
5 | #pragma config FPLLODIV = DIV_1 // System PLL Output Clock
|
6 | #pragma config FWDTEN = OFF // Watchdog Timer Disable
|
7 | #pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor
|
8 | #pragma config FSOSCEN = OFF // Secondaray Osc disabled
|
9 | //******************************************
|
10 | #pragma config IESO = OFF
|
11 | #pragma config FCKSM = CSDCMD
|
12 | #pragma config OSCIOFNC = OFF
|
13 | #pragma config WDTPS = PS1024
|
14 |
|
15 | #pragma config CP = OFF
|
16 | #pragma config BWP = OFF
|
17 | #pragma config PWP = OFF
|
18 | #pragma config DEBUG = OFF
|
Der Systemtakt ist auf 10 MHz eingestellt:
Die SPI Init sieht folgendermaßen aus:
1 | void spi_init(void)
|
2 | {
|
3 | char dummy;
|
4 | SPI1CONbits.ON = 0; // disable SPI to reset any previous
|
5 | dummy = SPI1BUF; // clear receive buffer
|
6 | SPI1BRG = 0x01;
|
7 | SPI1CONbits.MSTEN = 1; // enable master mode
|
8 | SPI1CONbits.CKE = 1; // set clock-to-data timing 1:Serial output data changes on transition from active clock state to idle clock state (see CKP bit)
|
9 |
|
10 | SPI1CONbits.CKP = 1; // 1: 1 = Idle state for clock is a high level; active state is a low level
|
11 |
|
12 | SPI1CONbits.ON = 1; // turn SPI on
|
13 |
|
14 | }
|
Laut Datenblatt ergibt sich die SPI Clock aus:
1 | FSCK = FPB/[2*(SPI1BRG + 1)]
|
Für FPB = 10 MHZ und SPI1BRG = 1 ergibt sich dann 2,5 MHz SPI CLOCK.
Dies habe ich mit dem Oszi verifiziert, sieht eigentlich gut aus. Leider
funktioniert die komplette SPI Kommunikation nicht, d.h. das Display
zeigt nichts an (im Gegensatz zu dem Projekt auf dem Starterkit, auf dem
alles tadellos funktioniert).
In dem Datenblatt des Displaykontrollers finde ich keine Spezifikationen
in welchen Rahmen sich die SPI Clock befinden darf. ??
Hier nochmal der Code:
1 | #include <p32xxxx.h>
|
2 | #include <stdio.h>
|
3 | #include <stdlib.h>
|
4 | #include <plib.h>
|
5 |
|
6 | #include "delay.h"
|
7 | #include "SPI_test.h"
|
8 |
|
9 | // ... Config bits siehe oben
|
10 |
|
11 | int main() {
|
12 |
|
13 |
|
14 | ERC_CS_OUT; // Chipselext Ausgang
|
15 | ERC_RES_OUT; // Reset Ausgang
|
16 | ERC_CD_OUT; // CD Ausgang
|
17 |
|
18 | delay_millis(200);
|
19 | spi_init();
|
20 |
|
21 | delay_millis(1500);
|
22 | Initial();
|
23 | delay_millis(1500);
|
24 |
|
25 |
|
26 | Clear_Display();
|
27 |
|
28 |
|
29 | Set_Page_Address(5);
|
30 | Set_Column_Address(1);
|
31 |
|
32 | lettertodisplay('a');
|
33 | }
|