Forum: Mikrocontroller und Digitale Elektronik Problem MCP23S17 und avr-gcc


von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem, dass meine Leds nichts anzeigen.

Angeschlossen ist das ganze auf dem Steckbrett wie im oben hinterlegten 
Schaltplan.

Der avr-gcc Code sieht wie folgt aus


Ich werde gleich noch einmal schauen, ob ich einen LogikAnalyser am 
laufen bekomme, um zu schauen, wie der Datenfluss ist.
1
/*
2
 * spi.h
3
 */ 
4
5
6
#ifndef SPI_H_
7
#define SPI_H_
8
9
#include <avr/io.h>
10
11
#define SPI_DDR    DDRA
12
#define SPI_PORT  PORTA
13
#define SPI_SCK    4
14
#define SPI_MISO  5
15
#define SPI_MOSI    6
16
#define SPI_SS    7
17
18
void spi_init(void);
19
uint8_t spi_transfer(uint8_t data);
20
21
#endif /* SPI_H_ */
22
23
/*
24
* spi.c
25
*/
26
27
#include "spi.h"
28
29
void spi_init(void)
30
{
31
  SPI_DDR |= (1<<SPI_SS) | (1<SPI_MOSI) | (1<<SPI_SCK);
32
  SPI_DDR &= ~(1<<SPI_MISO);
33
  
34
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
35
}
36
37
uint8_t spi_transfer(uint8_t data)
38
{
39
  SPDR = data;
40
  while(!(SPSR & (1<<SPIF)));
41
  return SPDR;
42
}

1
/*
2
 * mcp23s17.h
3
 */ 
4
5
6
#ifndef MCP23S17_H_
7
#define MCP23S17_H_
8
9
#include "spi.h"
10
11
#define MCP_OPCODE    0x40
12
#define MCP_WRITE    0x00
13
#define MCP_READ    0x01
14
15
#define MCP_BANK    0x40
16
#define MCP_SEQOP    0x20
17
#define MCP_HAEN    0x08
18
19
// MCP23S17 Register BANK = 0
20
#define MCP_IODIRA    0x00  // DDR PortA (0 = Ausgang, 1 = Eingang)
21
#define MCP_IODIRB    0x01  // DDR PortA (0 = Ausgang, 1 = Eingang)
22
#define MCP_IOCONA    0x0A
23
#define MCP_GPPUA    0x0C
24
#define MCP_GPPUB    0x0D
25
#define MCP_GPIOA    0x12
26
#define MCP_GPIOB    0x13
27
28
29
void mcp_write(uint8_t hwaddr, uint8_t reg, uint8_t data);
30
uint8_t mcp_read(uint8_t hwaddr, uint8_t reg);
31
32
#endif /* MCP23S17_H_ */
33
34
35
/*
36
* mcp23s17.c
37
*/
38
39
#include "mcp23s17.h"
40
41
void mcp_write(uint8_t hwaddr, uint8_t reg, uint8_t data)
42
{
43
  SPI_PORT &= ~(1<<SPI_SS);
44
  
45
  spi_transfer(MCP_OPCODE | ((hwaddr<<1) & 0x0e)  | MCP_WRITE);
46
  spi_transfer(reg);
47
  spi_transfer(data);
48
49
  SPI_PORT |= (1<<SPI_SS);
50
}
51
52
53
uint8_t mcp_read(uint8_t hwaddr, uint8_t reg)
54
{
55
  uint8_t data = 0;
56
  SPI_PORT &= ~(1<<SPI_SS);
57
  
58
  spi_transfer(MCP_OPCODE | ((hwaddr << 1) & 0x0e) | MCP_READ);
59
  spi_transfer(reg);
60
  data = spi_transfer(0x00);
61
62
  SPI_PORT |= (1<<SPI_SS);
63
  
64
  return data;
65
}

1
/*
2
* main.c
3
*/
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
#include "spi.h"
9
#include "mcp23s17.h"
10
11
int main(void)
12
{
13
  spi_init();
14
15
  // MCP23S17 #1
16
  mcp_write(0, MCP_IOCONA, 0x28); // default: BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1
17
  mcp_write(0, MCP_IODIRA, 0xff); // GPIOA Eingang
18
  mcp_write(0, MCP_IODIRB, 0xff); // GPIOB Eingang
19
  mcp_write(0, MCP_GPPUA, 0xff);  // PullUp aktiv
20
21
  // MCP23S17 #2
22
  mcp_write(1, MCP_IOCONA, 0x28); // default: BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1
23
  mcp_write(1, MCP_IODIRA, 0x00);  // GPIOA Ausgang
24
  mcp_write(1, MCP_GPIOA, 0x00);  // Ausgaenge ausschalten
25
  mcp_write(1, MCP_IODIRB, 0x00);  // GPIOB Ausgang
26
  mcp_write(1, MCP_GPIOB, 0x00);  // Ausgaenge ausschalten
27
28
29
  while (1)
30
  {
31
    static uint8_t ct = 0;
32
    uint8_t read = 0;
33
34
    // Lauflicht auf MCP23S17 #2 GPIOB
35
    mcp_write(1, MCP_GPIOB, 1<<ct);
36
    if(++ct >= 8) ct = 0;
37
    
38
    // Kodierschalter auslesen auf MCP23S17 #1 GPIOA
39
    read = mcp_read(0, MCP_GPIOA);
40
    // Kodierschalter Einstellung auf MCP23S17 #2 GPIOA ausgeben
41
    mcp_write(1, MCP_GPIOA, read);
42
    _delay_ms(100);
43
  }
44
}

von Stephan (Gast)


Lesenswert?

Hi

Deine Verdrahtung geht gar nicht.
Kannst du mal beschreiben was du machen wolltest?
(Beide einzeln ansprechen oder beide mit einem /CS betreiben, die 
Telegramme durch einen Chip 'durchreichen'????)
1
 // MCP23S17 #2
2
  mcp_write(1, MCP_IOCONA, 0x28); // default: BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1

Das Telegramm müßte dürfte nicht durchgehen. Denn:
1
If disabled (HAEN = 0), the device’s hardware address
2
is A2 = A1 = A0 = 0.

Aber die nächsten dürften dann laufen da deine Adresse eine 1 ist (A0 
=1).

von Stefan S. (sschultewolter)


Lesenswert?

Was ist an der Verdrahtung falsch?

Es soll an den MCPs die Hardware Adresse, welche einstellbar über A0 - 
A2 ist, genutzt werden. Deshalb CS zusammen.
1
 mcp_write(1, MCP_IOCONA, 0x28); // default: BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1
[quote]
bit 3 HAEN: Hardware Address Enable bit (MCP23S17 only).
Address pins are always enabled on MCP23017.
1 = Enables the MCP23S17 address pins.[/quote]
Sollte somit doch richtig sein, dass hier MCP_HAEN = 1 gesendet wird.

Quelle: http://ww1.microchip.com/downloads/en/DeviceDoc/21952b.pdf

von Stephan (Gast)


Lesenswert?

Beide SO-Pins der MCP arbeiten gegen einander. Da beide nicht das 
gleiche zurück geben werden, dürfte das Krach geben.

Löse bitte mal den SS von Chip mit A0=1 und teste dann die Software mit 
nur einem Chip. Ich glaube da könnte sogar schon einiges laufen.(hab 
noch nicht alles durch)

Das du MCP_HAEN nutzen möchtest ist gut und auch richtig, nur so lange 
ist die default Adr des Chips immer 0!
Du hast in den Funktion Call aber eine 1 stehen.
1
mcp_write(1,....

Aber der Befehl könnt jetzt schon laufen:
1
// MCP23S17 #1
2
  mcp_write(0, MCP_IOCONA, 0x28); // default: BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1
Beide Chips haben die Adresse 0 (Default) dort werden die folgenden 
Register gemeinsam gesetzt:
>BANK = 0, MCP_SEQOP = 1, MCP_HAEN = 1
ABER gut ist das nicht!

von Stefan S. (sschultewolter)


Lesenswert?

Ich habe nun gestern das Problem gehabt, dass ich überhaupt nicht mehr 
senden konnte mit meinem Attiny. Fehler im Programm noch nicht weiter 
rausgesucht. Am LogicAnalyer wurden die Signale nicht mehr 
rausgeschickt.

Hab dann den ganzen Code deutlich verringert, und teste das ganze gerade 
erst einmal mit einem Register. Das 2. folgt heute/morgen.

Mit der Problematik der Adressierung bin ich noch nicht wirklich weiter. 
Wenn ich das Datenblatt richtig deute, ist es doch so, dass wenn ich die 
Hardwareadressierung(A0 - A3) nutzte, alle Signale 1:1 durchgeschleift 
werden dürfen. Das sollte doch gerade der große Vorteil sein bei den 
Teilen. Die wären somit deutlich flexibler als HC595 Bausteine mit 
entsprechenden Gegenstück für Parallel->Seriell. Die Kosten für die 
Bausteine liegen bei Reichelt 1,30€, Großhändler wie Mouser bereits ab 
25Stk 1,00€.

Da muss man sich dann auch nicht großartig mit den HC595 Modulen 
herumschlagen, auch wenn hier die Preise noch etwas drunter liegen.
1
/*
2
* attiny841_spi.c
3
*
4
* Created: 04.10.2015 11:02:38
5
* Author : sschultewolter
6
*/
7
8
9
10
#include <avr/io.h>
11
#include <util/delay.h>
12
13
//////////////////////////////////////////////////////////////////////////
14
// SPI
15
#define SPI_DDR      DDRA
16
#define SPI_PORT    PORTA
17
#define SPI_SCK      PORTA4
18
#define SPI_MOSI    PORTA6
19
#define SPI_MISO    PORTA5
20
#define SPI_SS      PORTA7
21
#define SPI_FCK_DIV    2
22
23
void spi_init(void);
24
uint8_t spi_transfer(uint8_t data);
25
//////////////////////////////////////////////////////////////////////////
26
27
28
29
//////////////////////////////////////////////////////////////////////////
30
// MCP23S17
31
#define MCP_OPCODE    0x40
32
#define MCP_WRITE    0x00
33
#define MCP_READ    0x01
34
35
#define MCP_BANK    0x40
36
#define MCP_SEQOP    0x20
37
#define MCP_HAEN    0x08
38
39
// MCP23S17 Register BANK = 0
40
#define MCP_IODIRA    0x00  // DDR PortA (0 = Ausgang, 1 = Eingang)
41
#define MCP_IODIRB    0x01  // DDR PortA (0 = Ausgang, 1 = Eingang)
42
#define MCP_IOCONA    0x0A
43
#define MCP_GPPUA    0x0C
44
#define MCP_GPPUB    0x0D
45
#define MCP_GPIOA    0x12
46
#define MCP_GPIOB    0x13
47
48
void mcp_write_byte(uint8_t hwaddr, uint8_t reg, uint8_t data);
49
void mcp_write_bit(uint8_t hwaddr, uint8_t reg, uint8_t bit, uint8_t data);
50
51
uint8_t mcp_read_byte(uint8_t hwaddr, uint8_t reg);
52
uint8_t mcp_read_bit(uint8_t hwaddr, uint8_t reg, uint8_t bit);
53
//////////////////////////////////////////////////////////////////////////
54
55
56
57
int main(void)
58
{
59
  DDRA |= (1<<PORTA3);  // Ausgang Zeitmessung
60
  spi_init();
61
  mcp_write_byte(0, MCP_IOCONA, 0x28);
62
  
63
  mcp_write_byte(0, MCP_IODIRA, 0x0f);  // Eingang GPIOA0-3; Ausgang GPIOA4-7
64
  mcp_write_byte(0, MCP_GPPUA, 0x0f);    // PullUp GPIOA0-3
65
  mcp_write_byte(0, MCP_IODIRB, 0x00);  // Ausgang GPIOB0-7 (0x00 entspricht bei AVR 0xff)
66
  while (1)
67
  {
68
    
69
    PORTA |= (1<<PORTA3);
70
    // Einzelne Pins auslesen, Pins aendern und ein Port jedes mal zurueckschicken (nicht optimal)!
71
    // 230µs
72
    for(uint8_t i = 0; i < 4; i++)
73
    {
74
      if(mcp_read_bit(0, MCP_GPIOA, i)) mcp_write_bit(0, MCP_GPIOA, i+4, 1);
75
      else mcp_write_bit(0, MCP_GPIOA, i+4, 0);
76
    }
77
    
78
    // Gesamten Port einlesen, Port aendern und einmal senden (besser)!
79
    // 30µs
80
    uint8_t recData = mcp_read_byte(0, MCP_GPIOA);
81
    recData = recData | (recData<<4);
82
    mcp_write_byte(0, MCP_GPIOA, recData);
83
    
84
    PORTA &= ~(1<<PORTA3);
85
  }
86
}
87
88
void spi_init(void)
89
{
90
  SPI_DDR |= (1<<SPI_SS) | (1<<SPI_MOSI) | (1<<SPI_SCK);
91
  
92
  SPCR = (1<<SPE) | (1<<MSTR);
93
  
94
  #ifdef SPI_FCK_DIV
95
  switch(SPI_FCK_DIV)
96
  {
97
    case 2:
98
    SPSR |= (1<<SPI2X);
99
    break;
100
    case 8:
101
    SPCR |= (1<<SPR0);
102
    SPSR |= (1<<SPI2X);
103
    break;
104
    case 16:
105
    SPCR |= (1<<SPR0);
106
    break;
107
    case 32:
108
    SPCR |= (1<<SPR1);
109
    SPSR |= (1<<SPI2X);
110
    break;
111
    case 64:
112
    SPCR |= (1<<SPR1) | (1<<SPR0);
113
    SPSR |= (1<<SPI2X);
114
    break;
115
    case 128:
116
    SPCR |= (1<<SPR1) | (1<<SPR0);
117
    break;
118
  }
119
  #endif
120
}
121
122
uint8_t spi_transfer(uint8_t data)
123
{
124
  SPDR = data;
125
  while(!(SPSR & (1<<SPIF)));
126
  return SPDR;
127
}
128
129
void mcp_write_byte(uint8_t hwaddr, uint8_t reg, uint8_t data)
130
{
131
  SPI_PORT &= ~(1<<SPI_SS);
132
  
133
  spi_transfer(MCP_OPCODE | ((hwaddr<<1) & 0x0e)  | MCP_WRITE);
134
  spi_transfer(reg);
135
  spi_transfer(data);
136
  
137
  SPI_PORT |= (1<<SPI_SS);
138
}
139
140
uint8_t mcp_read_byte(uint8_t hwaddr, uint8_t reg)
141
{
142
  uint8_t recData = 0;
143
  SPI_PORT &= ~(1<<SPI_SS);
144
  
145
  spi_transfer(MCP_OPCODE | ((hwaddr << 1) & 0x0e) | MCP_READ);
146
  spi_transfer(reg);
147
  recData = spi_transfer(0x00);
148
149
  SPI_PORT |= (1<<SPI_SS);
150
  
151
  return recData;
152
}
153
154
void mcp_write_bit(uint8_t hwaddr, uint8_t reg, uint8_t bit, uint8_t data)
155
{
156
  uint8_t recData = mcp_read_byte(hwaddr, reg);
157
  if(data) recData |= (1<<bit);
158
  else recData &= ~(1<<bit);
159
  
160
  mcp_write_byte(hwaddr, reg, recData);
161
}
162
163
uint8_t mcp_read_bit(uint8_t hwaddr, uint8_t reg, uint8_t bit)
164
{
165
  uint8_t recData = mcp_read_byte(hwaddr, reg);
166
  if(recData & (1<<bit)) return 1;
167
  else return 0;
168
}

von Stephan (Gast)


Lesenswert?

Hi
das wollte ich doch auch von dir wissen wie du arbeiten wolltest.
Du willst die Daten durch reichen ok, der Anschluß sieht wie folgt aus:

SCL - auf beide -> war Ok
AVR SS - auf beide -> war Ok
AVR MOSI -> SI (ADR:0) -> SO (ADR:0) -> SI (ADR:1) -> SO (ADR:1) -> AVR 
MISO

Willst du das machen???

Für die SW ist es zu spät, ich schau mal morgen drüber.

von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Stephan schrieb:
> Hi
> das wollte ich doch auch von dir wissen wie du arbeiten wolltest.
> Du willst die Daten durch reichen ok, der Anschluß sieht wie folgt aus:
Nein, dass wollte ich gerade nicht. Ich hatte gehofft, dass ich alles 
parallel anschließen kann
1
AVR SCK  -> MCP0 CLK -> MCP1 CLK 
2
AVR MOSI -> MCP0 SI  -> MCP1 SI
3
AVR MISO -> MCP0 SO  -> MCP  S0
4
AVR SS   -> MCP0 CS  -> MCP0 CS

http://ww1.microchip.com/downloads/en/AppNotes/01043a.pdf
Seite 8
[quote]
The “S” devices (MCP23S08 and MCP23S17) have
SPI interfaces. These devices use a chip select for
selecting the part, however, these parts also have hardware
address pins, thereby giving the advantage of
attaching multiple devices on the bus while only
consuming one MCU pin for chip select (see Figure 9).[/quote]

Der SO soll sich doch nur melden, wenn der MCP über die richtige Adresse 
angesprochen wurden. Andernfalls kommt nichts aus SO.

Leider sind auch viele fremdsprachige Seiten bei Google dabei :([1] / 
Link/Bild


[1]
https://translate.google.de/translate?hl=de&sl=be&tl=en&u=http%3A%2F%2Fsmanuals.ru%2Fmeasurement-technology%2Farticles5439.html%23.VhHBmXrtmkoNUoEySNnsxrhM%3A&docid=qjvEhHeF-0jjcM&ei=1sARVtyOBcissgGTz6KQAg&tbm=isch&iact=rc&uact=3&dur=1198&page=1&start=0&ndsp=27&ved=0CEcQrQMwDWoVChMI3NHKpYaqyAIVSJYsCh2Tpwgi

Wie gesagt, ich werde es morgen noch einmal in Angriff nehmen. Werde mir 
dazu mal ein paar Leds aufs Breadboard setzen.

: Bearbeitet durch User
von Stefan S. (sschultewolter)


Lesenswert?

Hallo Stephan,

ich habe das ganze nun doch noch mal schnell zusammengesetzt. An dem 2. 
MCP habe ich nur einen Taster angeschlossen, sollte für den Test 
reichen.
Es funktioniert wie ich es wollte.
1
int main(void)
2
{
3
[...]
4
  mcp_write_byte(0, MCP_IOCONA, 0x28);
5
6
  mcp_write_byte(0, MCP_IODIRA, 0x0f);  // Eingang GPIOA0-3; Ausgang GPIOA4-7
7
  mcp_write_byte(0, MCP_GPPUA, 0x0f);    // PullUp GPIOA0-3
8
  mcp_write_byte(0, MCP_IODIRB, 0x00);  // Ausgang GPIOB0-7 (0x00 entspricht bei AVR 0xff)
9
  mcp_write_byte(1, MCP_IODIRA, 0xff);  // Eingang GPIOA0-7
10
  mcp_write_byte(1, MCP_GPPUA, 0xff);    // PullUp GPIOA0-7
11
  while (1)
12
  {
13
    // Kodierschalter an MCP_0_GPIOA0-3 auslesen
14
    uint8_t recData = mcp_read_byte(0, MCP_GPIOA);
15
    // Werte des Kodierschalters an MCP_0_GPIOA4-7 an den Leds ausgeben
16
    mcp_write_byte(0, MCP_GPIOA,(recData<<4));
17
    
18
    // Taster an MCP_1_GPIOA0 auslesen und Muster umschalten
19
    if(mcp_read_bit(1, MCP_GPIOA, 0)) mcp_write_byte(0, MCP_GPIOB, recData ^ 0xF0);
20
    else mcp_write_byte(0, MCP_GPIOB, recData ^ 0x0F);
21
  }
22
}
Es reicht nach einem Reset aus, wenn
1
mcp_write_byte(0, MCP_IOCONA, 0x28);
einmal ausgeführt wird. Da nach dem Reset das Register im MCP nicht mehr 
gesetzt wird, werden alle MCPs gleichzeitig angesprochen. Danach sind 
diese über die Hardwareadressen ereichbar. SI, SO, SCK und CS können 
zusammengeschaltet werden. Kaskadenschaltung wie bei dem HC595 o.ä. ist 
NICHT notwendig und in meinen Fall auch nicht erwünscht. Mit 128 IOs 
sollten für mich voll ausreichen am kleinen Attiny841 ;) Zur Not wird 
ein weiter CS für die nächsten 128 IOs genutzt.

Der derzeitige Code belegt auch nicht sonderlich viel an Speicher.
1
        Program Memory Usage   :  328 bytes   4,0 % Full
2
        Data Memory Usage     :  0 bytes   0,0 % Full

P.S.: Der MCP scheint auch Taster bereits ganz gut zu entprellen!
1
    static uint8_t last = 0;
2
    uint8_t now = mcp_read_bit(1, MCP_GPIOA, 0);
3
    static uint8_t ct = 0;
4
    if(now != last)
5
    {
6
      last = now;
7
      if(now) ct++;
8
      mcp_write_byte(0, MCP_GPIOB, ct);
9
    }
Reicht schon aus. Das Programm läuft ohne Delay mit ca 65µs durch.

: Bearbeitet durch User
von Won K. (Firma: Outside the Asylum) (the_sane)


Lesenswert?

Stefan S. schrieb:
> Nein, dass wollte ich gerade nicht. Ich hatte gehofft, dass ich alles
> parallel anschließen kann

Ja kannst Du auch, dafür sind die Adresspins gedacht, I2C-Adressierung 
auf SPI umgesetzt.

Eine Kaskadierung wie bei normalen Schieberegistern würde nicht 
funktionieren, da keine Daten von SI nach SO durchgereicht werden.

Aber das hast Du ja jetzt schon selbst festgestellt.

Stephan schrieb:
> Deine Verdrahtung geht gar nicht.
Das ist nur Deine Meinung.

von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

So,

ich habe nun so einiges durchgetestet und bin der Meinung, es 
funktioniert so, wie ich es mir gedacht habe. Der SPI Bus ist parallel 
zu den MCPs angeschlossen. Die HWAdressen 0x00 und 0x01 wurden vergeben.

Im Anhang das Programm. Die eigentlich Libary ist kompakt gehalten, ohne 
unnötig viele Funktionen bereit zustellen.

Das Testszenario besteht aus 3*8Leds an MCP0 PORTB, MCP1 PORTA und MCP1 
PORTB. An MCP0 PORTA sind 6 Kodierschalter angeschlossen, die das Muster 
bereitstellen. Mit den 2 Tastern kann das Muster nach Rechts oder Links 
auf den Ledreihen verschoben werden.

Kurzes Video gibt es unter
https://www.dropbox.com/s/nrslobw8l60iv30/WP_20151006_22_20_49_Pro.mp4?dl=0

von Mathias O. (m-obi)


Lesenswert?

Muss SEQOP und HAEN nicht auch für den Zweiten gesetzt werden in der 
Init-Funktion?

von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Hallo Mathias,

nach dem Spannungsverlust, bzw. nach dem Betätigen von Reset wird der 
MCP wieder in Werkseinstellung gesetzt.

Im Datenblatt Seite 9/10 sind die Werte danach für das IOCON Register 
wieder auf "0000 0000". Das heißt bei der Initialisierung werden zuerst 
einmal alle MCPs gleichzeitig angesprochen. Erst nach der 
Initialisierung sind die Hardwareaddressen aktiv.

P.S. Im Anhang noch eine etwas überarbeitete Version. Hauptsächlich 
wurden aus der Dokumentation die Beschreibungen der Register lediglich 
hinzugefügt.

: Bearbeitet durch User
von Mathias O. (m-obi)


Lesenswert?

Jo klingt logisch. HAEN ist ja noch garnicht aktiv, also ist ihm die 
Adresse egal.

von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

Werde mich die Tage noch ein bisschen mit dem Teil auf dem Steckbrett 
versuchen. Vorallem werde ich testen, ob es klappt bei der Adressierung, 
dass diese 0x00 ist, wenn ich je Adressbit ein PullDown von 10-20k 
setze. Dann müsste man nur noch 2 Pins (Solderpads) gebrauchen, um die 
Adresse auf 1 zu setzen. Derzeit ist das noch mit 3 Pins geplant.

Das ganze soll dann eine 5x5cm Platine werden mit 2 Expandern. Optional 
sollen dort Reset, sowie alle 4 Interrupts herausgeführt werden. Diese 
ist getrennt von der eigentlichen SPI Schnittstelle. Sodass ich die SPI 
Schnittstelle (2x3 Pinheader) direkt mit Flachband durchschleifen kann.

An der Platine ist noch einiges an Arbeit zu machen, aber hier einmal 
der Vorab Entwurf.

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.