PCA9555 (I2C Expander) reagiert komisch

Gast #324498
Lesenswert?

Hi,
wie im PDF dargestellt, so ist mein PCA9555 an den I2C Bus
angeschlossen. Nun teste ich gerade meine Software aus, habe aber so
einige Probleme damit:
Habe folgendes zum Testen geschrieben (schicke hier nur die Register,
die ich der Reihenfolge nach sende);

Version 1:
unsigned char outpMw[6];   /* diese 8 Bytes werden bei Waerme gesendet
*/
outpMw[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMw[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMw[2] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMw[3] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMw[4] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMw[5] = 0xFF;           /* vom Port 1 sollen alle Laempchen brennen
*/

So habe ich das Datenblatt verstanden, d.h. er schreibt automatisch ins
nächste Register.

Was passiert??
Es brennen alle LEDs mit geraden Zahlen, außer das LED10 es ist also,
als hät ich aus den POORT0 0xAA und auf den PORT1 0xA8.


Version 2 (nun sage ich jedesmal, in welches Register er schreiben
soll):

unsigned char outpMx[8];
outpMx[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMx[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMx[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outpMx[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMx[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMx[5] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMx[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outpMx[7] = 0xFF;           /* vom Port 1 sollen alle, außer die beiden
letzten beiden Laempchen brennen */


unsigned char outp00[8];    /* diese 8 Bytes werden werden wieder auf
Null gesetzt */
outp00[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outp00[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outp00[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outp00[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outp00[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outp00[5] = 0x00;           /* vom Port 0 soll kein Laempchen brennen
*/
outp00[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outp00[7] = 0x00;           /* vom Port 1 soll kein Laempchen brennen
*/

unsigned char outpMx[8];
outpMx[0] = 0x06;           /* Das erste Konfigurationsregister wird
nun angesprochen */
outpMx[1] = 0x00;           /* Port 0 wird als Ausgang definiert */
outpMx[2] = 0x07;           /* Das zweite Konfigurationsregister wird
nun angesprochen */
outpMx[3] = 0x00;           /* Port 1 wird als Ausgang definiert */
outpMx[4] = 0x02;           /* Das erste Output-Port wird angesprochen
*/
outpMx[5] = 0xFF;           /* vom Port 0 sollen alle Laempchen brennen
*/
outpMx[6] = 0x03;           /* Das zweite Output-Port wird angesprochen
*/
outpMx[7] = 0xFF;           /* vom Port 1 sollen alle, außer die beiden
letzten beiden Laempchen brennen */


Was passiert??
Es brennen nur noch LED12, LED14 und LED16 und nur LED2/4/6/8 blinken
ganz kurz auf. Es ist also, als hätte ich auf Port 0 0x00 und auf Port
1 0x8A geschrieben.

Noch als Anmerkung: Ich sende immer alles auf einmal, also erst Start,
dann die Adresse und dann jeweils das Array "am Stück" und dann Ende.


Was mach ich falsch? Muß ich ein bestimmtes Timing beachten? Fällt euch
was dazu ein?
Angehängte Dateien:
Gast #324500
Lesenswert?

So funktioniert es!!!

unsigned char outdefP0[2];
outdefP0[0] = 0x06;
outdefP0[1] = 0x00;

unsigned char outdefP1[2];
outdefP1[0] = 0x07;
outdefP1[1] = 0x00;

unsigned char outpMP0[2];
outpMP0[0] = 0x02;
outpMP0[1] = 0xFF;

unsigned char outpMP1[2];
outpMP1[0] = 0x03;
outpMP1[1] = 0xFF;


Tja, da schreibt man den halben Tag irgendwelche dummen Tests, aber das
ich alles in kleinen, einzelnen Packeten schicke, dass hab ich nicht
versucht.
Jetzt funktioniert es so, wie ich es will.

Verstehen tu ich es aber nicht wirklich, denn meiner Meinung nach muss
es doch am Stück zum Senden auch gehen, oder??

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