optical/NxBase/canctrl.c

371 lines
9.0 KiB
C
Raw Permalink Normal View History

2025-09-04 01:45:08 +00:00
#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