104 lines
2.6 KiB
C
104 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();
|
||
}
|
||
}
|