Forum: Mikrocontroller und Digitale Elektronik Pervasive 2" E-Paper Display Problem


von Sean G. (atmega318)


Lesenswert?

Hallo zusammen!
Ich habe folgendes Problem: Auf meiner Platine ist das display: 
http://www.digikey.com/scripts/DkSearch/dksus.dll?Detail&itemSeq=156907713&uq=635458639334129405 
und ein STM32F103.
Mit folgendem Code:
1
#include <stdio.h>
2
#include "stm32f10x_conf.h"
3
4
#define Breset BRR
5
#define Bset BSRR
6
7
#define EPD_PORT GPIOA
8
#define EPD_BUSY GPIO_Pin_2
9
#define EPD_RESET GPIO_Pin_3
10
#define EPD_CS GPIO_Pin_4
11
#define EPD_SCK GPIO_Pin_5
12
#define EPD_MISO GPIO_Pin_6
13
#define EPD_MOSI GPIO_Pin_7
14
15
#define EPD_BUSY_high EPD_PORT->Bset = EPD_BUSY;
16
#define EPD_BUSY_low EPD_PORT->Breset = EPD_BUSY;
17
#define EPD_RESET_high EPD_PORT->Bset = EPD_RESET;
18
#define EPD_RESET_low EPD_PORT->Breset = EPD_RESET;
19
#define EPD_CS_high EPD_PORT->Bset = EPD_CS;
20
#define EPD_CS_low EPD_PORT->Breset = EPD_CS;
21
#define EPD_SCK_high EPD_PORT->Bset = EPD_SCK;
22
#define EPD_SCK_low EPD_PORT->Breset = EPD_SCK;
23
#define EPD_MISO_high EPD_PORT->Bset = EPD_MISO;
24
#define EPD_MISO_low EPD_PORT->Breset = EPD_MISO;
25
#define EPD_MOSI_high EPD_PORT->Bset = EPD_MOSI;
26
#define EPD_MOSI_low EPD_PORT->Breset = EPD_MOSI;
27
28
void EPD_init()
29
{
30
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
31
    GPIO_InitTypeDef GPIO_InitStructure;
32
     
33
    GPIO_InitStructure.GPIO_Pin = EPD_RESET | EPD_CS | EPD_SCK | EPD_MOSI;
34
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
35
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
36
    GPIO_Init(EPD_PORT, &GPIO_InitStructure);
37
38
    GPIO_InitStructure.GPIO_Pin = EPD_MISO | EPD_BUSY;
39
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
40
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
41
    GPIO_Init(EPD_PORT, &GPIO_InitStructure);
42
}
43
44
uint8_t spi_8b(uint8_t data)
45
{
46
    uint8_t data2 = 0;
47
    for(int i = 0; i < 8; i++)
48
    {
49
        data2 = data2 << 1;
50
        if(data & 128)
51
        {
52
            EPD_MOSI_high
53
54
        }
55
        else
56
        {
57
            EPD_MOSI_low
58
59
        }
60
        EPD_SCK_high
61
62
63
        EPD_SCK_low
64
65
        if(GPIO_ReadInputDataBit(EPD_PORT, EPD_MISO))
66
        {
67
            data2 += 1;
68
        }
69
        data = data << 1;
70
    }
71
    EPD_MOSI_low
72
    return data2;
73
}
74
75
uint8_t spi_simple(uint8_t reg, uint8_t dat)
76
{
77
    EPD_CS_low
78
    spi_8b(reg);
79
    return spi_8b(dat);
80
    EPD_CS_high
81
}
82
83
84
85
86
void delay(void)
87
{
88
    for(volatile int i = 0; i < 1000000; i++);
89
}
90
91
92
int main(void)
93
{
94
    EPD_init();
95
96
    uint8_t init, breakage, dcdc;
97
98
    while(1)
99
    {
100
        EPD_CS_high
101
        delay();
102
        EPD_RESET_high
103
        delay();
104
        EPD_RESET_low
105
        delay();
106
        EPD_RESET_high
107
        delay();
108
        EPD_CS_low
109
        delay();
110
        init = spi_simple(0x71,0x00);
111
    }
112
}
bekomme ich aber immer 0x24 als ID! Laut Datenblatt kann die ID aber nur 
1 oder 2 sein?! Was mache ich falsch?

Wäre super, wenn da jemand weiter wüsste!
Besten Dank schonmal, Sean

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Guck dir dein SPI Timing mal auf einem Oszilloskop an.
Könnte mir vorstellen, dass

EPD_SCK_high
EPD_SCK_low

so schnell ist, dass da keine Vernünftige Kommunikation zustande kommt.
Im Zweifel ein ordentliches Delay einbauen:
1
    for(int i = 0; i < 8; i++)
2
    {
3
        data2 = data2 << 1;
4
        if(data & 0x80)
5
            EPD_MOSI_high
6
        else
7
            EPD_MOSI_low
8
9
        clock_delay();
10
        EPD_SCK_high
11
12
        clock_delay();
13
        EPD_SCK_low
14
15
        if(GPIO_ReadInputDataBit(EPD_PORT, EPD_MISO))
16
            data2 |= 1;
17
18
        data = data << 1;
19
    }

von Easylife (Gast)


Lesenswert?

Ansonsten: es gibt 4 verschiedene SPI modes.
Dein Link zum E-Paper funktioniert nicht, also kann ich nicht 
beurteilen, ob der von dir implementierte Mode der richtige ist.

von Sean G. (atmega318)


Lesenswert?

Easylife schrieb:
> Ansonsten: es gibt 4 verschiedene SPI modes.
> Dein Link zum E-Paper funktioniert nicht, also kann ich nicht
> beurteilen, ob der von dir implementierte Mode der richtige ist.

komisch, hier direkt das Datenblatt: 
http://www.pervasivedisplays.com/LiteratureRetrieve.aspx?ID=207589&A=SearchResult&SearchID=7127875&ObjectID=207589&ObjectType=6

kann schon sein, dass ich da was übersehen hab, aber ich habe eigentlich 
genau deshalb soft-SPI genommen: weil ich die Signalform genau nachbauen 
kann.

Das mit dem Timing hab ich jetzt getestet, aber das SPI darf soviel ich 
weiss bis 20MHz gehen, und der STM läuft im Moment ohne PLL auf 8 MHz...

von easylife (Gast)


Lesenswert?

falsches datenblatt. da ist nichts zu spi zu finden (protocol, timing).

von Sean G. (atmega318)


Lesenswert?

easylife schrieb:
> falsches datenblatt. da ist nichts zu spi zu finden (protocol, timing).

hier sind alle: http://www.pervasivedisplays.com/products/2inch
hab das nur so gepostet, weil ich mir langsam nicht mal mehr sicher bin, 
ob ich die richtige SPI Spezifikation hatte...

von easylife (Gast)


Lesenswert?

dein protokoll ist falsch. du musst header commands senden (0x72, 
0x70)... waelze nochmal die pdf's... und immer nach 2 bytes cs high-low.

von Sean G. (atmega318)


Lesenswert?

easylife schrieb:
> dein protokoll ist falsch. du musst header commands senden (0x72,
> 0x70)... waelze nochmal die pdf's... und immer nach 2 bytes cs high-low.

du meinst das mit dem 0x70 vor der Register-ID und dem 0x72 für write, 
0x73 für read? Das habe ich schon gesehen, aber bei "SPI read COG ID and 
flowchart(SPI_RID):" ist im Gegensatz zu sonst keine Rede von Hadern!?

EDIT: Habs gefunden, komisch auf dem einen Flowchart ists nicht drauf. 
Aber so:
1
        EPD_CS_high
2
        delay();
3
        EPD_RESET_high
4
        delay();
5
        EPD_RESET_low
6
        delay();
7
        EPD_RESET_high
8
        delay();
9
        EPD_CS_low
10
        spi_8b(0x70);
11
        spi_8b(0x72);
12
        EPD_CS_high
13
        delay();
14
        EPD_CS_low
15
        spi_8b(0x73);
16
        init = spi_8b(0x00);
17
        EPD_CS_high
bekomme ich nur 0xff zurück!

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Ne, du hast recht, beim Header 0x71 sollte noch im gleichen 16-bit 
Zugriff im 2. Byte die COG ID zurückkommen.
(Doc. No 4P015-00 - Seite 19)

Dise Datenblätter sind allerdings auch eine ziemlich unübersichtliche 
Sache, muss man mal feststellen.

Auf S. 24 steht geschrieben:
"SPI_R(0x72,0x00) is used to check the COG Driver ID."

Vielleicht versuchst du es einfach mal mit der 0x72 statt 0x71.

Ausserdem: S.23 - im Flowchart wird gewartet, bis "Busy" auf low geht 
bevor die ID gecheckt werden kann.

von Easylife (Gast)


Lesenswert?

Ist es die 0x72 statt 0x71?
Oder busy?

von Sean G. (atmega318)


Lesenswert?

Easylife schrieb:
> Ist es die 0x72 statt 0x71?
> Oder busy?

Nee, leider beides nicht. Mittlerweile ziehe ich ein kaputtes display in 
Betracht (im moment bekomm ich nichtmal mehr 0x24 sondern nurnoch 
0xff)... Falls das aber so ist muss ich zuerst ein neues besorgen.

Busy ging gar nie high. Und 0x72 lieferte immer schon 0xff (habe ganz am 
Anfang mal probiert)

: Bearbeitet durch User
von Easylife (Gast)


Lesenswert?

Tja, sowas nervt natürlich, und ein kaputtes Display kommt schon mal 
vor.
Trotzdem lohnt es sich evtl. nochmal ein paar Dinge zu prüfen:

a) Spannungsversorgung. 10uF und 100nF bewirken oft Wunder.
b) Schaltung überprüfen. SI und SO ist schnell mal verwechselt...
c) Signale auf dem Oszi angucken (saubere Pegel, Clock nicht zu 
schnell...)
Manchmal hat man auch vergessen einen Output richtig zu konfigurieren, 
und da kommt einfach nichts raus, weil er als Input konfiguriert ist.
d) Reset/Initialisierung prüfen. Das Display scheint etwas 
anspruchsvoll, was die Initialisierungssequenz angeht...

Viel Erfolg, u.U. mit einem neuen Display.

von Wolle G. (wolleg)



Lesenswert?

Easylife schrieb:
> Viel Erfolg, u.U. mit einem neuen Display.

Seit dem letzten Beitrag sind ja einige Jahre vergangen und vielleicht 
hat jemand so ein e-Papier zum Laufen gebracht.

Ich habe die Schaltung nach Anhang (hoffentlich fehlerlos) aufgebaut
und verwende E2271CS021- 2,7".

Heute nur die Frage, ob jemand mir zunächst bei der
a) Initialisierung  helfen könnte.
b) kann man bei SPI an Stelle von jeweils 8 Bit gleich 16 Bit übertragen
(SPI (0x70, 0x08)? Anhang Auszug Seite 17
Das beste wäre, wenn jemand für mich ein lauffähiges Beispiel mit (viel 
deutschem) Kommentar hätte.
MfG

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.