/******************************************************************************* * the includes ******************************************************************************/ #include "CanDrv.h" #include /******************************************************************************* * 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); } }