You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
5.6 KiB

/*
*********************************************************************************************************
*
* 模块名称 : 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) *********************************/