105 lines
2.6 KiB
C
105 lines
2.6 KiB
C
![]() |
/*
|
|||
|
* CanCallBacks.c
|
|||
|
*
|
|||
|
* Created on: 23 авг. 2023 г.
|
|||
|
* Author: on4ip
|
|||
|
*/
|
|||
|
#include "CAN_API.h"
|
|||
|
|
|||
|
void initCAN(enum CAN_API_BAUD baud) {
|
|||
|
|
|||
|
|
|||
|
CAN_FilterTypeDef sFilterConfig;
|
|||
|
hcan2.Instance = CAN2;
|
|||
|
hcan2.Init.Prescaler = 5;
|
|||
|
hcan2.Init.Mode = CAN_MODE_NORMAL;
|
|||
|
hcan2.Init.SyncJumpWidth = CAN_SJW_1TQ;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_1TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_7TQ;
|
|||
|
hcan2.Init.TimeTriggeredMode = DISABLE;
|
|||
|
hcan2.Init.AutoBusOff = DISABLE;
|
|||
|
hcan2.Init.AutoWakeUp = DISABLE;
|
|||
|
hcan2.Init.AutoRetransmission = DISABLE;
|
|||
|
hcan2.Init.ReceiveFifoLocked = DISABLE;
|
|||
|
hcan2.Init.TransmitFifoPriority = DISABLE;
|
|||
|
|
|||
|
switch(baud)
|
|||
|
{
|
|||
|
case CAN_BAUD_125:
|
|||
|
hcan2.Init.Prescaler = 20;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_15TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_2TQ;
|
|||
|
break;
|
|||
|
case CAN_BAUD_250:
|
|||
|
hcan2.Init.Prescaler = 10;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_15TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_2TQ;
|
|||
|
break;
|
|||
|
case CAN_BAUD_500:
|
|||
|
hcan2.Init.Prescaler = 10;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_1TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_7TQ;
|
|||
|
break;
|
|||
|
case CAN_BAUD_1000:
|
|||
|
hcan2.Init.Prescaler = 5;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_1TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_7TQ;
|
|||
|
break;
|
|||
|
default:
|
|||
|
hcan2.Init.Prescaler = 5;
|
|||
|
hcan2.Init.TimeSeg1 = CAN_BS1_1TQ;
|
|||
|
hcan2.Init.TimeSeg2 = CAN_BS2_7TQ;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
if (HAL_CAN_Init(&hcan2) != HAL_OK) {
|
|||
|
Error_Handler();
|
|||
|
}
|
|||
|
|
|||
|
sFilterConfig.FilterBank = 0;
|
|||
|
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
|
|||
|
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
|
|||
|
sFilterConfig.FilterIdHigh = 0x0000;
|
|||
|
sFilterConfig.FilterIdLow = 0x0000;
|
|||
|
sFilterConfig.FilterMaskIdHigh = 0x0000;
|
|||
|
sFilterConfig.FilterMaskIdLow = 0x0000;
|
|||
|
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
|
|||
|
sFilterConfig.FilterActivation = ENABLE;
|
|||
|
sFilterConfig.SlaveStartFilterBank = 14;
|
|||
|
if (HAL_CAN_ConfigFilter(&hcan2, &sFilterConfig) != HAL_OK) {
|
|||
|
/* Filter configuration Error */
|
|||
|
Error_Handler();
|
|||
|
}
|
|||
|
|
|||
|
HAL_CAN_Start(&hcan2);
|
|||
|
|
|||
|
/*##-4- Activate CAN RX notification #######################################*/
|
|||
|
if (HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING)
|
|||
|
!= HAL_OK) {
|
|||
|
/* Notification Error */
|
|||
|
Error_Handler();
|
|||
|
}
|
|||
|
}
|
|||
|
CAN_RxHeaderTypeDef RxHeader1;
|
|||
|
uint8_t RxData1[8];
|
|||
|
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) {
|
|||
|
/* Get RX message */
|
|||
|
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &RxHeader1, RxData1) != HAL_OK)
|
|||
|
{
|
|||
|
/* Reception Error */
|
|||
|
Error_Handler();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
CAN_RxHeaderTypeDef RxHeader0;
|
|||
|
uint8_t RxData0[8];
|
|||
|
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
|
|||
|
{
|
|||
|
/* Get RX message */
|
|||
|
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader0, RxData0) != HAL_OK)
|
|||
|
{
|
|||
|
/* Reception Error */
|
|||
|
Error_Handler();
|
|||
|
}
|
|||
|
}
|