feat(can): apply filters based on both filter ID and mask ID for standard or extended filters

stable
@rakshita4 2024-11-16 16:37:15 +05:30
parent 37c087aaed
commit 23dee00362
1 changed files with 37 additions and 20 deletions

View File

@ -237,15 +237,15 @@ void vCanFilterSaveVal(uint8_t ucIdx, uint32_t Filter, bool isExtended)
filterCount = ucIdx; filterCount = ucIdx;
// Store filter value // Store filter value
filterValues[filterCount] = Filter; filterValues[filterCount] = Filter;
isExtendedID[maskCount++] = isExtended; // isExtendedID[filterCount] = isExtended;
if(isExtended) // if(isExtended)
{ // {
extendedFilter++; // extendedFilter++;
} // }
else // else
{ // {
standardFilter++; // standardFilter++;
} // }
} }
@ -254,8 +254,8 @@ void vCanFilterSaveVal(uint8_t ucIdx, uint32_t Filter, bool isExtended)
void vCanFilterReset() { void vCanFilterReset() {
uint32_t i; uint32_t i;
// Disable CAN before reconfiguring filters
xECU_CANDeInit(CANFD0); DL_MCAN_setOpMode(CANFD0, DL_MCAN_OPERATION_MODE_SW_INIT);
// Reset all standard ID filters // Reset all standard ID filters
for (i = 0; i < MAX_FILTERS; i++) { for (i = 0; i < MAX_FILTERS; i++) {
@ -273,16 +273,35 @@ void vCanFilterReset() {
DL_MCAN_addExtMsgIDFilter(CANFD0, i, &extFilterElement); DL_MCAN_addExtMsgIDFilter(CANFD0, i, &extFilterElement);
} }
// Re-enable CAN after resetting filters /* Set Extended ID Mask. */
xECU_CANInit(CANFD0,g_u16CanSpeed); DL_MCAN_setExtIDAndMask(CANFD0, (0x1FFFFFFFU));
/* Take MCAN out of the SW initialization mode */
DL_MCAN_setOpMode(CANFD0, DL_MCAN_OPERATION_MODE_NORMAL);
} }
// Function to configure CAN filters // Function to configure CAN filters
void vCanConfigFilter() { void vCanConfigFilter() {
xECU_CanReInit(CANFD0,g_u16CanSpeed); xECU_CanReInit(CANFD0,g_u16CanSpeed);
DL_MCAN_setOpMode(CANFD0, DL_MCAN_OPERATION_MODE_SW_INIT); DL_MCAN_setOpMode(CANFD0, DL_MCAN_OPERATION_MODE_SW_INIT);
for (int i = 0; i <= maskCount; i++)
{
if((filterValues[i] > 0x7FF) || (maskValues[i] > 0x7FF))
{
isExtendedID[i] = 1;
extendedFilter++;
}
else
{
isExtendedID[i] = 0;
standardFilter++;
}
}
gMCAN0MsgRAMConfigParamsFiltered.lse = extendedFilter; //0; // Set dynamically based on actual filters gMCAN0MsgRAMConfigParamsFiltered.lse = extendedFilter; //0; // Set dynamically based on actual filters
gMCAN0MsgRAMConfigParamsFiltered.lss = standardFilter; //1; // Set dynamically based on actual filters gMCAN0MsgRAMConfigParamsFiltered.lss = standardFilter; //1; // Set dynamically based on actual filters
DL_MCAN_config(CANFD0, (DL_MCAN_ConfigParams*) &gMCAN0ConfigParamsFiltered); DL_MCAN_config(CANFD0, (DL_MCAN_ConfigParams*) &gMCAN0ConfigParamsFiltered);
@ -290,9 +309,8 @@ void vCanConfigFilter() {
uint8_t extendedFilterNumber = 0; uint8_t extendedFilterNumber = 0;
uint8_t stadardFilterNumber = 0; uint8_t stadardFilterNumber = 0;
for (int i = 0; i < maskCount; i++) {
// filterValues[0] = 0x3ff; for (int i = 0; i <= maskCount; i++) {
// maskValues[0] = 0x400;
if (isExtendedID[i]) { if (isExtendedID[i]) {
// Extended ID filter // Extended ID filter
DL_MCAN_ExtMsgIDFilterElement extFilterElement; DL_MCAN_ExtMsgIDFilterElement extFilterElement;
@ -300,7 +318,7 @@ void vCanConfigFilter() {
extFilterElement.efid2 = maskValues[i]; extFilterElement.efid2 = maskValues[i];
extFilterElement.efec = 001; extFilterElement.efec = 001;
extFilterElement.eft = 10; extFilterElement.eft = 10;
DL_MCAN_addExtMsgIDFilter(CANFD0, i, (DL_MCAN_StdMsgIDFilterElement *) &extFilterElement); DL_MCAN_addExtMsgIDFilter(CANFD0, extendedFilterNumber, (DL_MCAN_StdMsgIDFilterElement *) &extFilterElement);
extendedFilterNumber++; extendedFilterNumber++;
} }
@ -309,8 +327,6 @@ void vCanConfigFilter() {
DL_MCAN_StdMsgIDFilterElement stdFilterElement; DL_MCAN_StdMsgIDFilterElement stdFilterElement;
stdFilterElement.sfid1 = filterValues[i]; stdFilterElement.sfid1 = filterValues[i];
stdFilterElement.sfid2 = maskValues[i]; stdFilterElement.sfid2 = maskValues[i];
// stdFilterElement.sfid1 = 0xc8;
// stdFilterElement.sfid2 = 0x7fe;
stdFilterElement.sfec = 001; stdFilterElement.sfec = 001;
stdFilterElement.sft = 10; stdFilterElement.sft = 10;
DL_MCAN_addStdMsgIDFilter(CANFD0, stadardFilterNumber,(DL_MCAN_StdMsgIDFilterElement *) &stdFilterElement); DL_MCAN_addStdMsgIDFilter(CANFD0, stadardFilterNumber,(DL_MCAN_StdMsgIDFilterElement *) &stdFilterElement);
@ -326,7 +342,7 @@ void vCanConfigFilter() {
// Reset counters after applying filters // Reset counters after applying filters
maskCount = 0; maskCount = 1;
filterCount = 0; filterCount = 0;
extendedFilterNumber = 0; extendedFilterNumber = 0;
stadardFilterNumber = 0; stadardFilterNumber = 0;
@ -371,6 +387,7 @@ void vRTE_UARTDataProcess(void)
vCanFilterSaveVal((pucBuf[PKT_HEADER+1] - 1), filterId, isExtended); vCanFilterSaveVal((pucBuf[PKT_HEADER+1] - 1), filterId, isExtended);
if( pucBuf[PKT_HEADER+2] )//All filter received. Trigger Filter Settings if( pucBuf[PKT_HEADER+2] )//All filter received. Trigger Filter Settings
{ {
vCanFilterReset();
vCanConfigFilter(); vCanConfigFilter();
} }
else else