Forum: Mikrocontroller und Digitale Elektronik SPI-PortExpander MCP23s08 - ATmega644


von Felix (Gast)


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

von S. Landolt (Gast)


Lesenswert?

Ich kann die Stelle nicht finden, an der MOSI und SCK auf Ausgang 
geschaltet werden, gemäß Datenblatt SPI-"C Code Example".

von Felix (Gast)


Lesenswert?

Oh mein Gott ! Haha, danke vielmals, hatte ich überlesen !

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.