Top.Mail.Ru
Уведомления
Очистить все

[Решено] Не работает CAN на STM32F103C8T6.

(@greut)
New member

Привет, не могу запустить CAN, не приходят ответные сообщения. Конфиг железа такой: STM32 CAN -> CAN transceiver -> CAN Device.
CAN Device - это тоже наша разработка, с той стороны все точно работает (!). Обмен данными такой - отправляю с STM32 команду, должен приходить ответ, но не приходит.
Мои настройки CAN:

image

Код инициализации:

static void MX_CAN_Init(void)
{

  /* USER CODE BEGIN CAN_Init 0 */

  /* USER CODE END CAN_Init 0 */

  /* USER CODE BEGIN CAN_Init 1 */

  /* USER CODE END CAN_Init 1 */
  hcan.Instance = CAN1;
  hcan.Init.Prescaler = 24;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
  hcan.Init.TimeTriggeredMode = DISABLE;
  hcan.Init.AutoBusOff = DISABLE;
  hcan.Init.AutoWakeUp = DISABLE;
  hcan.Init.AutoRetransmission = DISABLE;
  hcan.Init.ReceiveFifoLocked = DISABLE;
  hcan.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN CAN_Init 2 */

  /* USER CODE END CAN_Init 2 */

}

Отправка просто через:

HAL_CAN_AddTxMessage();

Буду рад любым советам!

Цитата
Создатель темы Размещено : 19.04.2022 17:25
Метки темы
tech
 tech
(@tech)
Level 3

А все-таки ответное устройство точно отправляет ответ?

ОтветитьЦитата
Размещено : 19.04.2022 18:15
(@greut)
New member

Да, я подключаю его через USB-CAN адаптер, посылаю ту же команду через терминал и ответ приходит верный.

ОтветитьЦитата
Создатель темы Размещено : 19.04.2022 19:01
tech
 tech
(@tech)
Level 3

@greut 

Хорошо, тогда считаем, что в этом узле нет проблемы. А фильтр настроен для CAN в STM32?

ОтветитьЦитата
Размещено : 20.04.2022 17:01
(@greut)
New member

Да, вот код, я так понял что при такой настройке все сообщения должны проходить:

CAN_FilterTypeDef canFilterConfig;
canFilterConfig.FilterBank = 0;
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
canFilterConfig.FilterIdHigh = 0x0000;
canFilterConfig.FilterIdLow = 0x0000;
canFilterConfig.FilterMaskIdHigh = 0x0000;
canFilterConfig.FilterMaskIdLow = 0x0000;
canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
canFilterConfig.FilterActivation = ENABLE;
canFilterConfig.SlaveStartFilterBank = 14;
HAL_CAN_ConfigFilter(&hcan, &canFilterConfig);
ОтветитьЦитата
Создатель темы Размещено : 20.04.2022 17:48
tech
 tech
(@tech)
Level 3
От: @greut

Да, вот код, я так понял что при такой настройке все сообщения должны проходить:

CAN_FilterTypeDef canFilterConfig;
canFilterConfig.FilterBank = 0;
canFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
canFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
canFilterConfig.FilterIdHigh = 0x0000;
canFilterConfig.FilterIdLow = 0x0000;
canFilterConfig.FilterMaskIdHigh = 0x0000;
canFilterConfig.FilterMaskIdLow = 0x0000;
canFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
canFilterConfig.FilterActivation = ENABLE;
canFilterConfig.SlaveStartFilterBank = 14;
HAL_CAN_ConfigFilter(&hcan, &canFilterConfig);

Да, тут тоже все верно. Надо по-хорошему посмотреть осциллографом, что отправляет STM32 в действительности.

ОтветитьЦитата
Размещено : 20.04.2022 20:03
Aveal
(@aveal)
Top level Admin

@greut Попробуй предделитель уменьшить, а TimeSeg1 и TimeSeg2 увеличить, например:

ОтветитьЦитата
Размещено : 20.04.2022 20:14
(@greut)
New member
От: @aveal

@greut Попробуй предделитель уменьшить, а TimeSeg1 и TimeSeg2 увеличить, например:

Вот это да! Заработало! Огромное спасибо )

 

ОтветитьЦитата
Создатель темы Размещено : 21.04.2022 11:03
Aveal
(@aveal)
Top level Admin

Нет проблем )

ОтветитьЦитата
Размещено : 21.04.2022 17:04
Поделиться: