Initialisierung vom DS2408 (1-Wire-Port-Expander) - Probleme

Gast #738895
Lesenswert?

Hat jemand Erfahrung mit dem DS2408? Der Chip scheint in meiner 
Schaltung, in der er als 8x-Eingang benutzt wird, nach dem ersten 
Einschalten zufällig einige seiner IO-Leitungen auf Ausgang zu stellen, 
d.h. reagiert nicht auf angelegte Signale oder Pull-ups.

Den Reset-Pin habe ich auf VCC gelegt und die Initalisierung schreibt 
0xff mit dem "channel access write command" (um die 
Ausgangs-Transistoren abzuschalten). Danach sollten die IO-Bits 
eigentlich wegen der Pull-Ups auf 1 gehen. Der Chip antwortet auf die 
geschrieben 0xff zwar mit 0xaa (= "OK"), aber danach kommt - zumindest 
beim ersten Einschalten - nicht der erwartete Wert 0xff. Nach dem zweite 
Einschalten klappt es dann.

Der Chip wird mit VCC versorgt und hat einen 100N-Kondensator zwischen 
den Supply-Pins.

 -- initalization code, fails randomly (verify != 0xff))  ---
|
| /*! Initialize DS2408 IO chip
|  *
|  *  This function will turn all output transistors off
|  *
|  *  <bus>   Bitmask of the bus where the DS2408 is located.
|  *
|  *  <id>    64 bit identifier of the DS2408
|  *
|  *  Return: void
|  */
|
| unsigned char
| OWI_InitDS2408(unsigned char bus, unsigned char *id)
| {
|     // any 1-wire device on bus (reset, detect presence)?
|
|     uint8_t tries;
|
|     for (tries = 0; tries < 8; ++tries)
|     {
|         if (OWI_DetectPresence(bus))
|         {
|             // match ID
|
|             OWI_MatchRom(id, bus);
|
|             // send write command
|
|             OWI_SendByte(DS2408_CHANNEL_ACCESS_WRITE, bus);
|
|             // write 0xff to turn off all output transistors
|
|             OWI_SendByte(0xff, bus);
|
|             // write inverted value (= checksum)
|
|             OWI_SendByte(0x0 , bus);
|
|             // check ok flag
|
|             if (OWI_ReceiveByte(bus) == 0xaa)
|             {
|                 uint8_t verify = OWI_ReceiveByte(bus);
|
|                 if (verify == 0xff)
|                 {
|                     return(1);
|                 }
|                 else
|                 {
|                     char    out[16];
|                     uint8_t n;
|
|                     sprintf(out, "%d", verify);
|
|                     lcd_puts(out);
|
|                     for (n = 0; n < 100; ++n)
|
|                          _delay_ms(10);
|                 }
|             }
|
|             beep();
|         }
|     }
|
|
|     // error
|
|     return(0);
| }
Gast #739369
Lesenswert?

Falls es jemanden interessiert: Problem gelöst, es ist ein Chip-Bug. Bei 
bestimmten Power-On-Bedingungen landet der Chip in einem 
undokumentierten Test-Modus und reagiert nicht mehr richtig: die ganze 
1-Wire-Kommunikation läuft noch, der Chip scheint zu leben, aber 
Schreibvorgänge in das Output-Register werden nicht mehr ausgeführt. Die 
Lösung ist ein ebenfalls im Datenblatt nicht dokumentiertes Kommando, 
den Test-Modus zu verlassen. Die Details dazu findet man im 
Maxim-1-Wire-Forum (http://discuss.dalsemi.com) im Thread "Ds2408 Power 
Up With Pins Off?".
Gast #1093701
Lesenswert?

Da ich mit dem DS2408 einen Microcontroller als 1-Wire-Client anbinden 
will, interessiert mich dieses Thema doch brennend ;-)

Leider läßt sich auf das Maxim-1-Wire-Forum nur noch mit bestehenden 
alten Accounts zugreifen, neue Accounts werden nicht akzeptiert.

Kann mir jemand den Inhalt des Threads verraten? Also, wie man diesen 
Testmodus wieder verlassen kann.

Danke und einen guten Rutsch
Rolf
#1098022
Lesenswert?

Vielen Dank für Deine Mühe!

Ich denke, mit dem Kommando für das Verlassen des Test-Modus komme ich 
weiter, sollte ich tatsächlich Probleme bekommen. Ich will einen DS2408 
einsetzen, um einen Microcontroller als Slave an den 1-Wire-Bus zu 
hängen und das sollte schon zuverlässig funktionieren...

Viele Grüße
Rolf

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