Forum: Mikrocontroller und Digitale Elektronik iLI9163B Ansteuerung mit SPI


von TM F. (p_richner)


Lesenswert?

Hallo zusammen

Ich habe einen Attiny48, mit dem ich ein iLI9163B-Display-Controller 
ansteuern möchte über Softspi.

Die Verbindung läuft über zwei Leitungen SPI_CLK und SPI_DATA. CSX ist 
konstant auf Masse verbunden.

Mein Problem: Ich kann keinen Punkt auf dem Display anzeigen lassen, 
obwohl laut LogicAnalyser die Datenpaket sauber übertragen werden. Hat 
jemand eine Vermutung, woran dies liegen könnte?

Informationen fand ich hier:
https://github.com/noccy80/mspdev/blob/master/lib430/src/liblcd/ili9163.c
https://github.com/noccy80/mspdev/blob/master/lib430/src/liblcd/ili9163.h

Code:
1
#define SPI_CLK                 PB5
2
#define SPI_DATA                PB3
3
4
#define SPI_CLK_LOW()           (PORTB &= ~(1<<PB5))
5
#define SPI_CLK_HIGH()          (PORTB |= (1<<PB5))
6
7
#define SPI_DATA_LOW()          (PORTB &= ~(1<<PB3))
8
#define SPI_DATA_HIGH()         (PORTB |= (1<<PB3))
9
10
void display_plot(uint8_t x, uint8_t y)
11
{
12
    // Set the x-axis area
13
    softspi_command(SET_COLUMN_ADDRESS);
14
    softspi_parameter(0x00);
15
    softspi_parameter(x);
16
    softspi_parameter(0x00);
17
    softspi_parameter(0x7F);
18
19
    // Set the y-axis area
20
    softspi_command(SET_PAGE_ADDRESS);
21
    softspi_parameter(0x00);
22
    softspi_parameter(y);
23
    softspi_parameter(0x00);
24
    softspi_parameter(0x7F);
25
26
    // Plot the point
27
    softspi_command(WRITE_MEMORY_START);
28
    softspi_parameter(100);
29
    softspi_parameter(50);
30
}
31
32
void display_init(void)
33
{
34
    // Exit sleep mode, after this it needs a timeout to stabilize the circuit
35
    loop_ms(7);
36
    softspi_command(EXIT_SLEEP_MODE);
37
    loop_ms(7);
38
39
    softspi_command(SET_PIXEL_FORMAT);
40
    softspi_parameter(0x05);
41
42
    softspi_command(SET_GAMMA_CURVE);
43
    softspi_parameter(0x04);
44
45
    softspi_command(GAM_R_SEL);
46
    softspi_parameter(0x01);
47
48
    // Set the x-axis area
49
    softspi_command(SET_COLUMN_ADDRESS);
50
    softspi_parameter(0x00);
51
    softspi_parameter(0x00);
52
    softspi_parameter(0x00);
53
    softspi_parameter(0x7F);
54
55
    // Set the y-axis area
56
    softspi_command(SET_PAGE_ADDRESS);
57
    softspi_parameter(0x00);
58
    softspi_parameter(0x00);
59
    softspi_parameter(0x00);
60
    softspi_parameter(0x7F);
61
62
    // Select display orientation
63
    softspi_command(SET_ADDRESS_MODE);
64
    softspi_parameter(0x00);
65
66
    // Enable the display
67
    softspi_command(SET_DISPLAY_ON);
68
    softspi_command(WRITE_MEMORY_START);
69
}
70
71
void softspi_command(uint16_t data)
72
{
73
    DDRB |= (1<<SPI_DATA);
74
    unsigned int i=0;
75
76
    // clear the D/CX bit, so that the controller take the byte as command byte
77
    data &= ~(1<<8);
78
79
  for (i=9;i>0;i--)
80
    {
81
82
        SPI_CLK_LOW(); //clock low
83
84
        if (data  & 0x100) /* Wenn MSB-Bit gesetzt     */
85
        {
86
            SPI_DATA_HIGH();      /* Data-Pin auf 1 schalten, */
87
        }
88
        else
89
        {
90
            SPI_DATA_LOW();      /* ansonsten auf 0          */
91
        }
92
        data = data << 1;
93
94
        SPI_CLK_HIGH(); //Clock bit rising edge
95
    }
96
97
  SPI_CLK_LOW(); //CS high, übertragung beendet
98
}
99
100
101
void softspi_parameter(uint16_t data)
102
{
103
    uint8_t counter=0;
104
    DDRB |= (1<<SPI_DATA);
105
    // Set the D/CX bit so that the controller use the byte as parameter
106
    data |= (1<<8);
107
108
  for (counter=9;counter>0;counter--)
109
    {
110
111
        SPI_CLK_LOW(); //clock low
112
113
        if (data  & 0x100) /* If MSB-Bit set     */
114
        {
115
            SPI_DATA_HIGH();      /* Data-Pin on 1  */
116
        }
117
        else
118
        {
119
            SPI_DATA_LOW();      /* else 0          */
120
        }
121
        data = data << 1;
122
123
        SPI_CLK_HIGH(); //Clock bit rising edge
124
    }
125
126
  SPI_CLK_LOW(); //CS high, transmission finished
127
}
128
129
int main(void)
130
{
131
    display_init();
132
    while(1)
133
    {
134
       display_plot(x,y);
135
    }
136
137
138
}
MfG

von Jan (Gast)


Lesenswert?

TM F. schrieb:
> Die Verbindung läuft über zwei Leitungen SPI_CLK und SPI_DATA. CSX ist
> konstant auf Masse verbunden.

Im Datenblatt (Seite 9) fällt mir als erstes bei der Liste mit den 
Pinbeschriebungen folgendes ins Auge:
1
CSX - This pin can be permanently fixed “Low” in MCU interface mode only.

Im Abschnitt 6.2. Serial Interface, Seite 21 ist ausdrücklich CSX 
erwähnt.
Dort steht auch folgendes:
1
A falling edge on 
2
CSX enables the serial interface and indicated the start of data transmission.

Es sieht alles danach aus, das der Controller auf CSX unbedingt 
Flankenwechsel braucht. In dem von Dir verlinkten Code wird übrigens CSX 
auch verwendet.

Jan

von grundschüler (Gast)


Lesenswert?

ist der reset-pin angeschlossen?

von TM F. (p_richner)


Lesenswert?

grundschüler schrieb:
> ist der reset-pin angeschlossen?

Ja ist er. Mit Pull-up auf Vcc.

Jan schrieb:
> Es sieht alles danach aus, das der Controller auf CSX unbedingt
> Flankenwechsel braucht. In dem von Dir verlinkten Code wird übrigens CSX
> auch verwendet.

Warum wird dann in der Pin-Beschreibung beschrieben, dass CSX permanent 
auf "low" gehängt werden kann?

Eine Möglichkeit wäre noch ein Timing-Problem. Manchmal kommt es vor, 
dass der Treiber auch auf Ausgang steht und dann der uC und der Treiber 
gegeneinander treiben und dies eine komische Signalform gibt. Danach 
hilft nur ein Reset oder eine Neuprogrammierung.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

TM F. schrieb:

>> Es sieht alles danach aus, das der Controller auf CSX unbedingt
>> Flankenwechsel braucht. In dem von Dir verlinkten Code wird übrigens CSX
>> auch verwendet.
>
> Warum wird dann in der Pin-Beschreibung beschrieben, dass CSX permanent
> auf "low" gehängt werden kann?

nur in den MCU modi, d.h. bei paralleler Ansteuerung, nicht aber bei 
serieller Ansteuerung. Da wird CSX zwingend gebraucht.

fchk

von grundschüler (Gast)


Lesenswert?

TM F. schrieb:
> Ja ist er. Mit Pull-up auf Vcc


Bei meinen spi-ilis gehört der reset zur Initialisierung und muss 
deswegen zumindest mit dem mcu-reset verbunden werden.

von TM F. (p_richner)


Lesenswert?

grundschüler schrieb:
> Bei meinen spi-ilis gehört der reset zur Initialisierung und muss
> deswegen zumindest mit dem mcu-reset verbunden werden.

das ist er auch. Die sind zusmmen verbunden, mit einem Pull-up auf Vcc

Frank K. schrieb:
> nur in den MCU modi, d.h. bei paralleler Ansteuerung, nicht aber bei
> serieller Ansteuerung. Da wird CSX zwingend gebraucht.

Dann habe ich ein Problem, weil der CSX-Pin ist per Ground-Plane auf 
Masse verbunden. Das heisst, das ich die Plane um den Pin aufschneiden 
muss, sofern es keine andere Lösung gibt...

von Frank K. (fchk)


Lesenswert?

TM F. schrieb:

> Frank K. schrieb:
>> nur in den MCU modi, d.h. bei paralleler Ansteuerung, nicht aber bei
>> serieller Ansteuerung. Da wird CSX zwingend gebraucht.
>
> Dann habe ich ein Problem, weil der CSX-Pin ist per Ground-Plane auf
> Masse verbunden. Das heisst, das ich die Plane um den Pin aufschneiden
> muss, sofern es keine andere Lösung gibt...

Genau das wirst Du machen müssen.

fchk

von TM F. (p_richner)


Angehängte Dateien:

Lesenswert?

Hier noch einen Ausschnitt vom Schema des Controllers.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Jetzt weißt Du, wofür 0Ω-Widerstände gut sind.

fchk

von TM F. (p_richner)


Lesenswert?

Ich habe den CSX-Pin jetzt auf den uC verbunden.

Muss ich jedes mal laut Datenblatt eine steigende Flanke am CSX-Pin 
setzen, wenn ich ein Display-Command senden will? Oder CSX nur einmal 
auf High für die Initialisierung des Displays und danach auf Low während 
der ganzen Kommunikation??

Datenblatt ab Seite 20:
http://www.rockbox.org/wiki/pub/Main/SonyNWZE370/ILI9163.pdf

Danke für Hilfen
MfG

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

!CS low
Kommando plus zugehörige Daten
!CS high

fchk

von TM F. (p_richner)


Lesenswert?

Danke

Es funktioniert jetzt, ich kann auf das Display schreiben.

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.