A automobile is a rolling pile of hundreds of microcontrollers these days — just ask any greybeard mechanic and he’ll start his “carburetor” rant. all of these systems and sub-systems need to talk to each other in an electrically hostile environment, and it’s not an exaggeration to say that miscommunication, or even delayed communication, can have major consequences. In-car networking is major business. Mass production of automobiles makes numerous of the relevant transceiver ICs low-cost for the non-automotive hardware hacker. So why don’t we see much more hacker projects that leverage this remarkable resource base?
The backbone of a car’s network is the Controller area Network (CAN). Hackaday’s own [Eric Evenchick] is a car-hacker extraordinaire, and wrote up many everything you’d want to know about the CAN bus in a multipart series that you’ll certainly want to bookmark for reading later. The engine, brakes, doors, and all instrumentation data reviews (differential) CAN. It’s fast and high reliability. It’s also complicated and a bit expensive to implement.
In the late 1990, numerous producers had their own proprietary bus protocols running alongside CAN for the non-critical parts of the automotive network: how a door-mounted console talks to the door-lock chauffeur and window motors, for instance. It isn’t worth cluttering up the main CAN bus with non-critical and local communications like that, so sub-networks were spun off the main CAN. These didn’t need the speed or reliability guarantees of the main network, and for cost reasons they had to be easy to implement. The smallest microcontroller ought to suffice to roll a window up and down, right?
In the early 2000s, the local Interconnect Network (LIN) specification standardized one method to these sub-networks, focusing on low cost of implementation, medium speed, reconfigurability, and predictable behavior for communication between one master microcontroller and a small number of slaves in a cluster. Cheap, simple, implementable on small microcontrollers, and just best for medium-scale projects? A hacker’s dream! Why are you not using LIN in your multiple-micro projects? Let’s dig in and you can see if any of this is helpful for you.
The LIN Protocol
A LIN “cluster”, which is what the local mini-network is called in the jargon, consists of a single master microcontroller and a number of slaves. LIN starts off as conventional 8N1 UART serial, typically at 19,200 Baud, and does away with one wire. Next, it adds a protocol that allows this single wire to be used as a bus, shared among multiple slaves. If you tried to roll your own network protocol for easy UART serial communications, you’d end up with something like LIN. Go fetch a copy of the specification (PDF) and read along!
Every LIN transaction is fundamentally the same: the master sends a header that includes a protected identifier (PID), which specifies the task to be carried out. tasks can be something like “report temperature sensor 2” or “set servo 3 position”. depending on the task, between one and eight bytes of data follow, with a two-byte checksum. The slaves have to know which tasks to respond to, and how to respond. So if “set servo 3 position” is sent, the servo 3 slave needs to listen for the next bytes and react accordingly. All slaves that don’t respond to the command can disregard data until the next preamble.
In the case of “report temperature sensor 2”, the slave with the temperature sensor sends its data right away after receiving the command. because the byte length is known in advance, and only sensor 2 is allowed to respond to this task, the master knows to listen for exactly, say, four bytes in reaction and knows how long that ought to take.
This polling system with the master sending headers and the slaves sending reactions guarantees that none of the devices will access the bus at the same time, so LIN gets by with just a single RX/TX line. The preamble includes a sync byte (0x55) that helps the slaves lock on to the master clock, so the slaves can run on less expensive RC clock sources and auto-bauding is possible.
Since the length of messages is known ahead of time, the timing for the master’s polling routine can be written down in a schedule. The master polls the network at defined intervals, and if the slave doesn’t respond within 1.4 times the required time for the transaction, it’s presumed to be missing in action. Either way, the master is on to the next item in its schedule, and won’t retry the potentially defective slave until its turn comes around again. This guarantees a known update rate for all of the devices, which makes life a lot simpler for programming the master.
Those are the basics. The master sends PIDs, and a series of data bytes follows. Everything’s comfy old UART, call and response, adapted as simply as possible to create a small network.
Πρόσθετα
GUI LIN configuration app from an instructive video.
Κρατώντας το δίκτυο που απαιτεί εύκολο ότι ο πλοίαρχος και οι σκλάβοι συμφωνούν όλοι στο σύνολο εντολών και τα έγκυρα μήκη αντίδρασης. Αυτές είναι πολλές πληροφορίες που απαιτούνται για τη λειτουργία του Lin, κατ ‘αρχήν. Βοηθώντας να σημειώσει κάπως, υπάρχει μια συμβατική μορφή για να σημειωθεί όλα αυτά που αναφέρονται στο Spec.
Υπάρχει επίσης ένα συμβατικό API για το C ότι τόσο οι Master όσο και οι μικροελεγκτές σκλάβων μπορούν να χρησιμοποιήσουν για να κάνουν το χειρισμό της κωδικοποίησης συμπεριφοράς σε ένα τεμάχιο LIN. Συνδυασμός, αυτό κάνει μια συμβατική ροή εργασίας για τον προσδιορισμό και την εφαρμογή των λεωφορείων Lin – πολύ χρήσιμη για τους αυτοκινητοβιομηχανίες, και όχι άχρηστο για τον χάκερ.
Υπάρχει επίσης μια κατάσταση ύπνου και συμπεριφορά που ορίζεται για το λεωφορείο, με συσχετισμένα σήματα ύπνου και αφύπνισης. Όλοι οι σκλάβοι θα έπρεπε να ανταποκριθούν στο σήμα ύπνου και οποιοσδήποτε από αυτούς θα πρέπει να πάει αυτόματα να κοιμηθεί μετά από ένα χρονικό όριο τεσσάρων δευτερολέπτων, αν δεν έχουν ακούσει από τον πλοίαρχο. Οποιοσδήποτε κόμβος, σκλάβος ή ο κύριος, μπορεί να στείλει την εντολή WakeUp και μετά από αυτό ο Δάσκαλος θα έπρεπε να επιστρέψει στο κανονικό πρόγραμμα δημοσκόπησης.
Το Lin Version 2.0 περιλάμβανε έναν αριθμό προαιρετικών τύπων πλαισίων που κάνουν το δίκτυο πολύ πιο ευέλικτο. Συγκεκριμένα, τα “σποραδικά πλαίσια” κάνουν την αντίδραση του σκλάβου προαιρετικά αν δεν έχει πάρει νέα δεδομένα, διότι η τελευταία ενημέρωση. Τα “Πλαίσια που προκλήθηκαν εκδήλωση” είναι σαν τα σποραδικά πλαίσια, εκτός από την επιπρόσθετα να ανταποκριθούν σε οποιονδήποτε σκλάβο κόμβο που έχει νέα δεδομένα.
Αυτό εισάγει τη δυνατότητα σύγκρουσης στο λεωφορείο, οπότε ελπίζουμε ότι το checksum δεν θα προσθέσει και ο πλοίαρχος πέφτει πίσω στα πλαίσια συγκεκριμένων σε σκλάβους όπως πριν. Αυτές οι δύο λειτουργίες επιταχύνουν το λεωφορείο όταν οι ενημερώσεις δεδομένων είναι σπάνια, αλλά προσθέστε κάποια αόριστη στην πολυπλοκότητα του χρονοδιαγράμματος και υπό όρους στον κώδικα. Χρησιμοποιήστε τα μόνο αν τα χρειάζεστε.
Ο Δάσκαλος μπορεί επίσης να έχει πολλά χρονοδιαγράμματα και να αλλάξει μεταξύ τους. Οι σκλάβοι δεν ενδιαφέρονται – ακούνε απλώς τα καθήκοντα που τους σχετίζονται ούτως ή άλλως. Δεν υπάρχει κανένας λόγος για τον πλοίαρχο να στείλει δεδομένα σερβο θέσης κάθε περίοδο εάν δεν έχει αλλάξει, για παράδειγμα, ακόμη και αν κάνει τα πράγματα εννοιολογικά απλούστερα. Η κλήση σου.
Υπάρχει ακόμη και ένα προαιρετικό στοιχείο στρώματος μεταφοράς που είναι συμβατό με το λεωφορείο CAN και το καθιστά απλούστερο να ενσωματώσει το τοπικό cluster Lin με το μεγαλύτερο δίκτυο. Εν ολίγοις, το Lin είναι μια πολύ καλά σκεφτόμαστε μέσω του πρωτοκόλλου λεωφορείου του UART με καλή υιοθεσία της βιομηχανίας. Θα βρείτε καλά μαθήματα από κάθε προμηθευτή του Hardware Pranceiver Lin. (Εδώ είναι μια καταπληκτική εισαγωγή από εθνικά όργανα.)
Υλικό – το φυσικό στρώμα
Η τοποθέτηση όλων αυτών των πρωτοκόλλων είναι μια ευρεία ποικιλία τσιπ πομποδέκτη που κυμαίνεται από $ 0,25 έως $ 0.50 για απλούς πομποδέκτες, σε έως και γύρω από ένα buck ή δύο τσιπς συστήματος με ενσωματωμένες ρυθμιστές τάσης. Αυτά είναι ιδιαίτερα κηλίδες, επειδή ο πομποδέκτης μπορεί να φροντίσει τη λογική ύπνου / αφύπνισης και να ενεργοποιήσει και να απενεργοποιήσει την παροχή ρεύματος στον μικροελεγκτή. Αυτό καθιστά την ενσωμάτωση ενός σκλάβου κόμβου που λειτουργεί σε 3.3 V πολύ απλή.
Το μικρό τσιπ σας αγοράζει πολλά.
Δεδομένου ότι το λεωφορείο Lin αναπτύσσεται για την αυτοκινητοβιομηχανία, είναι τυπικά τεκμηριωμένο για 12 V επειδή αυτό είναι που μαθήματα μέσα από τις φλέβες της πλεξούδας καλωδίωσης του αυτοκινήτου σας. Το υλικό του πομποδέκτη Lin πρέπει να είναι σε θέση να φιλοξενήσει ακόμη υψηλότερες τάσεις, επειδή τα ηλεκτρικά συστήματα αυτοκινήτων μπορούν να είναι περιβάλλοντα Spiky. Πρέπει επίσης να αντιμετωπίσουν τον ισχυρισμό των λεωφορείων, όταν το τσιπ του πομποδέκτη μπορεί να προσπαθεί να τραβήξει τη γραμμή Lin κάτω, ενώ κάποιος άλλος προσπαθεί να το τραβήξει, έτσι υπάρχει υπερθέρμανση προστασίας. Οι πομποδέκτες LIN είναι ισχυρά μικρά θηλάζοι.
Σε αντίθεση με τις γραμμές I2C, οι οποίες τραβιούνται με ταμπόν αντιστάτες, ένα λεωφορείο για την αυτοκινητοβιομηχανία τραβιέται μέχρι 12 V με αντίσταση 1 kΩ. To pull this line down fast enough, LIN transceivers need to be able to conduct tens of milliamps, so they have slightly beefy (for ICs) transistors built in. The combination of a high voltage and relatively high line current implies that an automotive-spec LIN bus is good for 40 meters, rather than the couple meters that I2C gives you without resorting to drivers. If you need the distance or the noise immunity, LIN is there for you.
But nothing forces you to run your bus at 12 V, even the transceiver hardware. The Microchip transceivers that I’ve seen run down to 5.5 V, while the ones from NXP and Melexis run down at an Arduino-compatible 5 V.
And nothing forces you to use transceiver hardware at all! You could simply connect a PNP transistor (or P-channel MOSFET) to the bus line and drive that with the UART TX, sampling the bus with the RX line. This has the drawback of local echo, but that could be handled in software. Or, with only a few much more parts, there’s this service that we’ve seen before. I couldn’t find any hacker projects implementing LIN transceivers from scratch, though. maybe that’s because the industrial ones are just so cheap.
Δυνατά σημεία και αδυναμίες
No bus is ideal for all occasions, and LIN is no exception. LIN is not particularly fast, being developed around 19,200 baud UARΤ. Οι ενημερώσεις έρχονται αρκετά σπάνιες, από την προοπτική του μικροελεγκτή. Μια συναλλαγή πλήρους μήκους, με χρονικό όριο, διαρκεί περίπου δέκα χιλιοστά του δευτερολέπτου. Εάν οι κύριες δημοσκοπήσεις δεκαέξι συσκευές, αυτό είναι ένα ποσοστό ενημέρωσης περίπου επτά χειρότερης θήκης της Hertz. Φυσικά, ο Δάσκαλος δεν χρειάζεται να δημοσιοποιήσει κάθε συσκευή κάθε φορά και πολλές φορές τα μηνύματα θα είναι το ήμισυ αυτού του μήκους, αλλά δεν πρόκειται να πάρετε πολλά περισσότερα από 200 Hz. Από την άλλη πλευρά, ο ρυθμός ενημέρωσης είναι σταθερός λόγω της δυνατότητας εκτέλεσης στεγανών χρόνων για τις συσκευές Flaky, η οποία είναι καταπληκτική για την αξιοπιστία και την απλότητα, και δεν είναι τόσο πιο αργή από το i2c.
Υπάρχουν δύο κύριες εκδόσεις του Lin που θα δείτε στην άγρια φύση, 1.x και 2.x. Εκτός από τους προαιρετικούς τύπους πλαισίων που συζητήθηκαν παραπάνω, οι δύο εκδόσεις έχουν διαφορετικούς τύπους ελέγχου – και το ένα στο 2.x είναι πραγματικά παράξενο – που απαιτείται ένας υπολογιστής με βάση το Web για να βεβαιωθείτε ότι το κάνετε σωστό. Αντί της προσθήκης mod-256, αφαιρέστε το 255 από οποιαδήποτε τιμή 256 ή μεγαλύτερη. Είναι σαν μια υπερχείλιση 8-bit που περιτυλίγει γύρω στο 1 αντί του 0. Μήπως αυτό έχει νόημα σε κάποιον από σας;
Οι συσκευές LIN δεν είναι τόσο διαδεδομένες έξω από την αυτοκινητοβιομηχανία ως I2C ή SPI, με μακρύ πυροβολισμό, οπότε πιθανότατα δεν έχετε αναγκαστεί ποτέ να αντιμετωπίσετε το πρωτόκολλο. Αλλά αν θέλετε να δίνετε σε ένα μικρό αριθμό μονάδων με βάση το μικροελεγκτή, όσο το δυνατόν πιο εύκολα και φθηνά, χρησιμοποιώντας μόνο ένα καλώδιο (Plus Ground), είναι δύσκολο να σκεφτείτε κάτι ευκολότερο. Η σύνταξη του κώδικα Slave I2C σίγουρα δεν υπάρχει πικνίκ. Ο κώδικας γραφής για να ακούσετε ένα συγκεκριμένο byte σε μια γραμμή UART και στη συνέχεια αντιδράστε δεν θα μπορούσε να είναι απλούστερη.
Θέλετε να μετατρέψετε την απλή-βανίλια σας UART σε ένα λεωφορείο; Πάρτε μια σελίδα ή δύο από το βιβλίο Lin! Έχετε κάνει ήδη; ΔΕΙΞΕ μας!