Décoder une trame RS485 à l'oscilloscope

Bonjour à tous,

J'écris actuellement un pilote MicroPython pour la carte MOD-RS485-ISO permettant à un microcontrôleur de dialoguer sur un bus RS485 par l'intermédiaire d'un bus I2C.

J'ai voulu vérifier l'émission sur le bus RS485 de visu en poussant le vis jusqu'au décodage des informations bit par bit.

Exemple d'émission RS485

Le script de test_sender.py envoi une flopée de messages sur le bus RS485 à 9600 bauds par l'intermédiaire d'une MicroPython Pyboard et d'un MOD-RS485-ISO.

PYB: sync filesystems
PYB: soft reboot
MicroPython v1.10 on 2019-01-25; PYBv1.1 with STM32F405RG
Type "help()" for more information.
>>> import test_sender
Setting TX control...
Setting bridged mode...
Setting baud...
Sending...  1/50: MCHobby is the best
Sending...  2/50: MCHobby is the best
...

...
Sending...  47/50: MCHobby is the best
Sending...  48/50: MCHobby is the best
Sending...  49/50: MCHobby is the best
Sending...  50/50: MCHobby is the best
That s all Folks

Voulant vérifier la transmission j'ai branché un oscilloscope sur les signaux A et B (donc en HALF-DUPLEX) puis j'ai fais une capture des signaux.

Capture partielle d'une trame RS485.
Visualisation RS485 A (bleu) et B (rouge).
Résultat de A-B (vert) puisque RS485 est un protocole différentiel.

Maintenant que nous avons un signal type (et son équivalent), nous allons nous pencher sur le décodage de l'information.

Start bit et Stop Bit

Pour commencer, chaque octet fait 8 bits et celui-ci est émis avec un Start bit et un Stop Bit exactement comme sur une ligne série.

Nous devons donc rechercher 10 bits au total par octet.

  • Sur le bus RS485, le niveau 1 est en bas et le niveau 0 en haut.
    C'est exactement l'inverse d'une ligne série / RS232.
  • Le start bit est à 1, donc en bas
  • Le stop bit est à 0, donc en haut

Ce que met en évidence le graphique ci-dessous (en plus des différences de niveau logique).


Sur base de cet information j'ai détecté deux candidats potentiels pouvant représenter des Start Bit (puisqu'il est possible de dénoter un format de trame... mais attention a ne pas tomber trop vite dans le piège!).

Start Bit potentiel

Le mieux aurait été de capturer le début de transmission (donc le premier Start Bit)... mais ce n'est pas toujours possible.

Longueur de la trame

Nous savons que nous avons un débit de 9600 bauds et qu'il faut 10 bits par octet.

9600 baud = 9600 bits par seconde.

1 bit prend donc 1 / 9600 sec = 0.000104 sec = 104 µS

Pour 10 bits, il faudra donc 1040 µS

Côté oscilloscope, la résolution horizontale (l'échelle du temps) est de 500µS par division.

Un octet = 10 bits = 2 divisions horizontales.

Tracer la trame et les bits


C'est le moment d'imprimer votre capture d'écran et de sortir la règle.
Dans mon cas, 2 division fait 3.5cm sur le papier, donc 1/10 = 1 bit = 3.5mm au tracé.

A la fin de chaque trame (2 divisions, 3.5cm sur le papier) débutant au start bit, on doit impérativement se terminer par un stop bit (suivit rapidement d'un start bit).

Voici donc un relevé des trames en bleu (10 bits) avec reprise des start bit en rouge et stop bit en vert.

Trames RS485

Pour rappel: 

  • En RS485 le start bit est un flan descendant, le stop bit est un flan montant.
  • La trame commence au flan descendant du start bit, ni avant, ni après.

Décodage d'un octet

On commence à tracer les 10 bits à partir du front descendant (du Start Bit).

Lecture de l'octet sur le bus RS485

La séquence binaire est 0b00100000 .
Si vous la saisissez dans une console Python, celle-ci est transformée en valeur numérique (soit 32).

En consultant une table ASCII (comme celle www.purebasic.com), l'entier 32 correspond au caractère "espace". Vu qu'il y a plusieurs espace dans le message c'est plausible.

Note: nous avons eu la chance de tomber directement sur un start bit (puisque le stop bit était au bon endroit. Si ce n'était pas le cas... il aurait fallut chercher le start bit ailleurs sur la trame.

Décodage de la trame RS485

Maintenant, nous pouvons poursuivre le décodage des autres octets....

Décodage de la trame - cliquer pour agrandir

Au final, nous obtenons " is t", ce qui correspond bien à une partie du texte émis:

2/50: MCHobby is the best

Conclusion

Une petite recherche très intéressante, pas forcement très académique mais l'approche DIY a néanmoins démontrée qu'il était possible de contrôler le bon fonctionnement de la transmission des informations.

Maintenant, je termine le pilote et m'attaque à DMX (qui utilise RS485).

Aucun commentaire