Une automobile est une pile roulante de centaines de microcontrôleurs ces jours-ci – Demandez simplement à n’importe quel mécanicien de Greybeard et il commencera son “carburateur”. Tous ces systèmes et sous-systèmes doivent se parler dans un environnement hostile électriquement hostile, et ce n’est pas une exagération de dire que la communication, ni même une communication retardée, peut avoir des conséquences majeures. La mise en réseau de la voiture est une activité importante. La production de masse d’automobiles effectue de nombreux équipements d’émetteur-récepteur pertinent pour le piratage matériel non automobile. Alors, pourquoi ne voyons-nous pas beaucoup plus de projets de pirate informatique qui exploitent cette base de ressources remarquable?

L’épine dorsale du réseau d’une voiture est le réseau de la zone de contrôleur (CAN). Hackaday’s est propre [Eric Supmentchick] est un artisanal extraordinaire et a écrit beaucoup tout ce que vous voudriez savoir sur le bus Can dans une série multipart que vous voudrez certainement faire signe de lecture plus tard. Le moteur, les freins, les portes et toutes les données d’instrumentation (différentiel) peuvent. C’est une fiabilité rapide et élevée. C’est aussi compliqué et un peu cher à mettre en œuvre.

À la fin de 1990, de nombreux producteurs disposaient de leurs propres protocoles de bus propriétaires à côté de la boîte pour les parties non critiques du réseau automobile: la manière dont une console montée à porte parle au chauffeur et aux moteurs de fenêtres de la porte, par exemple. Il ne vaut pas la peine d’encombrer le bus Main Canal avec des communications non critiques et locales comme celle-ci, de sorte que les sous-réseaux ont été renversés de la boîte principale. Celles-ci n’avaient pas besoin de la rapidité ou des garanties de fiabilité du réseau principal et pour des raisons de coût qu’ils devaient être faciles à mettre en œuvre. Le plus petit microcontrôleur devrait suffire à rouler une fenêtre de haut en bas, non?

Au début des années 2000, la spécification du réseau d’interconnexion locale (LIN) standardisait une méthode à ces sous-réseaux, axée sur le faible coût de la mise en œuvre, la vitesse moyenne, la reconfigurabilité et le comportement prévisible de la communication entre un microcontrôleur principal et un petit nombre d’esclaves dans Un groupe. Bon marché, simple, mis en œuvre sur de petits microcontrôleurs et tout simplement pour les projets de moyenne échelle? Un rêve d’un pirate! Pourquoi n’utilisez-vous pas Lin dans vos projets multi-micro? Discutons et vous pouvez voir si l’un de cela est utile pour vous.

Le protocole LIN

Un “groupe” LIN, qui est ce que le mini-réseau local est appelé dans le jargon, consiste en un seul microcontrôleur principal et un certain nombre d’esclaves. Lin démarre en série conventionnelle 8N1 UART, typiquement à 19 200 bauds, et s’éloigne d’un fil. Ensuite, il ajoute un protocole permettant à ce fil unique d’être utilisé comme bus, partagé entre plusieurs esclaves. Si vous avez essayé de rouler votre propre protocole réseau pour une communication série UART EASY UART, vous vous retrouverez avec quelque chose comme Lin. Allez chercher une copie de la spécification (PDF) et lisez!

Chaque transaction LIN est fondamentalement la même: le maître envoie une en-tête comprenant un identifiant protégé (PID), qui spécifie la tâche à effectuer. Les tâches peuvent être quelque chose comme “Capteur de température de rapport 2” ou “Position Set Servo 3”. En fonction de la tâche, entre un et huit octets de données suivez, avec une somme de contrôle à deux octets. Les esclaves doivent savoir quelles tâches pour répondre et comment réagir. Donc, si “SET SERVO 3 POSITION” est envoyé, l’esclave SERVO 3 doit écouter les prochains octets et réagir en conséquence. Tous les esclaves qui ne répondent pas à la commande ne peuvent ignorer les données avant le prochain préambule.

Dans le cas du “capteur de température de rapport 2”, l’esclave avec le capteur de température envoie ses données immédiatement après la réception de la commande. Étant donné que la longueur des octets est connue à l’avance et seule le capteur 2 est autorisé à répondre à cette tâche, le maître sait à écouter exactement, disons, quatre octets de réaction et sait combien de temps cela devrait prendre.

Ce système de vote avec les en-têtes d’envoi principal et les esclaves envoyant des réactions garantit qu’aucun des périphériques n’aura accès au bus en même temps, alors Lin obtient avec une seule ligne RX / TX. Le préambule comprend un octet de synchronisation (0x55) qui aide les esclaves à verrouiller sur l’horloge maître, de sorte que les esclaves peuvent s’exécuter sur des sources d’horloge RC moins chères et une balayage automatique est possible.

Étant donné que la longueur des messages est connue à l’avance, le calendrier de la routine de vote de la maîtrise peut être écrit dans un calendrier. Le maître interroge le réseau aux intervalles définis et si l’esclave ne répond pas dans 1,4 fois le temps requis pour la transaction, il est présumé manquant en action. De toute façon, le maître est sur le point suivant dans son horaire et ne réessayera pas l’esclave potentiellement défectueux jusqu’à ce que son tour revienne. Cela garantit un taux de mise à jour connu pour tous les appareils, ce qui rend la vie beaucoup plus simple pour la programmation du maître.

Ce sont les bases. Le maître envoie des PIDS et une série d’octets de données suivent. Tout est confortable Old Uart, appel et réponse, adapté aussi simplement que possible pour créer un petit réseau.

Suppléments

Application de configuration GUI Lin d’un VI instructifdeo.
Keeping the network that easy requires that the master and slaves all agree on the command set and valid reaction lengths. That’s a lot of information needed for the LIN cluster to function, in principle. helping matters out somewhat, there’s a conventional format for notating all of this laid out in the LIN spec.

There’s also a conventional API for C that both the master and slave microcontrollers can use to make handling coding up behavior in a LIN cluster. Combined, this makes a conventional workflow for specifying and implementing LIN busses — very useful for the automakers, and not useless for the hacker either.

There is also a sleep state and behavior that’s defined for the bus, with associated sleep and wakeup signals. all of the slaves ought to respond to the sleep signal, and any of them ought to automatically go to sleep after a timeout of four seconds if they haven’t heard from the master. any node, slave or master, can send the wakeup command, and after that the master ought to go back to its normal polling schedule.

LIN version 2.0 included a number of optional frame types that make the network much more flexible. In particular, “sporadic frames” make the slave’s reaction optional if it hasn’t gotten any new data because the last update. “Event triggered frames” are like sporadic frames, except they can be additionally responded to by any slave node that has new data.

This introduces the possibility of a collision on the bus, in which case hopefully the checksum doesn’t add up and the master falls back to slave-specific frames as before. These two modes speed up the bus when data updates are infrequent, but add some indeterminacy to the schedule and conditional complexity to the code. use them only if you need them.

The master can also have multiple schedules, and switch among them. The slaves don’t care — they just listen for the tasks that are relevant to them anyway. There’s no reason for the master to send servo position data every period if it hasn’t changed, for instance, even if it makes things conceptually simpler. Ton appel.

There is even an optional carry layer spec that is compatible with CAN bus and makes it simpler to integrate the local LIN cluster with the bigger network. In short, LIN is a very thoroughly thought through UART bus protocol with good industry adoption. You’ll find good tutorials from every vendor of LIN transceiver hardware. (Here’s a terrific intro from national Instruments.)

Hardware — The Physical Layer

Topping all of this protocol niceness off is a broad variety of LIN transceiver chips ranging from $0.25 to $0.50 for plain transceivers, on up to around a buck or two for “system basis” chips with integrated voltage regulators. These are especially slick, because the transceiver can take care of the sleep/wake logic and turn the power supply to your microcontroller on and off. This makes integrating a slave node that operates at 3.3 V very simple.

Little chip purchases you a lot.
Since the LIN bus is developed for automotive, it’s typically specced for 12 V because that’s what courses through the veins of your car’s wiring harness. LIN transceiver hardware needs to be able to accommodate even higher voltages, because automobile electrical systems can be spiky environments. They also have to cope with bus contention, when the transceiver chip may be trying to pull the LIN line down while someone else is trying to pull it up, so there’s overheating protection built in as well. LIN transceivers are robust little beasties.

In contrast to I2C lines, which are pulled up with puny resistors, an automotive LIN bus is pulled up to 12 V with a 1 kΩ resistor. 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.

Strengths and Weaknesses

No bus is ideal for all occasions, and LIN is no exception. LIN is not particularly fast, being developed around 19,200 baud UART. Les mises à jour sont assez rarement rarement, du point de vue d’un microcontrôleur. Une transaction pleine longueur, avec le délai d’attente, prend environ dix millisecondes. Si le maître sondre seize appareils, c’est un taux de mise à jour d’environ sept pires cash-cas. Bien sûr, le maître n’a pas besoin de sonder tous les appareils à chaque fois, et de nombreuses fois, les messages seront de la moitié de cette longueur, mais vous n’allez pas avoir beaucoup plus de 200 Hz. D’autre part, le taux de mise à jour est constant en raison de la capacité d’exécuter des traits d’attente serrés pour des appareils flocons, ce qui est formidable pour la fiabilité et la simplicité, et ce n’est pas si plus lent que I2C.

Il existe deux versions principales de Lin que vous verrez dans la nature, 1.x et 2.x. Outre les types de châssis optionnels abordés ci-dessus, les deux versions ont différentes formules de contrôle – et celle de 2.x est vraiment bizarre – nécessitant une calculatrice Web pour vous assurer que vous le faites bien. Au lieu d’addition MOD-256, ils soustraient 255 de toute valeur de 256 ou plus. C’est comme un débordement de 8 bits qui enveloppe à 1 au lieu de 0. Cela a-t-il un sens à l’un de vous?

Les appareils Lin ne sont pas aussi répandus à l’extérieur de l’industrie automobile comme I2C ou SPI, par un coup long, vous n’avez donc probablement jamais été obligé de gérer le protocole. Mais si vous souhaitez rétablir un petit nombre de modules à base de microcontrôleur, aussi facilement et à moindre coût que possible, en utilisant un seul fil (plus un sol), il est difficile de penser à rien de plus facilement. L’écriture du code esclave I2C n’est certainement aucun pique-nique. Écriture du code pour écouter un octet particulier sur une ligne UART puis réagir pourrait ne pas être plus simple.

Voulez-vous transformer votre UART à la vanille plaine dans un bus? Prenez une page ou deux sur le livre de Lin! L’avez-vous déjà fait? montre nous!

Leave a Reply

Your email address will not be published. Required fields are marked *