Forum: Mikrocontroller und Digitale Elektronik MCP23S17 lesen geht nicht (AVR SPI)


von abermel (Gast)


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?

von Stefan F. (Gast)


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.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

abermel schrieb:
> (Taster ziehen auf GND).
> Das Schreiben funktioniert ohne Probleme. Lesen geht gar nicht.

Sind PullUp's gesetzt (Entweder Intern oder Extern)?

Und das ist ein Trifftiges Argument:
Stefan ⛄ F. schrieb:
> Der Fehler ist, dass du die Funktion SPI_Read() nirgends aufrufst.

;-)

: Bearbeitet durch User
von abermel (Gast)


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.

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


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.....

von Stefan F. (Gast)


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?

von abermel (Gast)


Lesenswert?

dass einem auch 5 Minuten nachdem man sich endlich Hilfe sucht die 
Antwort selbst kommt, ist etwas blöd. Dennoch danke für eure Hilfe!

von Stefan F. (Gast)


Lesenswert?

Ist gut jetzt, du brauchst nicht auf Knien zu rutschen.

von abermel (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ist gut jetzt, du brauchst nicht auf Knien zu rutschen.

so, jetzt fühl ich mich schlecht :D

von Patrick L. (Firma: S-C-I DATA GbR) (pali64)


Lesenswert?

abermel schrieb:
> so, jetzt fühl ich mich schlecht :D

Autsch

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.