iLI9163B Ansteuerung mit SPI

OP #4417367
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
Gast #4418757
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
OP #4420729
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.
#4420747
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
OP #4420780
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...
#4420802
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
OP #4423730
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

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