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?