2025-06-21 17:19:31 +08:00

92 lines
2.7 KiB
C

/*******************************************************************************
* the includes
******************************************************************************/
#include "CanDrv.h"
#include <stdio.h>
/*******************************************************************************
* the defines
******************************************************************************/
#define TEST_ID 0x222
/*******************************************************************************
* the typedefs
******************************************************************************/
/*******************************************************************************
* the globals
******************************************************************************/
extern CAN_HandleTypeDef hcan1;
static CAN_TxHeaderTypeDef txhead;
static uint32_t TxMailbox = CAN_TX_MAILBOX0;
/*******************************************************************************
* the const
******************************************************************************/
/*******************************************************************************
* the functions
******************************************************************************/
uint8_t CanDrv_Init(void)
{
txhead.StdId = TEST_ID;
txhead.IDE = CAN_ID_STD;
txhead.RTR = CAN_RTR_DATA;
txhead.TransmitGlobalTime = DISABLE;
txhead.DLC = 8;
HAL_CAN_Start(&hcan1);
CAN_FilterTypeDef filter;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterIdHigh = 0x7B2 << 5; // 注意:标准 ID 要左移 5 位
filter.FilterMaskIdHigh = 0x7FF << 5;
filter.FilterFIFOAssignment = CAN_RX_FIFO0;
filter.FilterBank = 0;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterActivation = CAN_FILTER_ENABLE;
HAL_CAN_ConfigFilter(&hcan1,&filter);
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
return 0;
}
uint8_t CanDrv_Txmsg(uint16_t id,uint8_t * data)
{
txhead.StdId = id;
HAL_StatusTypeDef ret = HAL_CAN_AddTxMessage(&hcan1,&txhead,data,&TxMailbox);
//printf("ret=%d",ret);
return ret;
}
uint8_t txtestdata[8] = {1,2,3,4,5,6,7,8};
void CanDrv_Test()
{
CanDrv_Txmsg(TEST_ID,txtestdata);
}
uint8_t CanDrv_GetCANTxEmpty(void)
{
uint32_t ret = HAL_CAN_IsTxMessagePending(&hcan1,CAN_TX_MAILBOX0|CAN_TX_MAILBOX1|CAN_TX_MAILBOX2);
if (ret == 0)
{ //空闲
return 1;
}
return 0;
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef rxmsg;
uint8_t data[8];
HAL_CAN_GetRxMessage(hcan,CAN_RX_FIFO0,&rxmsg,data);
if (rxmsg.StdId >= 0x600)
{
printf("get id:0x%03x",rxmsg.StdId);
}
}