Обновление

This commit is contained in:
cfif 2026-04-20 12:24:16 +03:00
parent bf6303a3ef
commit a58f53ebe2
2 changed files with 51 additions and 34 deletions

View File

@ -45,6 +45,7 @@ typedef struct
{ {
FLEXCAN_IdType eRxFrameType; /**< FLEXCAN ID type, 0 STD, 1 EXT */ FLEXCAN_IdType eRxFrameType; /**< FLEXCAN ID type, 0 STD, 1 EXT */
uint32_t u32RxCanId; /**< FLEXCAN received ID */ uint32_t u32RxCanId; /**< FLEXCAN received ID */
uint32_t u32RxCanIdMask;
uint8_t filter; uint8_t filter;
} FilterTo_FLEXCAN_RxMbFilterType; } FilterTo_FLEXCAN_RxMbFilterType;
@ -67,8 +68,8 @@ typedef struct {
uint32_t g_u32RxDataIndex; uint32_t g_u32RxDataIndex;
FLEXCAN_RxMbFilterType pRxFilterList[32]; FLEXCAN_RxMbFilterType pRxMbFilterList[32];
FLEXCAN_RxMbFilterType pRxFilterFifoList[32]; // FLEXCAN_RxMbFilterType pRxFilterFifoList[32];
osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataQueue[COUNT_QUEUE];
osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE];
@ -86,7 +87,7 @@ typedef struct {
uint8_t DMA_BUF_LEN_RX; uint8_t DMA_BUF_LEN_RX;
uint8_t pBufCounter; uint8_t pBufCounter;
FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX; FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX;
can_rx_message_type rx_message_struct; can_rx_message_type rx_message_struct;
@ -104,11 +105,11 @@ bool vCanSerialPortFrameDMAInit(
const uint8_t *DMA_BUF_RX, const uint8_t *DMA_BUF_RX,
uint8_t DMA_BUF_LEN_RX, uint8_t DMA_BUF_LEN_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
uint8_t CountSoftFilter_RX, uint8_t CountHardSoftFilter_RX,
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, // const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
uint8_t CountFilterFifo_RX, // uint8_t CountFilterFifo_RX,
IRQn_Type IRQ_DMA_RX, IRQn_Type IRQ_DMA_RX,
uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_PRIORITY_RX,

View File

@ -79,11 +79,11 @@ bool vCanSerialPortFrameDMAInit(
const uint8_t *DMA_BUF_RX, const uint8_t *DMA_BUF_RX,
uint8_t DMA_BUF_LEN_RX, uint8_t DMA_BUF_LEN_RX,
const FilterTo_FLEXCAN_RxMbFilterType *IdSoftFilter_RX, const FilterTo_FLEXCAN_RxMbFilterType *IdHardSoftFilter_RX,
uint8_t CountSoftFilter_RX, uint8_t CountHardSoftFilter_RX,
const FLEXCAN_RxMbFilterType *IdFilterFifo_RX, // const FLEXCAN_RxMbFilterType *IdFilterFifo_RX,
uint8_t CountFilterFifo_RX, // uint8_t CountFilterFifo_RX,
IRQn_Type IRQ_DMA_RX, IRQn_Type IRQ_DMA_RX,
uint8_t IRQ_DMA_PRIORITY_RX, uint8_t IRQ_DMA_PRIORITY_RX,
@ -104,8 +104,8 @@ bool vCanSerialPortFrameDMAInit(
env->can = CANx; env->can = CANx;
env->CAN_INDEX = CAN_INDEX; env->CAN_INDEX = CAN_INDEX;
env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX;
env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX; env->IdHardSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdHardSoftFilter_RX;
env->CountSoftFilter_RX = CountSoftFilter_RX; env->CountSoftFilter_RX = CountHardSoftFilter_RX;
env->access = osMutexNew(NULL); env->access = osMutexNew(NULL);
@ -169,7 +169,8 @@ bool vCanSerialPortFrameDMAInit(
env->tInitCfg.eBaudrate = canBaudRate; env->tInitCfg.eBaudrate = canBaudRate;
env->tInitCfg.eDataBaud = canBaudRate; env->tInitCfg.eDataBaud = canBaudRate;
env->tInitCfg.bEnRxFifo = TRUE; // env->tInitCfg.bEnRxFifo = TRUE;
env->tInitCfg.bEnRxFifo = FALSE;
// env->tInitCfg.bEnDma = TRUE; // env->tInitCfg.bEnDma = TRUE;
env->tInitCfg.bEnDma = FALSE; env->tInitCfg.bEnDma = FALSE;
@ -189,11 +190,21 @@ bool vCanSerialPortFrameDMAInit(
if (tRetVal == FLEXCAN_ERROR_OK) { if (tRetVal == FLEXCAN_ERROR_OK) {
env->tMbCfg.pRxFilterMBList = NULL; for (uint8_t i = 0; i < CountHardSoftFilter_RX; ++i) {
env->tMbCfg.u8RxFilterMBCnt = 0; env->pRxMbFilterList[i].eRxFrameType = IdHardSoftFilter_RX[i].eRxFrameType;
env->pRxMbFilterList[i].u32RxCanId = IdHardSoftFilter_RX[i].u32RxCanId;
env->pRxMbFilterList[i].u32RxCanIdMask = IdHardSoftFilter_RX[i].u32RxCanIdMask;
}
env->tMbCfg.pRxFilterMBList = env->pRxMbFilterList;
env->tMbCfg.u8RxFilterMBCnt = CountHardSoftFilter_RX;
// env->tMbCfg.pRxFilterMBList = NULL;
// env->tMbCfg.u8RxFilterMBCnt = 0;
/*
for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) { for (uint8_t i = 0; i < CountFilterFifo_RX; ++i) {
env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType; env->pRxFilterFifoList[i].eRxFrameType = IdFilterFifo_RX[i].eRxFrameType;
env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId; env->pRxFilterFifoList[i].u32RxCanId = IdFilterFifo_RX[i].u32RxCanId;
env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilterFifo_RX[i].u32RxCanIdMask; env->pRxFilterFifoList[i].u32RxCanIdMask = IdFilterFifo_RX[i].u32RxCanIdMask;
@ -201,6 +212,9 @@ bool vCanSerialPortFrameDMAInit(
env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList; env->tMbCfg.pRxFilterFifoList = env->pRxFilterFifoList;
env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX; env->tMbCfg.u8RxFilterFifoCnt = CountFilterFifo_RX;
*/
env->tMbCfg.pRxFilterFifoList = NULL;
env->tMbCfg.u8RxFilterFifoCnt = 0;
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX); env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
@ -229,8 +243,8 @@ bool vCanSerialPortFrameDMAInit(
env->tIntCfg.bEnTxMBInterrupt = 0U; env->tIntCfg.bEnTxMBInterrupt = 0U;
env->tIntCfg.pTxMBNotify = NULL; env->tIntCfg.pTxMBNotify = NULL;
env->tIntCfg.bEnRxMBInterrupt = 0U; env->tIntCfg.bEnRxMBInterrupt = 1U;
env->tIntCfg.pRxMBNotify = NULL; env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack;
env->tIntCfg.bEnRxFifoInterrupt = 1U; env->tIntCfg.bEnRxFifoInterrupt = 1U;
env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack; env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack;
@ -252,7 +266,7 @@ bool vCanSerialPortFrameDMAInit(
if (!env->reInit) { if (!env->reInit) {
env->reInit = true; env->reInit = true;
vCanSerialPortFrameInitStructure(env, 40, 0); vCanSerialPortFrameInitStructure(env, 10, 0);
CanSerialPortFrameSetType(env, canTypeFrame); CanSerialPortFrameSetType(env, canTypeFrame);
CanSerialPortFrameSetId(env, canId); CanSerialPortFrameSetId(env, canId);
@ -301,20 +315,22 @@ void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, F
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
env->rx_message_struct.id_type = pRxCfg->eFrameType;
index = i; index = i;
break; break;
} }
} else { } else {
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
env->rx_message_struct.id_type = pRxCfg->eFrameType;
index = i; index = i;
break; break;
} }
@ -328,7 +344,7 @@ void CanSerialPortFrameIrqRxProcessingNO_DMA(tCanSerialPortFrameFlagchip *env, F
if (index != 0xFF) { if (index != 0xFF) {
memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen); memcpy(env->rx_message_struct.data, pRxCfg->aData, pRxCfg->u32DataLen);
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter); CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter);
} }
if (env->CountSoftFilter_RX == 0) { if (env->CountSoftFilter_RX == 0) {
@ -365,20 +381,20 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) { for (uint8_t i = 0; i < env->CountSoftFilter_RX; ++i) {
if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) { if ((env->rx_message_struct.id_type == FLEXCAN_ID_STD) && (env->IdHardSoftFilter_RX[i].eRxFrameType == FLEXCAN_ID_STD)) {
if (env->rx_message_struct.standard_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.standard_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
index = i; index = i;
break; break;
} }
} else { } else {
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
if (env->rx_message_struct.extended_id == env->IdSoftFilter_RX[i].u32RxCanId) { if (env->rx_message_struct.extended_id == env->IdHardSoftFilter_RX[i].u32RxCanId) {
env->rx_message_struct.filter_index = env->IdSoftFilter_RX[i].filter; env->rx_message_struct.filter_index = env->IdHardSoftFilter_RX[i].filter;
index = i; index = i;
break; break;
} }
@ -402,7 +418,7 @@ void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_
REV_BYTES_32(pSrc[u8Index], pDest[u8Index]); REV_BYTES_32(pSrc[u8Index], pDest[u8Index]);
} }
CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdSoftFilter_RX[index].filter); CanSerialPortFrameAddDataQueue(env, &env->rx_message_struct, env->IdHardSoftFilter_RX[index].filter);
} }