SPI-PortExpander MCP23s08 - ATmega644

Gast #5030650
Lesenswert?

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

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