hier ein kurzer Bericht zu Problemen mit dem MAX485:
Auf einer Platine habe ich den RS485-Transceiver MAX485CSA+ verbaut.
Diese Platine habe ich schon über 100 Mal erfolgreich aufgebaut.
Jetz hat bei der letzten 20er-Serie bei 15 Platinen die Kommunikation nicht funktioniert.
Nach längerer Suche habe ich festgestellt, dass der MAX485CSA+ sich nicht so verhält wie im Datenblatt angegeben.
Dort steht in Table 2: Receiving:
Input a-b >= +0.2 V => Output 1
Input a-b <= -0.2 V => Output 0
Inputs open => Output 1
Die nicht funktionierenden Chips liefern aber bei Inputs open den Output 0 und bringen dadurch die serielle Kommunikation aus dem Takt. Sie haben oben die Markierung "MAX485 CSA+ 201" und unten "Z TAIWAN PK".
Die funktionierenden Chips haben oben die Markierung "MAX485 CSA+ 305", unten "Z TAIWAN RS".
Ich habe die nicht funktionierenden gegen solche mit der Markierung 305 getauscht, das hat das Problem bei allen betroffenen Platinen beseitigt.
Die funktionierenden stammen von Farnell. Ich habe noch Chips aus zwei Lieferungen von Farnell, bei beiden haben alle Chips die Markierung "305".
Woher die nicht funktionierenden Chips stammen, kann ich nicht mit Sicherheit sagen.
Die nicht funktionierenden Chips liefern aber bei Inputs open den Output
0 und bringen dadurch die serielle Kommunikation aus dem Takt. Sie haben
oben die Markierung "MAX485 CSA+ 201" und unten "Z TAIWAN PK".
Auf dem Oszi sieht man, dass bei Ruhe auf den Leitungen A und B (d.h. etwa 0,2 V auf beiden Leitungen) der Receive-Pin bei den "falschen" auf low geht, bei den "richtigen" auf high.
Die nicht funktionierenden Chips liefern aber bei Inputs open den Output
0 und bringen dadurch die serielle Kommunikation aus dem Takt
Man kann sich bei RS485 Empfängern nicht darauf verlassen, welcher Pegel erkannt wird, wenn die Eingänge offen sind.
Normalerweise werden die Eingänge zumindest am Busende mit 120 Ohm abgeschlossen. Damit dann sicher über 0.2V erkannt werden, muss der Strom vom pull up an A und pull down an B zumindest 1.66mA betragen, an 5V also maximal 1k5. Wie sind deine pull up/down ausgelegt, oft finde ich unzureichende 4k7 (oder an 3.3V mehr als 1k).
Es kann gut sein, dass sie dir andere Chips mit MAX485 Marking geliefert haben. Es gibt taugliche Chips von vielen Herstellern, pinkompatibel. Sie unterscheiden sich teils deutlich in Stromaufnahme, ESD Festigkeit und Slewrate. Ein RS485 sollte aber mit jedem funktionieren (damit der Einkauf die billigsten wählen kann).
Die nicht funktionierenden Chips liefern aber bei Inputs open den Output
0 und bringen dadurch die serielle Kommunikation aus dem Takt.
Es mag ja sein das an den Chips irgendwas anders ist, aber dein Design ist auch mist. Zuerst solltest du mal deine Software auf einen Level bringen wo sie mit sowas klar kommt. Und danach kannst du dann noch zwei Widerstaende einfuegen die bei offenen Eingang fuer etwas Bias sorgen. Dann hast du eine Hardware die mit der harten Welt da draussen klar kommt...
Und klar, es mag sein das jemand die umgelabelt hat. Es gibt RS485 Driver ja relativ zahlreich. Auch wenn es erstaunlich waere wenn Farnell sowas verkauft.
Dort steht in Table 2: Receiving:
Input a-b >= +0.2 V => Output 1
Input a-b <= -0.2 V => Output 0
Inputs open => Output 1
Das stimmt zwar, nur wird das in den DC ELECTRICAL CHARACTERISTICS nirgends spezifiziert. Da steht nur, daß die Schwelle zwischen -0,2V und +0,2V liegen muß. Solange das eingehalten wird, ist der IC also in Ordnung.
Im Gegensatz dazu ist bei RS-232 ICs der Zustand bei 0V eindeutig spezifiziert, ab <0,8V geht RxIN auf high.
Ein RS485 Transceiver muß seinen Ausgang für mindestens eine Bitzeit enablen, damit die Receiver die Startflanke eindeutig erkennen können.
Sofort loszusenden, ist bad practice. Ebenso sollte nach dem letzten Stopbit der Sender noch eine Bitzeit aktiv bleiben.
Empfohlen ist es außerdem, wenn man den RS-485 mit Ziehwiderständen oder Stromquellen so vorspannt, daß bei offenem Bus immer >0,2V anliegen.
Die nicht funktionierenden Chips liefern aber bei Inputs open den Output
0 und bringen dadurch die serielle Kommunikation aus dem Takt.
"Inputs open" heißt, dass sie mit nichts verbunden sind. In der Praxis ist das aber nicht der Fall, weil die Terminierungs-Widerstände noch vorhanden sind.
Für deine Anwendung brauchst du Transceiver mit 'echtem' Fail-Safe, die auch bei Idle oder Kurzschluss (also A − B = 0 V) eine 1 ausgeben. Auf der ersten Seite des MAX485-Datenblatts sind solche unter "Next Generation Device Features" aufgelistet, z.B. MAX3085.
Das ist genau die gleiche Tabelle wie beim MAX485. Er tut es nur nicht - jedenfalls die fraglichen Bauteile nicht.
Zu den bisherigen Hinweisen:
Die Leitungen sind alle geschirmt, das Oszi zeigt saubere Signale.
Die Leitungen A und B sind mit 120 Ohm terminiert.
Ja, man könnte die Leitungen mit Pullup und Pulldown fail-safe "vorspannen", um im High-Z-Fall eine Differenz > 0.2 V sicherzustellen. Das ist im Datenblatt aber so nicht gefordert. Und es würde die Last auf den Treiber erhöhen (Unit Loads), so dass man insgesamt weniger Transceiver verbinden kann also momentan (laut Datenblatt 32 Stück).
Morgen poste ich Fotos von den fraglichen Bauteilen.
Das ist genau die gleiche Tabelle wie beim MAX485. Er tut es nur nicht -
jedenfalls die fraglichen Bauteile nicht.
Ein Maxim IC zu fälschen ist deutlich lukrativer als ein billiges Generika.. Wenn also ein anderes IC die fragliche Eigenschaft, auf die man Wert legt, besitzt, is man mit dem preiswerten Nachbau besser dran, zumindest wenn man ihn aus vertrauenswürdiger Quelle bezieht (das sind für mich Versender, wo explizit dabei steht, welchen Hersteller und welche Baureihe ich bekomme)
Also TME, Digikey, Mouser und auch LCSC.
guarantees a logic-high receiver output when the receiver inputs are open
or shorted. This means that the receiver output will be a logic high if
all transmitters on a terminated bus are disabled (high impedance).
Unten links der einzige, der korrekt funktioniert, mit Markierung 305.
Alle anderen funktionieren so wie oben beschrieben falsch.
Der unten rechts ist umgedreht wegen der Aufschrift auf der Unterseite.
Auf dem dritten Bild noch einmal so groß wie möglich.
Alle anderen funktionieren so wie oben beschrieben falsch.
Nein, sie verhalten sich korrekt. Der MAX485 hat sehr schwache Pull-Up- und -Down-Widerstände an den Eingängen. Diese funktionieren nur, wenn die Eingänge offen sind, aber nicht, wenn sie durch den Terminierungswiderstand kurzgeschlossen sind.
Um einen definierten Ausgabewert mit Terminierung zu erhalten, brauchst du einen Transceiver mit "Shorted Inputs Fail-Safe", z.B. MAX3085.