92 lines
2.7 KiB
C
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);
|
|
}
|
|
|
|
|
|
} |