SPI Display am Attiny 3216

#7902572
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?

#7902594
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

(Firma: 1984now) #7902596
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.

#7904761
Lesenswert?

Achim S. schrieb:

Kann ich diese Datei dann auch für den Attiny3216 verwenden?

Im Prinzip ja, aber eher nein. Denn das Adafruit Zeugs ist für Arduino geschrieben, was eine Menge an zusätzlichen Sources (das "Framework") bedingt die du auch einbinden müsstest. Das willst du aber nicht bzw. nach deiner Fragestellung zu urteilen wirst du daran scheitern.

Du brauchst eine Source die gleich ohne CPP daherkommt.

#7904765
Lesenswert?

Wastl schrieb:

Du brauchst eine Source die gleich ohne CPP daherkommt.

Hier im Anhang ist ein komplettes Projekt fürs AVR Studio und den ATMega2560. Es stammt aus diesem Thread:

Beitrag "Re: ILI9341 langsam Verbesserungsvorschläge?"

Dort kann man übrigens auch noch einiges lernen ...

Natürlich musst du die SPI- und die Port-Ansteuerung auf deine Bedürfnisse ändern, aber das ist sicherlich der leichtere (leichteste) Weg um zu einer funktionsfähigen ILI9341-Ansteuerung zu kommen.

Angehängte Dateien:
#7904990
Lesenswert?

Im Anhang ein komplettes Demo für Grafikdisplay und ATtiny3216. Weil ich nicht weiß, wie "gut" der TO mit seinem System umgehen kann und ob er ein Makefile verarbeiten kann (bspw. wenn er unter Windows ist und die binutils nicht installiert sind), habe ich die Compileraufrufe in einer Datei namentlich build.sh zusammen gefasst.

Und ja, es ist absicht, dass die Quelldateien als solche im Main-Programm inkludiert werden (und es keinen Link-Vorgang gibt).

Leider habe ich kein Display mit ILI9341 zur Verfügung und von daher kann dieses Programm hier "nur" Displays mit ILI9163, ILI9340, ST7735, S6D02A1, ILI9225, ST7789

Grundsätzlich sollten sich die Displays "nur" in ihren Initialisierungssequenzen unterscheiden und vllt. ist da auch eines der unterstützten Displays kompatibel. Ich werde in meinem Sammelsurium nachsehen, ob nicht doch irgendwo ein ILI9340 Display vorhanden ist (ich habe glaube ich nur parallele mit diesem Controller) und wenn dem so ist, werde ich die Sequenz hier noch nachtragen.

Grundsätzlich ist aber im Anhang das SPI funktionsfähig und kann für eine Software mit ILI9340 dann genutzt werden.

Viel Spaß damit

Angehängte Dateien:

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