MCP23S17 lesen geht nicht (AVR SPI)

Gast #6767599
Lesenswert?

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?
Gast #6767609
Lesenswert?

abermel schrieb:
> Lesen geht gar nicht.
> Hat jemand eine Idee, wo der Fehler liegen könnte?

Mit so wenig Informationen wohl kaum. Außer:

Der Fehler ist, dass du die Funktion SPI_Read() nirgends aufrufst.

Was genau bedeutet "geht gar nicht"? Untersuche die Signale mit einem 
Logic Analyzer oder Oszilloskop.
Gast #6767618
Lesenswert?

sorry:


1. dafür, falls ich irgendjemandes Zeit verschwendet habe. Der Fehler 
war eine Lötbrücke. Das MISO wurde nicht übertragen. Alles funktioniert 
jetzt.

2. für die unzureichende Problembeschreibung. SPI_Read wird schon 
aufgerufen, hatte den nur weggelassen, weil ich das nicht relevant fand.
Ich benutze die internen Pullups. Dachte das ginge aus dem Code hervor. 
Weil ich da aber auch schon dran gedacht hatte, hab ich der Schaltung 
sicherheitshalber trotzdem welche verpasst.
(Firma: S-C-I DATA GbR) #6767624
Lesenswert?

abermel schrieb:
> dafür, falls ich irgendjemandes Zeit verschwendet habe. Der Fehler
> war eine Lötbrücke. Das MISO wurde nicht übertragen. Alles funktioniert
> jetzt.
Danke für die Mitteilung.
Fehler machen kann jeder :-)
Aber wenn man dazu steht, fängt nicht unnötiges Rätselraten an :-D

Schönes W.E. und viel erfolg beim Tüfteln.....
Gast #6767625
Lesenswert?

abermel schrieb:
> hatte den nur weggelassen, weil ich das nicht relevant fand.

Wie du siehst war der Fehler nicht in den Teilen, die du gezeigt hast. 
So ist es fat jedes mal. Denn das was der fragende für relevant hält, 
hat er sich bereits genauer angeschaut. Nicht wahr?

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