371 lines
9.0 KiB
C
371 lines
9.0 KiB
C
|
|
|
|||
|
|
#include "canctrl.h"
|
|||
|
|
|
|||
|
|
#if (COMM_CAN != 0)
|
|||
|
|
|
|||
|
|
#include "trigger.h"
|
|||
|
|
#include "cpuid.h"
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
CanRxCtrl g_canRxCtrl;
|
|||
|
|
CanTxCtrl g_canTxCtrl;
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
void InitCanMsgList(void);
|
|||
|
|
void InitCanFilter(void);
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------------
|
|||
|
|
// Ĭ<>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
void DefaultCanFilter(u8 fifo)
|
|||
|
|
{
|
|||
|
|
HAL_StatusTypeDef halsta;
|
|||
|
|
|
|||
|
|
CAN_FilterTypeDef hFilterConfig;
|
|||
|
|
hFilterConfig.FilterBank = 0; // <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0--13 , <20><>14--27
|
|||
|
|
hFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // <20><><EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λģʽ
|
|||
|
|
hFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ϊ1<CEAA><31>32λ<32><CEBB>
|
|||
|
|
hFilterConfig.FilterIdHigh = 0x0000; // <20>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>32λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA><EFBFBD>߶<EFBFBD>λ<EFBFBD><CEBB>16λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|||
|
|
hFilterConfig.FilterIdLow = 0x0000; // <20>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>32λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA><EFBFBD>Ͷ<EFBFBD>λ<EFBFBD><CEBB>16λλ<CEBB><CEBB>ʱΪ<CAB1>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
hFilterConfig.FilterMaskIdHigh = 0x0000; // <20>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>߹<EFBFBD><DFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>32λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA><EFBFBD>߶<EFBFBD>λ<EFBFBD><CEBB>16λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
|||
|
|
hFilterConfig.FilterMaskIdLow = 0x0000; // <20>趨<EFBFBD><E8B6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>߹<EFBFBD><DFB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD>32λλ<CEBB><CEBB>ʱΪ<CAB1><CEAA><EFBFBD>Ͷ<EFBFBD>λ<EFBFBD><CEBB>16λλ<CEBB><CEBB>ʱΪ<CAB1>ڶ<EFBFBD><DAB6><EFBFBD>)
|
|||
|
|
hFilterConfig.FilterFIFOAssignment = fifo; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO
|
|||
|
|
hFilterConfig.SlaveStartFilterBank = 14; // <20>ӽڵ<D3BD>CAN<41><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CAN<41><4E><EFBFBD><EFBFBD><EFBFBD>壩<EFBFBD><E5A3A9>˫CAN<41><4E>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
hFilterConfig.FilterActivation = CAN_FILTER_ENABLE; // ʹ<>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_ConfigFilter(&HCAN, &hFilterConfig);
|
|||
|
|
|
|||
|
|
printf("DefaultCanFilter at fifo%d, halsta=%d\r\n", fifo, halsta);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
void (*SetCanFilter)(u8) = DefaultCanFilter;
|
|||
|
|
|
|||
|
|
void RegistFilter(void*func)
|
|||
|
|
{
|
|||
|
|
SetCanFilter = (void (*)(u8))func;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
void InitCanCtrl(void)
|
|||
|
|
{
|
|||
|
|
HAL_StatusTypeDef halsta; // ״̬
|
|||
|
|
|
|||
|
|
InitCanMsgList(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ<DDBD><E1B9B9>ʼ<EFBFBD><CABC>
|
|||
|
|
|
|||
|
|
if (SetCanFilter != NULL) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
|
{
|
|||
|
|
SetCanFilter(CAN_FILTER_FIFO0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_ActivateNotification(&HCAN, CAN_IT_RX_FIFO0_MSG_PENDING); // <20><><EFBFBD><EFBFBD>CAN<41><4E><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (halsta != HAL_OK)
|
|||
|
|
{
|
|||
|
|
printf("HAL_CAN_ActivateNotification(&HCAN, CAN_IT_RX_FIFO0_MSG_PENDING) failed\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_ActivateNotification(&HCAN, CAN_IT_RX_FIFO0_FULL); // <20><><EFBFBD><EFBFBD>CAN<41><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (halsta != HAL_OK)
|
|||
|
|
{
|
|||
|
|
printf("HAL_CAN_ActivateNotification(&HCAN, CAN_IT_RX_FIFO0_FULL) failed\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_DeactivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY); // <20>رշ<D8B1><D5B7><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
if (halsta != HAL_OK)
|
|||
|
|
{
|
|||
|
|
printf("HAL_CAN_DeactivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY) failed\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_Start(&HCAN); // <20><><EFBFBD><EFBFBD>CANģ<4E><C4A3>
|
|||
|
|
if (halsta != HAL_OK)
|
|||
|
|
{
|
|||
|
|
printf("HAL_CAN_Start failed\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ƽṹ
|
|||
|
|
void InitCanMsgList(void)
|
|||
|
|
{
|
|||
|
|
memset(&g_canTxCtrl, 0, sizeof(CanTxCtrl));
|
|||
|
|
memset(&g_canRxCtrl, 0, sizeof(CanRxCtrl));
|
|||
|
|
|
|||
|
|
g_canTxCtrl.pktTxListHead = g_canTxCtrl.pktTxList; // ͷָ<CDB7><D6B8>
|
|||
|
|
g_canTxCtrl.pktTxListTail = g_canTxCtrl.pktTxList; // βָ<CEB2><D6B8>
|
|||
|
|
g_canTxCtrl.pktTxNumber = 0; // <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
g_canTxCtrl.sendingFlag = 0;
|
|||
|
|
|
|||
|
|
g_canRxCtrl.pktRxListHead = g_canRxCtrl.pktRxList; // ͷָ<CDB7><D6B8>
|
|||
|
|
g_canRxCtrl.pktRxListTail = g_canRxCtrl.pktRxList; // βָ<CEB2><D6B8>
|
|||
|
|
g_canRxCtrl.pktRxNumber = 0; // <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
/*
|
|||
|
|
HAL_OK = 0x00U,
|
|||
|
|
HAL_ERROR = 0x01U,
|
|||
|
|
HAL_BUSY = 0x02U,
|
|||
|
|
HAL_TIMEOUT = 0x03U,
|
|||
|
|
*/
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int TransCanDataToBus(void)
|
|||
|
|
{
|
|||
|
|
HAL_StatusTypeDef halsta; // <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
u32 tsmBox; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// printf("TransCanDataToBus\r\n");
|
|||
|
|
|
|||
|
|
// <20>Ӷ<EFBFBD><D3B6><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (g_canTxCtrl.pktTxNumber <= 0)
|
|||
|
|
{
|
|||
|
|
//printf("pktTxNumber=%d\r\n", g_canTxCtrl.pktTxNumber);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_AddTxMessage(&HCAN, &(g_canTxCtrl.pktTxListTail->canTxhead) , g_canTxCtrl.pktTxListTail->data, &tsmBox);
|
|||
|
|
//printf("exid=0x%x,tsmBox=%d,halsta=%d\r\n", g_canTxCtrl.pktTxListTail->canTxhead.ExtId, tsmBox,halsta);
|
|||
|
|
if (halsta == HAL_OK)
|
|||
|
|
{
|
|||
|
|
EnterCritical();
|
|||
|
|
g_canTxCtrl.pktTxNumber--;
|
|||
|
|
g_canTxCtrl.pktTxListTail++;
|
|||
|
|
if (g_canTxCtrl.pktTxListTail > &(g_canTxCtrl.pktTxList[TRANS_PKT_LIST_NUM-1]))
|
|||
|
|
{
|
|||
|
|
g_canTxCtrl.pktTxListTail = &(g_canTxCtrl.pktTxList[0]);
|
|||
|
|
}
|
|||
|
|
ExitCritical();
|
|||
|
|
|
|||
|
|
// printf("HAL_OK, g_canTxCtrl.pktTxNumber=%d\r\n", num);
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("TransCanDataToBus:other sta, halsta=%d\r\n", halsta);
|
|||
|
|
return 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int ResvCanDataFromBus(void)
|
|||
|
|
{
|
|||
|
|
HAL_StatusTypeDef halsta;
|
|||
|
|
CanRxMsg rxMsg;
|
|||
|
|
|
|||
|
|
halsta = HAL_CAN_GetRxMessage(&HCAN, CAN_RX_FIFO0, &(rxMsg.canRxhead), rxMsg.data); // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
if (halsta == HAL_OK)
|
|||
|
|
{
|
|||
|
|
//printf("get a can packet:\r\n");
|
|||
|
|
//printf("exid=0x%x\r\n", rxMsg.canRxhead.ExtId);
|
|||
|
|
if (g_canRxCtrl.pktRxNumber < RESV_PKT_LIST_NUM-1) // <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// printf("add to rxlist, add=0x%x\r\n", g_canRxCtrl.pktRxListHead);
|
|||
|
|
memcpy(g_canRxCtrl.pktRxListHead, &rxMsg, sizeof(CanRxMsg));
|
|||
|
|
|
|||
|
|
g_canRxCtrl.pktRxNumber++;
|
|||
|
|
g_canRxCtrl.pktRxListHead++;
|
|||
|
|
if (g_canRxCtrl.pktRxListHead > &(g_canRxCtrl.pktRxList[RESV_PKT_LIST_NUM-1]))
|
|||
|
|
{
|
|||
|
|
g_canRxCtrl.pktRxListHead = &(g_canRxCtrl.pktRxList[0]);
|
|||
|
|
}
|
|||
|
|
//printf("resv RxNum=%d\r\n", g_canRxCtrl.pktRxNumber);
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("can receive buff is full\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("ResvCanDataFromBus:other sta, halsta=%d\r\n", halsta);
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int SendACANDataPacket(CanTxMsg * pMsg)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
if (pMsg == NULL)
|
|||
|
|
{
|
|||
|
|
printf("SendACANDataPacket:para error\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_canTxCtrl.pktTxNumber < TRANS_PKT_LIST_NUM)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
|||
|
|
memcpy(g_canTxCtrl.pktTxListHead, pMsg, sizeof(CanTxMsg)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
EnterCritical();
|
|||
|
|
g_canTxCtrl.pktTxNumber++;
|
|||
|
|
g_canTxCtrl.pktTxListHead++;
|
|||
|
|
if (g_canTxCtrl.pktTxListHead > &(g_canTxCtrl.pktTxList[TRANS_PKT_LIST_NUM-1]))
|
|||
|
|
{
|
|||
|
|
g_canTxCtrl.pktTxListHead = &(g_canTxCtrl.pktTxList[0]);
|
|||
|
|
}
|
|||
|
|
ExitCritical();
|
|||
|
|
|
|||
|
|
if (g_canTxCtrl.sendingFlag == 0) // û<>з<EFBFBD><D0B7><EFBFBD>
|
|||
|
|
{
|
|||
|
|
rslt = TransCanDataToBus(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
if (rslt == 0) // <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>гɹ<D0B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//printf("send a can packet in app\r\n");
|
|||
|
|
g_canTxCtrl.sendingFlag = 1; // <20><><EFBFBD>ñ<EFBFBD>־
|
|||
|
|
HAL_CAN_ActivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (rslt == 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
//printf("send list empty in app\r\n");
|
|||
|
|
g_canTxCtrl.sendingFlag = 0;
|
|||
|
|
HAL_CAN_DeactivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY); // û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͣ<EFBFBD><CDA3>ر<EFBFBD><D8B1>ж<EFBFBD>
|
|||
|
|
}
|
|||
|
|
else // û<>к<EFBFBD><D0BA>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("no mail box in app, start later\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//printf("sendingFlag=1\r\n");
|
|||
|
|
HAL_CAN_ActivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
}
|
|||
|
|
rslt = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("can send buff is full\r\n");
|
|||
|
|
rslt = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
int GetACanDataPacket(CanRxMsg * pMsg)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
if (pMsg == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (g_canRxCtrl.pktRxNumber > 0)
|
|||
|
|
{
|
|||
|
|
memcpy(pMsg, g_canRxCtrl.pktRxListTail, sizeof(CanRxMsg));
|
|||
|
|
|
|||
|
|
EnterCritical();
|
|||
|
|
g_canRxCtrl.pktRxNumber--;
|
|||
|
|
//printf("2.RxNum=%d\r\n", g_canRxCtrl.pktRxNumber);
|
|||
|
|
g_canRxCtrl.pktRxListTail++;
|
|||
|
|
if (g_canRxCtrl.pktRxListTail > &(g_canRxCtrl.pktRxList[RESV_PKT_LIST_NUM-1]))
|
|||
|
|
{
|
|||
|
|
g_canRxCtrl.pktRxListTail = &(g_canRxCtrl.pktRxList[0]);
|
|||
|
|
}
|
|||
|
|
ExitCritical();
|
|||
|
|
|
|||
|
|
rslt = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rslt = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
|
|||
|
|
void CanTransIntProc(void)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
|
|||
|
|
rslt = TransCanDataToBus();
|
|||
|
|
|
|||
|
|
if (rslt == 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7>ͳɹ<CDB3>
|
|||
|
|
{
|
|||
|
|
//printf("send a can packet in int\r\n");
|
|||
|
|
}
|
|||
|
|
else if (rslt == 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// printf("send list empty in int, close int\r\n");
|
|||
|
|
g_canTxCtrl.sendingFlag = 0;
|
|||
|
|
HAL_CAN_DeactivateNotification(&HCAN, CAN_IT_TX_MAILBOX_EMPTY); // û<><C3BB><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͣ<EFBFBD><CDA3>ر<EFBFBD><D8B1>ж<EFBFBD>
|
|||
|
|
}
|
|||
|
|
else // û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
printf("no mail box in int\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CanResvIntProc(void)
|
|||
|
|
{
|
|||
|
|
u32 len;
|
|||
|
|
len = HAL_CAN_GetRxFifoFillLevel(&HCAN, CAN_RX_FIFO0); // <20><><EFBFBD><EFBFBD>
|
|||
|
|
while(len != 0)
|
|||
|
|
{
|
|||
|
|
//printf("get a can packet:\r\n");
|
|||
|
|
ResvCanDataFromBus(); // <20><>ȡ<EFBFBD><C8A1><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
len--;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
|
|||
|
|
// CAN<41><4E><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *pcan)
|
|||
|
|
{
|
|||
|
|
// if (pcan->Instance == CAN1)
|
|||
|
|
{
|
|||
|
|
CanTransIntProc();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CAN<41><4E><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *pcan)
|
|||
|
|
{
|
|||
|
|
// if (pcan->Instance == CAN1)
|
|||
|
|
{
|
|||
|
|
CanTransIntProc();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CAN<41><4E><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϵĻص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *pcan)
|
|||
|
|
{
|
|||
|
|
// if (pcan->Instance == CAN1)
|
|||
|
|
{
|
|||
|
|
CanTransIntProc();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CAN<41><4E><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *pcan)
|
|||
|
|
{
|
|||
|
|
// if (pcan->Instance == CAN1)
|
|||
|
|
{
|
|||
|
|
//printf("rx fifo 0\r\n");
|
|||
|
|
CanResvIntProc();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *pcan)
|
|||
|
|
{
|
|||
|
|
printf("can rx fifo0 full\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
|
|||
|
|
{
|
|||
|
|
printf("can error\r\n");
|
|||
|
|
}
|
|||
|
|
//---------------------------------------------------------
|
|||
|
|
#endif
|
|||
|
|
|