moin, bei meinem Aufbau eines Atmega 328 mit dem MCP23S17 schreibe ich auf GPIOA (7-Segment-Display) und lese auf GPIOB (Taster ziehen auf GND). Das Schreiben funktioniert ohne Probleme. Lesen geht gar nicht.
1 | #define SPI_PORT PORTB
|
2 | #define SPI_DDR DDRB
|
3 | #define SPI_CS PB1
|
4 | |
5 | #define SPI_SLAVE_ID 0x40
|
6 | #define SPI_SLAVE_ADDR 0x00 // A2=0,A1=0,A0=0
|
7 | #define SPI_SLAVE_WRITE 0x00
|
8 | #define SPI_SLAVE_READ 0x01
|
9 | |
10 | #define IODIRA 0x00
|
11 | #define IODIRB 0x01
|
12 | #define IOCONA 0x0A
|
13 | #define IOCONB 0x0B
|
14 | #define GPPUA 0x0C
|
15 | #define GPPUB 0x0D
|
16 | #define GPIOA 0x12
|
17 | #define GPIOB 0x13
|
18 | |
19 | void init_SPI() { |
20 | SPI_DDR = (1 << PB3) | (1 << PB5) | (1 << SPI_CS); |
21 | SPI_PORT |= (1 << SPI_CS); |
22 | |
23 | SPCR = (1 << SPE) | (1 << MSTR); |
24 | SPSR |= (1 << SPI2X); |
25 | |
26 | SPI_Write(IOCONA, 0x28); // I/O Control Register: BANK=0, SEQOP=1, HAEN=1 (Enable Addressing) |
27 | SPI_Write(IODIRA, 0x00); // GPIOA As Output |
28 | |
29 | SPI_Write(IODIRB, 0xFF); // GPIOB As Input |
30 | SPI_Write(GPPUB, 0xFF); // Enable Pull-up Resistor on GPIOB |
31 | SPI_Write(GPIOA, 0x00); // Reset Output on GPIOA |
32 | }
|
33 | |
34 | void awaitTransmission() { |
35 | while (!(SPSR & (1 << SPIF))) ; |
36 | }
|
37 | |
38 | void SPI_Write(unsigned char addr, unsigned char data) { |
39 | SPI_PORT &= ~(1 << SPI_CS); |
40 | SPDR = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E) | SPI_SLAVE_WRITE; |
41 | awaitTransmission(); |
42 | |
43 | SPDR = addr; |
44 | awaitTransmission(); |
45 | |
46 | SPDR = data; |
47 | awaitTransmission(); |
48 | |
49 | SPI_PORT |= (1 << SPI_CS); |
50 | }
|
51 | |
52 | unsigned char SPI_Read(unsigned char addr) { |
53 | SPI_PORT &= ~(1 << SPI_CS); |
54 | SPDR = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E) | SPI_SLAVE_READ; |
55 | awaitTransmission(); |
56 | |
57 | SPDR = addr; |
58 | awaitTransmission(); |
59 | |
60 | SPDR = 0x00; // dummy data |
61 | awaitTransmission(); |
62 | |
63 | SPI_PORT |= (1 << SPI_CS); |
64 | |
65 | return (SPDR); |
66 | }
|
Hat jemand eine Idee, wo der Fehler liegen könnte?