Обновление после командировки 29.06.2026

This commit is contained in:
cfif 2026-06-29 13:13:45 +03:00
parent 385e9ac58b
commit fe3bc8c74a
2 changed files with 135 additions and 86 deletions

View File

@ -38,10 +38,9 @@ typedef struct {
this parameter can be a value between 0 to 0xFF */
} can_rx_message_type;
#define COUNT_TX_CAN_HANDLER 24
#define COUNT_TX_CAN0_HANDLER 8
#define COUNT_TX_CAN1_HANDLER 16
#define COUNT_TX_HANDLER 24
#define COUNT_QUEUE 4
typedef struct {
@ -57,8 +56,6 @@ typedef struct {
uint8_t CAN_INDEX;
osMessageQueueId_t txDataQueueCan[COUNT_TX_HANDLER];
uint32_t id;
uint32_t id1;
FLEXCAN_IdType canTypeFrame;
@ -78,7 +75,7 @@ typedef struct {
osMessageQueueId_t rxDataQueue[COUNT_QUEUE];
osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE];
osMutexId_t access[COUNT_TX_HANDLER];
osMutexId_t access;
DMA_InitType dmaInitCfg_RX;
DMA_ChannelCfgType chnCfg_RX;
@ -160,7 +157,8 @@ bool vCanSerialPortFrameMbInit(
);
void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg);
void CAN_RxInterrupt_CallBack_Handler(tCanSerialPortFrameFlagchip *env, uint8_t u8CanIndex, FLEXCAN_RxMsgType *pRxCfg);
void CanSerialPortFrameIrqRxProcessing(tCanSerialPortFrameFlagchip *env, uint32_t *pBuf);

View File

@ -214,7 +214,13 @@ bool vCanSerialPortFrameDMAInit(
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
// tx config
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN_HANDLER; // 3U
if (CAN_INDEX == 0) {
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN0_HANDLER; // tx occupy 3 mb
}
if (CAN_INDEX == 1) {
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN1_HANDLER; // tx occupy 3 mb
}
tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg);
@ -266,11 +272,11 @@ bool vCanSerialPortFrameDMAInit(
env->reInitOne = true;
for (uint8_t i = 0; i < COUNT_TX_HANDLER; ++i) {
env->access[i] = osMutexNew(NULL);
env->txDataQueueCan[i] = osMessageQueueNew(1, 1, NULL);
}
// for (uint8_t i = 0; i < COUNT_TX_HANDLER; ++i) {
// env->access[i] = osMutexNew(NULL);
// env->txDataQueueCan[i] = osMessageQueueNew(1, 1, NULL);
// }
env->access = osMutexNew(NULL);
vCanSerialPortFrameInitStructure(env, 10, 0);
CanSerialPortFrameSetType(env, canTypeFrame);
@ -377,36 +383,46 @@ bool vCanSerialPortFrameMbInit(
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
// tx config
env->tMbCfg.u8TxMsgCnt = 3U; // tx occupy 3 mb
if (CAN_INDEX == 0) {
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN0_HANDLER; // tx occupy 3 mb
}
if (CAN_INDEX == 1) {
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN1_HANDLER; // tx occupy 3 mb
}
tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg);
if (CAN_ErrorInterrupt_CallBack == NULL) {
env->tIntCfg.bEnErrorInterrupt = 0U;
env->tIntCfg.pErrorNotify = NULL;
env->tIntCfg.bEnTxMBInterrupt = 0U;
env->tIntCfg.pTxMBNotify = NULL;
env->tIntCfg.bEnRxMBInterrupt = 0U;
env->tIntCfg.pRxMBNotify = NULL;
env->tIntCfg.bEnRxFifoInterrupt = 0U;
env->tIntCfg.pRxFifoNotify = NULL;
} else {
env->tIntCfg.bEnErrorInterrupt = 1U;
env->tIntCfg.pErrorNotify = CAN_ErrorInterrupt_CallBack;
}
if (CAN_TxInterrupt_CallBack == NULL) {
env->tIntCfg.bEnTxMBInterrupt = 0U;
env->tIntCfg.pTxMBNotify = NULL;
} else {
env->tIntCfg.bEnTxMBInterrupt = 1U;
env->tIntCfg.pTxMBNotify = CAN_TxInterrupt_CallBack;
}
if (CAN_RxInterrupt_CallBack == NULL) {
env->tIntCfg.bEnRxMBInterrupt = 0U;
env->tIntCfg.pRxMBNotify = NULL;
} else {
env->tIntCfg.bEnRxMBInterrupt = 1U;
env->tIntCfg.pRxMBNotify = CAN_RxInterrupt_CallBack;
}
if (CAN_RxFifoInterrupt_CallBack == NULL) {
env->tIntCfg.bEnRxFifoInterrupt = 0U;
env->tIntCfg.pRxFifoNotify = NULL;
} else {
env->tIntCfg.bEnRxFifoInterrupt = 1U;
env->tIntCfg.pRxFifoNotify = CAN_RxFifoInterrupt_CallBack;
}
@ -425,12 +441,12 @@ bool vCanSerialPortFrameMbInit(
if (!env->reInitOne) {
env->reInitOne = true;
for (uint8_t i = 0; i < COUNT_TX_HANDLER; ++i) {
env->access[i] = osMutexNew(NULL);
env->txDataQueueCan[i] = osMessageQueueNew(1, 1, NULL);
}
// for (uint8_t i = 0; i < COUNT_TX_HANDLER; ++i) {
// env->access[i] = osMutexNew(NULL);
// env->txDataQueueCan[i] = osMessageQueueNew(1, 1, NULL);
// }
env->access = osMutexNew(NULL);
vCanSerialPortFrameInitStructure(env, 10, 0);
CanSerialPortFrameSetType(env, canTypeFrame);
@ -713,89 +729,124 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u
// : 0;
//}
uint8_t max_i = 0;
uint8_t tx_init[COUNT_TX_CAN_HANDLER] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
#define TRANSMIT_MULTI_FRAME_TX 1
FLEXCAN_ErrorType TransmitCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *tTxMsg) {
//#define TRANSMIT_MULTI_FRAME_DBG_TX 1
/*
for (uint32_t j = 0; j < 500000; ++j) {
#ifdef TRANSMIT_MULTI_FRAME_DBG_TX
uint8_t max0_i =0;
uint8_t max1_i =0;
for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
uint8_t ready = FLEXCAN_TransmitProcess(env->CAN_INDEX, i);
uint8_t handler_0[1000];
uint16_t handler_0_cnt = 0;
if ((ready) || (tx_init[i])) {
tx_init[i] = 0;
tTxMsg->u8TxHandler = i;
break;
} else {
if (i > max_i) {
max_i = i;
}
asm("nop");
}
uint8_t handler_1[1000];
uint16_t handler_1_cnt = 0;
}
}
*/
#endif
static FLEXCAN_ErrorType SendToCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *const pTxMsg, uint32_t timeout) {
FLEXCAN_ErrorType tRetval = FLEXCAN_ERROR_TIMEOUT;
#ifdef TRANSMIT_MULTI_FRAME_TX
uint8_t ready = 0;
while (ready == 0) {
uint32_t endMs = SystemGetMs() + timeout;
for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
ready = IsTxBufferFree_ByCode(env->CAN_INDEX, i);
while ((ready == 0) && (endMs > SystemGetMs())) {
if ((ready)) {
tTxMsg->u8TxHandler = i;
break;
} else {
if (i > max_i) {
max_i = i;
}
if (env->CAN_INDEX == 0) {
for (uint8_t i = 0; i < COUNT_TX_CAN0_HANDLER; ++i) {
ready = IsTxBufferFree_ByCode(env->CAN_INDEX, i);
if (max_i >= COUNT_TX_CAN_HANDLER) {
asm("nop");
if (ready) {
pTxMsg->u8TxHandler = i;
break;
} else {
#ifdef TRANSMIT_MULTI_FRAME_DBG_TX
handler_0[handler_0_cnt] = i;
handler_0_cnt++;
if (handler_0_cnt >= 1000) {
handler_0_cnt = 0;
}
if (i > max0_i) {
max0_i = i;
}
if (max0_i >= COUNT_TX_CAN0_HANDLER) {
asm("nop");
}
#endif
}
}
}
if (env->CAN_INDEX == 1) {
for (uint8_t i = 0; i < COUNT_TX_CAN1_HANDLER; ++i) {
ready = IsTxBufferFree_ByCode(env->CAN_INDEX, i);
if (ready) {
pTxMsg->u8TxHandler = i;
break;
} else {
#ifdef TRANSMIT_MULTI_FRAME_DBG_TX
handler_1[handler_1_cnt] = i;
handler_1_cnt++;
if (handler_1_cnt >= 1000) {
handler_1_cnt = 0;
}
if (i > max1_i) {
max1_i = i;
}
if (max1_i >= COUNT_TX_CAN1_HANDLER) {
asm("nop");
}
#endif
}
}
}
}
FLEXCAN_ErrorType tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, tTxMsg);
pTxMsg->bWaitTxCompleted = 0;
tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, pTxMsg);
#endif
#ifndef TRANSMIT_MULTI_FRAME_TX
tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, pTxMsg);
if (tRetval != FLEXCAN_ERROR_OK) {
FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg->u8TxHandler);
FLEXCAN_TransmitAbort(env->CAN_INDEX, pTxMsg->u8TxHandler);
} else {
if (tTxMsg->bWaitTxCompleted) {
/*
uint8_t u8TxHandler;
if (osMessageQueueGet(env->txDataQueueCan[tTxMsg->u8TxHandler], &u8TxHandler, NULL, 50) == osOK) {
tRetval = FLEXCAN_ERROR_OK;
} else {
tRetval = FLEXCAN_ERROR_TIMEOUT;
}
*/
}
// FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg->u8TxHandler);
FLEXCAN_TransmitProcess(env->CAN_INDEX, pTxMsg->u8TxHandler);
}
#endif
return tRetval;
}
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr,
uint8_t canType, uint32_t timeout, uint8_t u8TxHandler) {
uint8_t canType, uint32_t timeout) {
timeout = 5;
uint16_t sent = 0;
if (osMutexAcquire(env->access[u8TxHandler], 1000) == osOK) {
if (osMutexAcquire(env->access, 1000) == osOK) {
env->id = adr;
env->canTypeFrame = canType;
@ -807,7 +858,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
FLEXCAN_ErrorType tRetval;
tTxMsg.u32CanId = env->id;
tTxMsg.u8TxHandler = u8TxHandler; //0U;
tTxMsg.u8TxHandler = 0U;
tTxMsg.bEnFd = FALSE;
tTxMsg.bEnBrs = FALSE;
@ -816,7 +867,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
tTxMsg.eDataType = FLEXCAN_FRAME_DATA;
tTxMsg.eFrameType = (FLEXCAN_IdType) env->canTypeFrame;
tTxMsg.bWaitTxCompleted = 1U;
tTxMsg.u16WaitTxTimeout = 50;
tTxMsg.u16WaitTxTimeout = 500000U;
uint16_t len = 0;
@ -825,7 +876,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], 8, NULL);
len += 8;
tRetval = TransmitCan(env, &tTxMsg);
tRetval = SendToCan(env, &tTxMsg, timeout);
sent += 8;
size -= 8;
@ -836,13 +887,13 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], tailSize, NULL);
tRetval = TransmitCan(env, &tTxMsg);
tRetval = SendToCan(env, &tTxMsg, timeout);
sent += tailSize;
size -= tailSize;
}
osMutexRelease(env->access[u8TxHandler]);
osMutexRelease(env->access);
}
return sent;