Привет, не могу запустить CAN, не приходят ответные сообщения. Конфиг железа такой: STM32 CAN -> CAN transceiver -> CAN Device.
CAN Device - это тоже наша разработка, с той стороны все точно работает (!). Обмен данными такой - отправляю с STM32 команду, должен приходить ответ, но не приходит.
Мои настройки CAN:
Код инициализации:
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();
Буду рад любым советам!
А все-таки ответное устройство точно отправляет ответ?
Да, я подключаю его через USB-CAN адаптер, посылаю ту же команду через терминал и ответ приходит верный.
Хорошо, тогда считаем, что в этом узле нет проблемы. А фильтр настроен для CAN в STM32?
Да, вот код, я так понял что при такой настройке все сообщения должны проходить:
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);
Да, вот код, я так понял что при такой настройке все сообщения должны проходить:
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 в действительности.
@greut Попробуй предделитель уменьшить, а TimeSeg1 и TimeSeg2 увеличить, например:
@greut Попробуй предделитель уменьшить, а TimeSeg1 и TimeSeg2 увеличить, например:
Вот это да! Заработало! Огромное спасибо )
Нет проблем )