Forum: Compiler & IDEs SPI mit XMEGA und Display


von Hans M. (anno)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
Ich habe ein Problem mit dem Senden der Daten über SPI an ein DOGM 
Display.

http://www.lcd-module.de/pdf/grafik/dogm128.pdf

Mit diesem Code initialisiere ich das SPI. Dazu nutze ich den SPI Driver 
von ATMEL:
1
SPI_Master_t spiMasterE;
2
3
const char init[] = {0x40,    //Display start line 0
4
                     0xa1,    //ADC reverse
5
                     0xc0,    //Normal COM0...COM63
6
                     0xa6,    //Display normal
7
                     0xa2,    //Set Bias 1/9 (Duty 1/65)
8
                     0x2f,    //Booster, Regulator and Follower On
9
                     0xf8,    //Set internal Booster to 4x
10
                     0x00,
11
                     0x27,    //Contrast set
12
                     0x81,
13
                     0x0f,
14
                     0xac,    //No indicator
15
                     0x01,
16
                     0xaf,    //Display on
17
                     0xb0,    //Page 0 einstellen
18
                     0x10,    //High-Nible der Spaltenadresse
19
                     0x00,    //Low-Nible der Spaltenadresse
20
                     0xAF      
21
                     };
22
23
//Display initialisieren an PORT E
24
SPI_MasterInit(&spiMasterE,
25
               &SPIE,
26
               &PORTE,
27
               false,
28
               SPI_MODE_0_gc,
29
               SPI_INTLVL_MED_gc,
30
               false,
31
               SPI_PRESCALER_DIV4_gc);
32
33
for( u8 i = 0; i < 18; i++ )
34
{
35
36
37
SPI_MasterTransceiveByte(&spiMasterE, init[i]);
38
39
40
}

Die Initialisierung funktioniert soweit auch. Doch das Sendeflag, dass 
die Übertragung abgeschlossen ist, wird einfach nicht gesetzt.

So sieht die Transceive Funktion aus:
1
uint8_t SPI_MasterTransceiveByte(SPI_Master_t *spi, uint8_t TXdata) {
2
3
while(!(spi->module->STATUS & SPI_IF_bm)) {
4
}
5
}

Doch diese Schleife wird nie verlassen und das Programm hängt immer nur 
da drin herum.

Das Display an sich schicht keine Daten zurück, man kann also nur Daten 
an das Display senden. Ob das jetzt was ausmacht, weiß ich auch niucht 
genau.

von Hans M. (anno)


Angehängte Dateien:

Lesenswert?

So sehen die Einstellungen aus, wie sie im AVR Studio angezeigt werden 
(Anhang).

von Helmut R. (heru01)


Lesenswert?

Hallo Hans,
hast Du das Ganze mal ozilloskopiert?
Ich vermisse CS1 - vielleicht kommt das ja auch nur aus dem 
Programmfragment nicht heraus.

Gruß
Helmut

von Hans M. (anno)


Lesenswert?

was ist cs1?

Das Problem ist, dass ich im Debugger sehe, dass das Datenregister des 
SPI-E Ports garnicht beschrieben wird.

warum weiß ich allerdings auch nciht.

von Hans M. (anno)


Lesenswert?

ok ich habe die lösung gefunden.

warum auch immer, aber es funktioniert nur, wenn ich beim spi das 
interrupt level auf High setze.

von Simon K. (simon) Benutzerseite


Lesenswert?

Hast du die Interruptlevel-Ebenen freigegeben im PMIC?

von Helmut R. (heru01)


Lesenswert?

das wäre auch meine nächste Frage gewesen... ;-)

von Hans M. (anno)


Lesenswert?

ja, ich habe alle drei interruptlevel low, med und high freigegeben.

von GG (Gast)


Lesenswert?

Das Display braucht zum eigentlichen SPI noch zusätzlich drei 
Steuerleitungen A0, CS1, und Reset. Diese müssen taktgenau mit dem SPI 
gesteuert werdens (siehe st7676r.pdf). Ohne Aktivierung von A1 und CS1 
kommt keine Statusrückmeldung zustande.

Siehe meine Anwendung: http://www.basteln-mit-avr.de/xatmega.html

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.