Hallo, ich verwende einen ATmega644 und habe über den SPI-Bus einen
SPI-Portexpander (MCP23S08) angeschlossen. Die Chip-Select-Leitung hängt
am µC-Pin B4.
Jetzt habe ich allerdings ein Testprogramm für den Portexpander
geschrieben,
mit dem ich LED´s leuchten lassen will, die an seinen Ausgängen hängen.
Aber es rührt sich einfach nichts. Die Verbindungen habe ich schon x mal
überprüft, die sind sich richtig.
INFO: Der Portexpander erwartet laut Datenblatt mind. 3 Befehle (Byte):
1.) Slave-Auswahl, und on geschrieben oder gelesen wird
2.) Register-Auswahl, dass z.B. beschrieben werden soll.
3.) Wert, der in das Register geschrieben werden soll.
Den Port-Expander habe ich wie folgt angeschlossen:
PORTEXPANDER | Mikrocontroller
------------------------------------
SCK | SCK
SI | MOSI
SO | MISO
A1 und A2 | GND
RESET | Vcc
CS | PB4
INT | floating - nicht verbunden
VSS | GND
VDD | Vcc
Hier ist mein Code...vielleicht fällt euch ja ein Fehler auf ??
Danke vielmals schon mal im Voraus, LG
1 | #define F_CPU 8000000UL
|
2 | #include <util/delay.h>
|
3 | #include <avr/io.h>
|
4 |
|
5 | void SPI_init(void);
|
6 | void SPI_send(uint8_t slave_ad, uint8_t register_ad, uint8_t selected_pins);
|
7 |
|
8 | uint8_t slave_adress = 0b01000000; //Dritte und Zweite Bit sind die Adressbits, und auf Masse gezogen...deswegen ist die Adresse auch null.
|
9 |
|
10 | uint8_t IODIR_adress = 0x00; //Adresse des IODirection_Registers
|
11 | uint8_t GPIO_adress = 0x09; //Adresse des GPIO_Registers
|
12 |
|
13 | uint8_t PINSTAT = 0x00; //Alle Pins als OUTPUTS
|
14 |
|
15 | uint8_t light_mode_1 = 0b10101010; //Led leuchten Mode 1
|
16 | uint8_t light_mode_2 = 0b01010101; //Led leuchten Mode 2
|
17 |
|
18 | int main(void)
|
19 | {
|
20 | PORTB |= (1<<PB4); //ChipSelect
|
21 | DDRB |= (1<<PB4); //ChipSelect
|
22 |
|
23 | SPI_init();
|
24 | _delay_ms(100);
|
25 |
|
26 | SPI_send(slave_adress,IODIR_adress,PINSTAT);
|
27 | _delay_ms(100);
|
28 |
|
29 | while (1)
|
30 | {
|
31 | SPI_send(slave_adress,GPIO_adress,light_mode_1);
|
32 | _delay_ms(500);
|
33 | SPI_send(slave_adress,GPIO_adress,light_mode_2);
|
34 | _delay_ms(500);
|
35 | }
|
36 | }
|
37 |
|
38 |
|
39 | void SPI_init(void)
|
40 | {
|
41 | SPCR |= (1<<SPE) | (1<<MSTR) | (1<<SPR0); //SPI-Enable, MasterMode
|
42 | }
|
43 |
|
44 | void SPI_send(uint8_t slave_adress, uint8_t register_adress, uint8_t selected_pin)
|
45 | {
|
46 | PORTB &= ~(1<<PINB4); //Chip Select auf LOW
|
47 |
|
48 | SPDR = slave_adress;
|
49 | while (!(SPSR & (1<<SPIF)));
|
50 | SPDR = register_adress;
|
51 | while(!(SPSR & (1<<SPIF)));
|
52 | SPDR = selected_pin;
|
53 | while(!(SPSR & (1<<SPIF)));
|
54 |
|
55 | PORTB |= (1<<PINB4); //Chip Select auf High
|
56 | }
|
57 |
|
58 | //Mindestens 3 Kommandos:
|
59 | //Erstes Kommando: Welchen Chip rede ich an, und ob ich ein register beschreiben oder davon lesen will
|
60 | //Zweites Kommando: Adresse des Registers von dem ich lesen oder das ich beschreiben will
|
61 | //Drittes Kommando: Wert der geschrieben wird, oder das Byte, dass gelesen werden soll
|