Auteur Sujet: Les cartes CAN en 8MHz  (Lu 171 fois)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 631
    • Voir le profil
Les cartes CAN en 8MHz
« le: septembre 12, 2017, 06:21:10 pm »
Comme je suis en train de faire ma propre bibliothèque pour le 2515, je regarde en détails son fonctionnement ainsi que les normes et recommandations pour la mise en œuvre d'un bus CAN.

Via la configuration on détermine le débit du bus.

La durée d'un bit est quantifiée en TQ (Time Quantum). Cette durée est divisées en 4 segments successifs dans le temps :
1 - Le segment de synchronisation (SyncSeg) qui est de durée fixe : 1 TQ
2 - Le segment de propagation (PropSeg) qui permet de tenir compte du temps de propagation du signal dans le bus. Il peut être programmé de 1 à 8 TQ
3 - Le segment de phase 1 (PS1), également programmable entre 1 et 8 TQ
4 - Le segment de phase 2 (PS2), programmable entre 2 et 8 TQ (plus loin dans la datasheet, c'est de 1 à 8, enfin passons)

Par ailleurs il y a des contraintes :
a - PropSeg + PS1 ≥ PS2
b - PropSeg + PS1 ≥ 2

l'échantillonnage du bit présent sur le bus est réalisé à la fin de PS1 et doit se situé entre 60 et 70% de la durée du bit d'après Microchip mais pour CANOpen et DeviceNet c'est 87,5 et la norme ARINC dit 75%.

TQ est dérivé de l'oscillateur dédié au 2515 (Fosc = 16MHz habituellement, 8MHz sur les cartes chinoises) via un Baud Rate Prescaler (BRP) sur 6 bits et qui peut donc avoir une valeur comprise entre 0 et 63 :

TQ = 2 x (BRP + 1) / Fosc

Donc avec Fosc = 16MHz et BRP = 0 (division minimum), on a TQ = 125µs et pour faire un bit, il faut 8 x TQ

Par exemple, la bibliothèque mcp_can utilise les valeurs suivantes pour un bus à 1Mbits :

BRP = 0 (TQ = 125µs)
PropSeg =  1 TQ (0)
PS1 = 3 TQ (2)
PS2 = 3 TQ (2)

Avec le SyncSeg qui dure 1 TQ, on a bien 8 TQ. L'échantillonnage est à 5/8 = 62,5%

Avec un carte à 8MHz, on a 4 x TQ de 250µs pour faire la durée du bit. Comme le SyncSeg prend 1 TQ, il en reste 3 (PropSeg = 1, PS1 = 1 et PS2 = 1) et ça coince car à priori PS2 est au mini à 2 TQ. Je ne suis pas persuadé qu'on puisse atteindre 1Mb avec un quartz à 8MHz.
« Modifié: septembre 12, 2017, 06:25:30 pm par Jean-Luc »

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 641
  • 100% Arduino et N
    • Voir le profil
Re : Les cartes CAN en 8MHz
« Réponse #1 le: septembre 12, 2017, 08:15:06 pm »
Bonjour Jean-Luc,

Excellente contribution, en vue d'établir une bibliothèque de référence pour Locoduino, peut-être ?

J'ai remarqué que plusieurs versions circulent et des mises à jour de la version citée dans l'article sur le CAN provoquent des questions.

Je vais tâcher de suivre au plus près, merci  ;D

Amicalement
Dominique
“Those who predict the future we call futurists. Those who know when the future will happen we call billionaires.” Horace Dediu

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 631
    • Voir le profil
Re : Les cartes CAN en 8MHz
« Réponse #2 le: septembre 15, 2017, 03:07:57 pm »
Je confirme que PS2 doit être compris entre 2 et 8. En effet, PS2 peut être raccourcis de 1 (ou plus si sa valeur est > 2) pour synchroniser les nœuds. Comme il ne peut pas devenir nul, il doit au minimum être à 2

Par conséquent, on ne peut pas configurer le bus en 1Mb avec des cartes dont le quartz est à 8MHz

Dominique

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 641
  • 100% Arduino et N
    • Voir le profil
Re : Les cartes CAN en 8MHz
« Réponse #3 le: septembre 15, 2017, 06:58:52 pm »
Mais à 500kb/s c'est peut-être possible ?

J'ai réglé mon bus à 500kb/s et j'en suis satisfait. Pour le moment je n'utilise que des cartes Locoduino à 16 MHz.

Il faudrait que j'essaye d'y connecter une des petites cartes à 8Mhz et voir si ça marche.
Je n'ai juste pas assez de temps en ce moment.
“Those who predict the future we call futurists. Those who know when the future will happen we call billionaires.” Horace Dediu

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 631
    • Voir le profil
Re : Les cartes CAN en 8MHz
« Réponse #4 le: septembre 15, 2017, 07:14:54 pm »
À 500kb, pas de soucis, c'est comme 1Mb avec un quartz à 16MHz  :)

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 631
    • Voir le profil
Re : Les cartes CAN en 8MHz
« Réponse #5 le: septembre 24, 2017, 12:07:12 pm »
J'avance sur ma bibliothèque.

Plutôt que de calculer des configurations à la main, j'ai, en m'inspirant de ce qui est fait dans la bibliothèque FlexCAN pour le Teensy, implémenté un algo qui calcule automatiquement la configuration.

À partir de la fréquence du quartz du 2515 et de la vitesse demandée pour le bus, une config de bit timing est engendrée de manière à respecter les contraintes et minimiser l'erreur de vitesse.

Voici quelques unes des vitesses possibles avec une erreur nulle pour un quartz à 16MHz (j'ai fait varier la vitesse de 100 en 100). De gauche à droite on a le découpage de la transmission d'un bit : Sync segment, Propagation Segment, Phase segment 1, Phase Segment 2. La vitesse du bus, le Baud Rate Prescaler, le nombre de Time Quanta, le positionnement du sample point (en pour 1000) sachant qu'il doit être compris entre 60 et 70% d'après la datasheet, l'erreur de vitesse en absolu, l'erreur en parties par million (PPM). Il existe évidemment d'autre configs pour lesquelles l'erreur n'est pas nulle. La tolérance est de 600 PPM.

Je n'ai pas tout mis car il y a 636 configurations possibles avec un PPM plus petit que 1.

+-+--------+--------+--------+
| |        |        |        | Baud=5000 BRP=64 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=6400 BRP=50 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+-------+-------+--------+
| |       |       |        | Baud=7400 BRP=47 TQCount=23 SamplePoint=652 error=0 PPM=0
+-+-------+-------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=8000 BRP=40 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+-------+-------+--------+
| |       |       |        | Baud=9400 BRP=37 TQCount=23 SamplePoint=652 error=0 PPM=0
+-+-------+-------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=10000 BRP=32 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=12500 BRP=32 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+--------+--------+--------+
| |        |        |        | Baud=12800 BRP=25 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=16000 BRP=20 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=20000 BRP=16 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=25000 BRP=16 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+--------+--------+--------+
| |        |        |        | Baud=32000 BRP=10 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=40000 BRP=8 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=50000 BRP=8 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=62500 BRP=8 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+--------+--------+--------+
| |        |        |        | Baud=64000 BRP=5 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=80000 BRP=4 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=100000 BRP=4 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=125000 BRP=4 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+--------+--------+--------+
| |        |        |        | Baud=160000 BRP=2 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=200000 BRP=2 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=250000 BRP=2 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+--------+--------+--------+
| |        |        |        | Baud=320000 BRP=1 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=400000 BRP=1 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=500000 BRP=1 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+---+---+---+
| |   |   |   | Baud=800000 BRP=1 TQCount=10 SamplePoint=700 error=0 PPM=0
+-+---+---+---+
+-+---+-+---+
| |   | |   | Baud=1000000 BRP=1 TQCount=8 SamplePoint=625 error=0 PPM=0
+-+---+-+---+

Même chose avec un quartz à 8MHz. Il existes 639 configurations avec le PPM < 1.

+-+--------+--------+--------+
| |        |        |        | Baud=2500 BRP=64 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=3200 BRP=50 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+-------+-------+--------+
| |       |       |        | Baud=3700 BRP=47 TQCount=23 SamplePoint=652 error=0 PPM=0
+-+-------+-------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=4000 BRP=40 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+-------+-------+--------+
| |       |       |        | Baud=4700 BRP=37 TQCount=23 SamplePoint=652 error=0 PPM=0
+-+-------+-------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=5000 BRP=32 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=6400 BRP=25 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=8000 BRP=20 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=10000 BRP=16 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=12500 BRP=16 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+--------+--------+--------+
| |        |        |        | Baud=16000 BRP=10 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=20000 BRP=8 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=25000 BRP=8 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+--------+--------+--------+
| |        |        |        | Baud=32000 BRP=5 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+--------+--------+--------+
| |        |        |        | Baud=40000 BRP=4 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=50000 BRP=4 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=62500 BRP=4 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+--------+--------+--------+
| |        |        |        | Baud=80000 BRP=2 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=100000 BRP=2 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=125000 BRP=2 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+--------+--------+--------+
| |        |        |        | Baud=160000 BRP=1 TQCount=25 SamplePoint=680 error=0 PPM=0
+-+--------+--------+--------+
+-+------+------+-------+
| |      |      |       | Baud=200000 BRP=1 TQCount=20 SamplePoint=650 error=0 PPM=0
+-+------+------+-------+
+-+-----+-----+-----+
| |     |     |     | Baud=250000 BRP=1 TQCount=16 SamplePoint=687 error=0 PPM=0
+-+-----+-----+-----+
+-+---+---+---+
| |   |   |   | Baud=400000 BRP=1 TQCount=10 SamplePoint=700 error=0 PPM=0
+-+---+---+---+
+-+---+-+---+
| |   | |   | Baud=500000 BRP=1 TQCount=8 SamplePoint=625 error=0 PPM=0
+-+---+-+---+
+-+-+-+--+
| | | |  | Baud=800000 BRP=1 TQCount=5 SamplePoint=600 error=0 PPM=0
+-+-+-+--+

La plus haute vitesse possible de communication entre une carte à 16MHz et une carte à 8MHz est de 800000 (vitesse maximum de la carte à MHz). La config CAN_1000KBPS de la lib mcp_can pour une carte 8MHz est incorrecte.
« Modifié: septembre 24, 2017, 12:21:29 pm par Jean-Luc »