реклама на сайте
подробности

 
 
> Правильная инициализация CAN в STM32F103, Как правильно инициализировать и потом менять скорость
LEXIS
сообщение Feb 23 2015, 08:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 10-10-08
Пользователь №: 40 829



Есть контроллер 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);

}


Именно эта функция вызывает смену скорости.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
LEXIS
сообщение Feb 25 2015, 04:16
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 10-10-08
Пользователь №: 40 829



Цитата
Если есть устройста, работающие на другой скорости, ставится шлюз gateway.

Смысл изменения скорости не в том, чтобы соединить разноскоростные устройства, а для тонкой настройки по месту, например, при шумном канале уменьшать скорость. При этом изменение скорости будет происходить для всех устройств одновременно. Либо настраивать запрограммированное устройство на другую скорость.

Цитата
"24.4.1 Initialization mode"

В моем мануале это 23.4.1. или у Вас какой-то другой?

Добавил как написано в мануале
Код
  CAN_DeInit(CANx);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
  CAN1->MCR |= CAN_MCR_INRQ;    // wait while CAN entered to initialization mode    
  while (!(CAN1->MSR & CAN_MSR_INAK));    // CAN to initialization mode
  CAN_StructInit(&CAN_InitStructure);


Как обычно инициализируется, но скорость не переключает.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 08:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016