/* ********************************************************************************************************* * * 模块名称 : FDCAN驱动模块 * 文件名称 : bsp_can.c * 版 本 : V1.0 * 说 明 : CAN驱动. * * 修改记录 : * 版本号 日期 作者 说明 * V1.0 2018-11-14 armfly 正式发布 * * Copyright (C), 2018-2030, 安富莱电子 www.armfly.com * ********************************************************************************************************* */ #include "bsp_can.h" #include "bsp_msg.h" #include "fdcan.h" /* 启用CAN1,需要将V7主板上的J12、J13两个跳线帽都插到1-2脚。(缺省是不插) 启用CNA2,硬件无需跳线,以太网功能需要屏蔽(有引脚复用) */ /* FDCAN1 GPIO定义 */ #define FDCAN1_TX_PIN GPIO_PIN_12 #define FDCAN1_TX_GPIO_PORT GPIOA #define FDCAN1_TX_AF GPIO_AF9_FDCAN1 #define FDCAN1_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() #define FDCAN1_RX_PIN GPIO_PIN_11 #define FDCAN1_RX_GPIO_PORT GPIOA #define FDCAN1_RX_AF GPIO_AF9_FDCAN1 #define FDCAN1_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() FDCAN_HandleTypeDef hfdcan1; FDCAN_FilterTypeDef sFilterConfig1; /* FDCAN1 GPIO定义 */ #define FDCAN2_TX_PIN GPIO_PIN_13 #define FDCAN2_TX_GPIO_PORT GPIOB #define FDCAN2_TX_AF GPIO_AF9_FDCAN2 #define FDCAN2_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define FDCAN2_RX_PIN GPIO_PIN_12 #define FDCAN2_RX_GPIO_PORT GPIOB #define FDCAN2_RX_AF GPIO_AF9_FDCAN2 #define FDCAN2_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() FDCAN_FilterTypeDef sFilterConfig2; FDCAN_RxHeaderTypeDef g_Can2RxHeader; uint8_t g_Can2RxData[64]; /* ********************************************************************************************************* * 函 数 名: bsp_InitCan1 * 功能说明: 初始CAN1 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitCan1(void) { } /* ********************************************************************************************************* * 函 数 名: bsp_InitCan2 * 功能说明: 初始CAN2 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_InitCan2(void) { MX_FDCAN2_Init(); } /* ********************************************************************************************************* * 函 数 名: bsp_DeInitCan1 * 功能说明: 释放CAN1 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_DeInitCan1(void) { HAL_FDCAN_MspDeInit(&hfdcan1); } /* ********************************************************************************************************* * 函 数 名: bsp_DeInitCan2 * 功能说明: 释放CAN2 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_DeInitCan2(void) { HAL_FDCAN_MspDeInit(&hfdcan2); } /* ********************************************************************************************************* * 函 数 名: HAL_FDCAN_RxFifo0Callback * 功能说明: CAN中断服务程序-回调函数 * 形 参: hfdcan * 返 回 值: 无 ********************************************************************************************************* */ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) { if (hfdcan == &hfdcan2) { /* Retreive Rx messages from RX FIFO0 */ if(HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &g_Can2RxHeader, g_Can2RxData)==HAL_OK) { /* Activate Rx FIFO 0 watermark notification */ HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0); if(g_Can2RxHeader.Identifier == 0x110 && g_Can2RxHeader.IdType == FDCAN_STANDARD_ID) { if(g_Can2RxData[0]==0x55) { Update_EN = 1; } } if (g_Can2RxHeader.Identifier == 0x222 && g_Can2RxHeader.IdType == FDCAN_STANDARD_ID) { bsp_PutMsg(MSG_CAN2_RX, 0); /* 发消息收到数据包,结果在g_Can1RxHeader, g_Can1RxData */ } } } } /* ********************************************************************************************************* * 函 数 名: can2_SendPacket * 功能说明: 发送一包数据 * 形 参:_DataBuf 数据缓冲区 * _Len 数据长度, 0-8字节 * 返 回 值: 无 ********************************************************************************************************* */ FDCAN_TxHeaderTypeDef TxHeader; void can2_SendPacket(uint8_t *_DataBuf, uint8_t _Len) { if (_Len > 8) { return; } /* Prepare Tx Header */ TxHeader.Identifier = 0x1FF; TxHeader.IdType = FDCAN_STANDARD_ID; TxHeader.TxFrameType = FDCAN_DATA_FRAME; TxHeader.DataLength = (uint32_t)_Len << 16; TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; TxHeader.BitRateSwitch = FDCAN_BRS_OFF; TxHeader.FDFormat = FDCAN_CLASSIC_CAN; TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; TxHeader.MessageMarker = 0; /* Add messages to TX FIFO */ HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, _DataBuf); } /* ********************************************************************************************************* * 函 数 名: FDCAN1_IT0_IRQHandler * 功能说明: CAN中断服务程序 * 形 参: hfdcan * 返 回 值: 无 ********************************************************************************************************* */ void FDCAN1_IT0_IRQHandler(void) { HAL_FDCAN_IRQHandler(&hfdcan1); } void FDCAN1_IT1_IRQHandler(void) { HAL_FDCAN_IRQHandler(&hfdcan1); } void FDCAN2_IT1_IRQHandler(void) { HAL_FDCAN_IRQHandler(&hfdcan2); } void FDCAN_CAL_IRQHandler(void) { HAL_FDCAN_IRQHandler(&hfdcan1); HAL_FDCAN_IRQHandler(&hfdcan2); // ??? } /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/