Je pense que je suis d'accord avec vous ! Mais je n'avais pas décortiqué de bibliothèque CAN jusqu'à présent.
Dans le fichier mcp_can_dfs.h
2012 Copyright (c) Seeed Technology Inc. All right reserved.
Author:Loovee
Contributor: Cory J. Fowler
2014-1-16
il y a 2 définitions des paramètres pour les horloges à 16MHz et 8 MHz, exemple :
/*
* clock
*/
#define MCP_16MHz 1
#define MCP_8MHz 2
/*
* speed 16M
*/
#define MCP_16MHz_1000kBPS_CFG1 (0x00)
#define MCP_16MHz_1000kBPS_CFG2 (0xD0)
#define MCP_16MHz_1000kBPS_CFG3 (0x82)
#define MCP_16MHz_500kBPS_CFG1 (0x00)
#define MCP_16MHz_500kBPS_CFG2 (0xF0)
#define MCP_16MHz_500kBPS_CFG3 (0x86)
/*
* speed 8M
*/
#define MCP_8MHz_1000kBPS_CFG1 (0x00)
#define MCP_8MHz_1000kBPS_CFG2 (0x80)
#define MCP_8MHz_1000kBPS_CFG3 (0x00)
#define MCP_8MHz_500kBPS_CFG1 (0x00)
#define MCP_8MHz_500kBPS_CFG2 (0x90)
#define MCP_8MHz_500kBPS_CFG3 (0x02)
Ces valeurs sont utilisées dans mcp_can.cpp, dans mcp2515_configRate(const INT8U canSpeed, const INT8U clock), exemple :
switch (clock)
{
case (MCP_16MHz) :
switch (canSpeed)
{
case (CAN_500KBPS) :
cfg1 = MCP_16MHz_500kBPS_CFG1;
cfg2 = MCP_16MHz_500kBPS_CFG2;
cfg3 = MCP_16MHz_500kBPS_CFG3;
break;
case (CAN_1000KBPS) :
cfg1 = MCP_16MHz_1000kBPS_CFG1;
cfg2 = MCP_16MHz_1000kBPS_CFG2;
cfg3 = MCP_16MHz_1000kBPS_CFG3;
break;
}
case (MCP_8MHz) :
switch (canSpeed)
{
case (CAN_500KBPS) :
cfg1 = MCP_8MHz_500kBPS_CFG1;
cfg2 = MCP_8MHz_500kBPS_CFG2;
cfg3 = MCP_8MHz_500kBPS_CFG3;
break;
case (CAN_1000KBPS) :
cfg1 = MCP_8MHz_1000kBPS_CFG1;
cfg2 = MCP_8MHz_1000kBPS_CFG2;
cfg3 = MCP_8MHz_1000kBPS_CFG3;
break;
}
}
mcp2515_setRegister(MCP_CNF1, cfg1);
mcp2515_setRegister(MCP_CNF2, cfg2);
mcp2515_setRegister(MCP_CNF3, cfg3);
Je pense que ça doit revenir au même, de choisir le couple horloge-vitesse quand il y a le choix de l'horloge, que d'adapter le choix de la vitesse comme vous l'avez expliqué quand la bibliothèque ne propose qu'une seule horloge. Par exemple, choisir CAN_1000KBPS pour avoir un bus à 500k avec une carte dont le quartz est à 8MHz.
Mais votre solution est bien plus simple car la plupart des bibliothèques CAN (dont celle préconisée sur Locoduino) sont écrites pour une horloge à 16MHz seulement.