Forum: Mikrocontroller und Digitale Elektronik SPI Display am Attiny 3216


von Achim S. (achims)


Lesenswert?

Hallo
Möchte ein SPI Display mit dem ILI9341 am Attiny 3216 in Betrieb nehmen. 
Dabei liegt DC am PA1, SCK am PC0, CS am PC3, Reset am PC1, Mosi am PC2 
an. Das Display funktioniert an anderen ICs korrekt, Betrieb mit 3,3V. 
Hab dieses Minimal Programm mal zum testen genommen. Damit sollte 
Portmux und das ausschalten korrekt funktinieren, leider geht es nicht:
1
#define F_CPU 10000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
#define DC_PIN     PIN1_bm  // PA1
6
#define DC_PORT    PORTA
7
8
#define RESET_PIN  PIN1_bm  // PC1
9
#define RESET_PORT PORTC
10
11
#define CS_PIN     PIN3_bm  // PC3
12
#define CS_PORT    PORTC
13
14
void spi_init(void) {
15
  // SPI0 auf alternativen Pins: MOSI=PC2, SCK=PC0
16
  //PORTMUX.SPIROUTEA = PORTMUX_SPI0_ALTERNATE_gc;
17
    PORTMUX.CTRLB |= PORTMUX_SPI0_bm;  // SPI0 auf Alternate: SCK=PC0, MOSI=PC2
18
19
20
  PORTC.DIRSET = PIN0_bm | PIN2_bm; // SCK, MOSI
21
  SPI0.CTRLA = SPI_ENABLE_bm | SPI_MASTER_bm;
22
  SPI0.CTRLB = SPI_SSD_bm;
23
}
24
25
void gpio_init(void) {
26
  PORTA.DIRSET = DC_PIN;
27
  PORTC.DIRSET = CS_PIN | RESET_PIN;
28
}
29
30
void spi_write(uint8_t data) {
31
  SPI0.DATA = data;
32
  while (!(SPI0.INTFLAGS & SPI_IF_bm));
33
}
34
35
void ili_cmd(uint8_t cmd) {
36
  DC_PORT.OUTCLR = DC_PIN;     // Command
37
  CS_PORT.OUTCLR = CS_PIN;
38
  spi_write(cmd);
39
  CS_PORT.OUTSET = CS_PIN;
40
}
41
42
void ili_reset(void) {
43
  RESET_PORT.OUTCLR = RESET_PIN;
44
  _delay_ms(10);
45
  RESET_PORT.OUTSET = RESET_PIN;
46
  _delay_ms(120);
47
}
48
49
int main(void) {
50
  gpio_init();
51
  spi_init();
52
  ili_reset();
53
  _delay_ms(1000);
54
  ili_cmd(0x28);  // Display OFF (muss schwarz werden)
55
  while (1) { }
56
}
C ist beim Attiny 32156 wohl doch etwas anders. Habe auch schon 
verschiedene Libs versucht, doch leider ohne Erfolg. Kann mir da jemand 
helfen?

von Veit D. (devil-elec)


Lesenswert?

Hallo,

Du legst SPI auf Port.C, verwendest jedoch einige dieser SPI Pins für 
andere Dinge. Das kann nicht gut gehen. Man muss sich entscheiden ob man 
Bit Banging macht oder die SPI Hardware verwendet.

Arbeite bitte einmal diese App Note durch.
https://www.microchip.com/en-us/application-notes/tb3215
Hier steht laut meiner Meinung alles drin inkl. Code Bsp.

Du kannst auch hier reinschauen.
https://github.com/adafruit/Adafruit_ILI9341

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Achim S. schrieb:

> Möchte ein SPI Display mit dem ILI9341 am Attiny 3216 in Betrieb nehmen.

[...]

Irgendwie fehlt im Code die Initialisierung des ILI9341 komplett. Ohne 
die macht der nach einem Reset erst mal garnix. U.a. weil er sich 
zunächst im Schlafmodus befindet.

In den diversen im Umlauf befindlichen Libs findet man passende 
Initialisierungssequenzen. Wobei zu beachten ist: nicht jede passt bei 
jedem Display. Insbesondere die Sequenz "0xEF ..." ist bei vielen 
Displays zwingend nötig, bei einigen anderen hingegen verhindert sie 
zuverlässig die Funktion.

Außerdem fällt auf: der Code initialisiert die SPI-Schnittstelle nicht 
im richtigen Modus. Der ILI9341 hätte gern SPI-Mode 3.

von Nemopuk (nemopuk)


Lesenswert?

Achim S. schrieb:
> Kann mir da jemand helfen?

Entscheide dich, ob du die #defines benutzen willst. Dieses wilde 
Gemisch (teils mit, teils ohne) stiftet nur unnötig Verwirrung.

: Bearbeitet durch User
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.