Forum: Mikrocontroller und Digitale Elektronik LIN Bus als physischer Layer für UART


von Reinhard (reinhard_k118)


Lesenswert?

Hallo,

ich habe ein Board (mit Display und WLAN) welches ich gerne über 30 
Meter mit drei Leitungen mit einem anderen (noch nicht entwickelten) 
Gerät verbinden möchte. Nachdem das zweite Board auch versorgt werden 
muss bleibt nur mehr eine Leitung für die Kommunikation. Kann ich an 
sich auf beiden Seiten einen LIN Transceiver setzen und als Protokoll 
was eigenes auf Basis von UART? Der eingesetzte Controller hat keine LIN 
Unit und dann wird es mit dem Sync und Break ja haarig. Aber an sich 
muss ich ja nicht LIN konform sein, nachdem beides proprietär ist. 
Ausbaustufe wären nämlich denkbar mit mehreren Geräten (Display als 
Master).

Danke
Reinhard

: Bearbeitet durch User
von Achim M. (minifloat)


Lesenswert?

hi,

LIN-Unit braucht man nicht unbedingt.

Reinhard schrieb:
> Der eingesetzte Controller hat keine LIN Unit und dann wird es mit dem
> Sync und Break ja haarig.

Break lässt sich bei vielen UARTs als Framing-Error detektieren. Easy.

Sync geht mit einem Capture-Timer der einen seiner Inputs auf dem 
UART-RX Pin legen kann (Bitzeit vermessen). Wenn du allerdings Quarze 
auf beiden Enden der Kommunikation hast, kannst du auch einfach nur auf 
die 0x55 warten und brauchst keinen Timer.

MODBUS wäre vielleicht auch eine Alternative zu LIN. LIN-Transceiver 
ruhig behalten und als Single-Wire-UART-Bus betreiben.

mfg mf

von Rainer W. (rawi)


Lesenswert?

Reinhard schrieb:
> Ausbaustufe wären nämlich denkbar mit mehreren Geräten (Display als
> Master).

LIN ist im physikalischen Layer zu Gunsten einer geringen 
Störausstrahlung nicht übermäßig schnell. Wenn dir das für deine 
Anwendung reicht - ok.

von Reinhard (reinhard_k118)


Lesenswert?

Rainer W. schrieb:
> LIN ist im physikalischen Layer zu Gunsten einer geringen
> Störausstrahlung nicht übermäßig schnell. Wenn dir das für deine
> Anwendung reicht - ok.

Nein ist in Ordnung. Ein paar Byte pro Sekunde.

Also wenn ich proprietär einfach UART sende/empfange sollte es klappen?

von Achim M. (minifloat)


Lesenswert?

Ja.
Jeder Knoten sieht auch sein eigenes TX. Der RX-Task muss also wissen ob 
der Knoten selber sendet, im einfachsten Fall eben RX ignorieren, bis 
senden fertig. Und, LIN ist nur bis 19200bd spezifiziert.
Wird schon.
mfg mf

von Jens W. (jensw)


Lesenswert?

@Achim M:
bist du da sicher, dass das funktioniert?
So wie beschrieben müsste man doch zwei LIN Master zusammenschalten. Das 
kann doch nicht gehen. Da wird es sicher zu Kollisionen kommen. Man kann 
also nicht sicher sein, dass die Nachricht ankommt. Und wenn man das 
abfangen will, dann kann man auch den LIN rudimentär implementieren. Das 
ist auch nicht mehr Aufwand.
Elektrisch geht aber nichts kaputt. Die LIN-Leitung ist kurzschlussfest.

Bei Microchip gibt es fertige Implementierungen für LIN Master und Slave 
als App Note.
Und bei den anderen kann man das auch finden und portieren.
Oder hier:
https://github.com/open-LIN/open-LIN-c


Grüße, Jens

von Bauform B. (bauformb)


Lesenswert?

Jens W. schrieb:
> So wie beschrieben müsste man doch zwei LIN Master zusammenschalten.

mit einem eigenen Protokoll würde auch das gehen, aber anscheinend soll 
es
nur einen Master geben:

Reinhard schrieb:
> Ausbaustufe wären nämlich denkbar mit mehreren Geräten (Display als
> Master).

von Bruno V. (bruno_v)


Lesenswert?

Wenn Du das halb Duplex im Griff hast (nur einer sendet) brauchst Du nur 
dafür zu sorgen, dass Dein Ruhepegel Deinen Aktiv-Pegel nicht stört. 
Also pull-up (oder down) und Diode oder oben drain.

Wenn es langsam ist und Du kein Protokoll selber strickst, kannst Du z.b
 Can auf einer Leitung nutzen.

von Reinhard (reinhard_k118)


Lesenswert?

Bruno V. schrieb:
> Wenn es langsam ist und Du kein Protokoll selber strickst, kannst Du z.b
>  Can auf einer Leitung nutzen.

Die Idee find ich gut

von Ge L. (Gast)


Lesenswert?

Reinhard schrieb:
> (...) Kann ich an
> sich auf beiden Seiten einen LIN Transceiver setzen und als Protokoll
> was eigenes auf Basis von UART?

Ja, dem Transceiver ist das egal. Der macht nur level shifting von TTL 
nach 12V open collector.

von Max M. (Gast)


Lesenswert?

Reinhard schrieb:
> Kann ich an
> sich auf beiden Seiten einen LIN Transceiver setzen und als Protokoll
> was eigenes auf Basis von UART?

Du kannst machen was immer Du willst, wenn Du zu nichts kompatibel sein 
musst.
Es muss auch kein Lin Transceiver sein.
DALI überträgt z.B. Versorgungsspannung + Daten.
Der Uart sendet / empfängt Daten und ein taugliches Protokoll stellt auf 
beiden Seiten die Sende- / Empfangsrichtung um.
2Draht Power + Daten sind also auch kein Problem und Reichweite bekommst 
Du durch niedrige Datenrate.

von Rudolph R. (rudolph)


Lesenswert?

LIN ist auf Basis von UART, also das Protokoll, nicht der 
physikalische Teil hinter dem Transceiver.
Die LIN Einheiten in manchen Controller machen die Software einfacher, 
ohne geht es aber auch.
8N1 und go

Ein Break lässt sich auch mit einem UART senden, man muss nur die 
Datenrate so weit senken das 8 Null-Bits aussehen wie 13+ Null-Bits bei 
der nominellen Datenrate - und das erzeugt auf der anderen Seite wie 
oben erwähnt einen Frame Error.

Also warum dann nicht gleich LIN implementieren? :-)
So mit Break, Sync, ID, Parity und Checksumme.

Wobei ich Sync bisher weitgehend ignoriert habe, auf beiden Seiten ein 
Quarz und fertig.

Anhand der ID ergibt sich dann ob der Master noch Daten sendet,
oder ob der Slave mit Daten + Checksumme antwortet.

von Bruno V. (bruno_v)


Lesenswert?

Reinhard schrieb:
>> Wenn es langsam ist und Du kein Protokoll selber strickst, kannst Du z.b
>>  Can auf einer Leitung nutzen.
>
> Die Idee find ich gut

Dann suche nach "Single Wire CAN".

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.