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
von Achim S. (achims)


Lesenswert?

Hallo
Habe die genannten Stellen angeschaut und gelesen. Bei 
githup/Adafruit_ILI9341 wird die Datei mit der Endung .cpp angegeben. 
Kann ich diese Datei dann auch für den Attiny3216 verwenden?

von Wastl (hartundweichware)


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.

von Wastl (hartundweichware)


Angehängte Dateien:

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.

von Wastl (hartundweichware)


Lesenswert?

Wastl schrieb:
> Dort kann man übrigens auch noch einiges lernen ...

... zum Beispiel dass man die Steuerleitungen nicht mit 5V
Pegel beaufschlagen darf sonst geht evtl was Kaputt. YMMV.

von Ralph S. (jjflash)


Angehängte Dateien:

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

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.