Ich habe vier MCP23S17 an einem Atmega32U2. MISO, MOSI SCK und !CS sind alle gemeinsam auf einem Bus. Die Adresspins sind unterschiedlich beschaltet und so lassen sich die ICs einzeln ansprechen. Mein Problem: Das DB sagt, dass nach Reset IOCON.HAEN=0 ist und somit die Adresspins NICHT aktiv sind, warum funktioniert das einzelne Ansprechen aber? Beitrag "MCP23S17 kaskadieren" kommt auch zum Ergebnis, dass das nicht funktionieren sollte. Matthias
Schau mal ins Errata: http://ww1.microchip.com/downloads/en/DeviceDoc/80311a.pdf Wenn A2 high ist, scheint das das HAEN bit zu bypassen, dann wird die Adresse auf jeden Fall verglichen. Viele Grüße Jochen
:
Bearbeitet durch User
Jochen S. schrieb: > http://ww1.microchip.com/downloads/en/DeviceDoc/80311a.pdf > > Wenn A2 high ist, scheint das das HAEN bit zu bypassen, dann wird die > Adresse auf jeden Fall verglichen. Schonmal interessant, kann aber hier nicht die Ursache sein, bei allen 4 liegt A2 auf GND, die haben die Adressen 0..3. Seltsam. Wobei, wenn man es logisch überlegt: wenn das wie im DB beschrieben wäre, dann müsste man immer für jeden IC ein !CS spendieren und diese Funktion wäre sinnlos. Matthias
Wieso sinnlos? Du könntest mit einem Kommando an alle gleichzeitig das HAEN-Bit zu Beginn auf 1 setzen. Ab dem nächsten Zugriff wären sie dann per Adresse unterscheidbar. Kollision auf MISO wäre dabei auch nicht zu erwarten, weil beim Nur-Schreiben SO auf High-Z liegt. Da die Bausteine die Pins für die I2C-Variante eh haben, ist es nur clever, die auch für SPI zu benutzen, um die Anzahl möglicher CS-Leitungen zu reduzieren. Gruß Jochen
Jochen S. schrieb: > Wieso sinnlos? Du könntest mit einem Kommando an alle gleichzeitig das > HAEN-Bit zu Beginn auf 1 setzen. Ab dem nächsten Zugriff wären sie dann > per Adresse unterscheidbar. Das klingt logisch, vermutlich passiert auch genau das. Ich werde testen. Matthias
Ja, das ist die Erklärung, alle werden gemeinsam beschrieben.
1 | /* MCP_0..MCP_7 --> MCP23S17 mit Hardwareadresse 0..7 */
|
2 | /* nach Reset werden MCP_0..MCP_3 gemeinsam angesprochen, weil HAEN=0 ist */
|
3 | mcp_write_register( MCP_0, MCP_IOCON, HAEN | MIRROR ); |
ist also gleichwertig mit:
1 | mcp_write_register( MCP_0, MCP_IOCON, HAEN | MIRROR ); |
2 | mcp_write_register( MCP_1, MCP_IOCON, HAEN | MIRROR ); |
3 | mcp_write_register( MCP_2, MCP_IOCON, HAEN | MIRROR ); |
4 | mcp_write_register( MCP_3, MCP_IOCON, HAEN | MIRROR ); |
Wenn MCP_4..MCP_7 (auch) existieren, dann muss es nach dem Errata heissen:
1 | /* nach Reset werden MCP_0..MCP_7 gemeinsam angesprochen, weil HAEN=0 ist */
|
2 | /* MCP_4 muss es wegen http://ww1.microchip.com/downloads/en/DeviceDoc/80311a.pdf sein */
|
3 | mcp_write_register( MCP_4, MCP_IOCON, HAEN | MIRROR ); |
Wieder was gelernt. Matthias
Das freut mich! Ja, wenn acht Teilnehmer da sind, musst du zwei Zugriffe machen:
1 | mcp_write_register( MCP_0, MCP_IOCON, HAEN | MIRROR ); |
für einen gemeinsamen Zugriff auf alle Teilnehmer, bei denen A2 = 0 ist und
1 | mcp_write_register( MCP_4, MCP_IOCON, HAEN | MIRROR ); |
für einen gemeinsamen Zugriff auf alle Teilnehmer, bei denen A2 = 1 ist. Ab da kannst du sie über die Adressen 0 bis 7 unterscheiden. Viele Grüße Jochen
Jochen S. schrieb:
1 | mcp_write_register( MCP_4, MCP_IOCON, HAEN | MIRROR ); |
> für einen gemeinsamen Zugriff auf alle Teilnehmer, bei denen A2 = 1 ist.
ist klar.
Bei denen mit A2=0 funktioniert ja das Ignorieren der Adresspins, die
sollten eigentlich auch davon erfasst werden.
Ich versuche das mal nachzustellen, SSOP passt leider schlecht auf ein
Steckbrett. :-(
Matthias
Stimmt, cool! So weit hab ich gar nicht gedacht. Einmal an die "4" gesendet müsste man alle Busteilnehmer erreichen. Hätte man zur Klarstellung und als How-to auch ruhig so ins Errata reinschreiben können, statt es so umständlich zu verklausulieren und bei Workaround "None" anzugeben. Viele Grüße Jochen
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.