Есть контроллер STM32F103C6, инициализирую CAN модуль на скорость 500 кб/с. На этой скорости работает. Потом по CAN шине приходит команда на смену скорости - меняю, например, на 600 кб/с. - не работает, хотя если принудительно задать эту скорость изначально - то работает. Как правильно надо менять скорость во время работы.
Функция настройки скорости ниже (опущена инициализация портов, фильтров и прерываний):
CODE
void CAN_Config(unsigned int bitrate)//Kbit/sec
{
char BitTimeCAN=0;
CAN_DeInit(CANx);
CAN_StructInit(&CAN_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
/* CAN Baudrate */
// SetSpeed (bitrate/1000);
switch (bitrate)
{
case 1000: BitTimeCAN = 0;break;
case 950: BitTimeCAN = 1;break;
case 900: BitTimeCAN = 2;break;
case 850: BitTimeCAN = 3;break;
case 800: BitTimeCAN = 4;break;
case 750: BitTimeCAN = 5;break;
case 700: BitTimeCAN = 6;break;
case 650: BitTimeCAN = 7;break;
case 600: BitTimeCAN = 8;break;
case 550: BitTimeCAN = 9;break;
case 500: BitTimeCAN = 10;break;
case 450: BitTimeCAN = 11;break;
case 400: BitTimeCAN = 12;break;
case 350: BitTimeCAN = 13;break;
case 300: BitTimeCAN = 14;break;
case 250: BitTimeCAN = 15;break;
case 200: BitTimeCAN = 16;break;
case 150: BitTimeCAN = 17;break;
case 125: BitTimeCAN = 18;break;
case 100: BitTimeCAN = 19;break;
case 50: BitTimeCAN = 20;break;
case 10: BitTimeCAN = 21;break;
}
CAN_InitStructure.CAN_SJW = CAN_BTR[BitTimeCAN][0];
CAN_InitStructure.CAN_BS1 = CAN_BTR[BitTimeCAN][1];
CAN_InitStructure.CAN_BS2 = CAN_BTR[BitTimeCAN][2];
CAN_InitStructure.CAN_Prescaler = CAN_BTR[BitTimeCAN][3];
CAN_Init(CANx, &CAN_InitStructure);
}
Именно эта функция вызывает смену скорости.