Обновление 23.06.2026

This commit is contained in:
Дарья Бараева 2026-06-24 13:58:08 +03:00
parent 68bf8fd28f
commit 385e9ac58b
2 changed files with 62 additions and 9 deletions

View File

@ -38,8 +38,10 @@ 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_HANDLER 3
#define COUNT_TX_HANDLER 24
#define COUNT_QUEUE 4
typedef struct {

View File

@ -214,7 +214,7 @@ bool vCanSerialPortFrameDMAInit(
env->tMbCfg.pRxBuf = CAN_GET_BUFFER(CAN_INDEX);
// tx config
env->tMbCfg.u8TxMsgCnt = 3U; // tx occupy 3 mb
env->tMbCfg.u8TxMsgCnt = COUNT_TX_CAN_HANDLER; // 3U
tRetVal = FLEXCAN_RxFilterConfig(CAN_INDEX, &env->tMbCfg);
@ -713,26 +713,77 @@ 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};
FLEXCAN_ErrorType TransmitCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *tTxMsg) {
/*
for (uint32_t j = 0; j < 500000; ++j) {
for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
uint8_t ready = FLEXCAN_TransmitProcess(env->CAN_INDEX, i);
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 ready = 0;
while (ready == 0) {
for (uint8_t i = 0; i < COUNT_TX_CAN_HANDLER; ++i) {
ready = IsTxBufferFree_ByCode(env->CAN_INDEX, i);
if ((ready)) {
tTxMsg->u8TxHandler = i;
break;
} else {
if (i > max_i) {
max_i = i;
}
if (max_i >= COUNT_TX_CAN_HANDLER) {
asm("nop");
}
}
}
}
FLEXCAN_ErrorType tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, tTxMsg);
if (tRetval != FLEXCAN_ERROR_OK) {
FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg->u8TxHandler);
} else {
/*
if (tTxMsg->bWaitTxCompleted) {
if (tTxMsg->bWaitTxCompleted) {
/*
uint8_t u8TxHandler;
if (osMessageQueueGet(env->txDataQueueCan[tTxMsg->u8TxHandler], &u8TxHandler, NULL, tTxMsg->bWaitTxCompleted) == osOK) {
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, tTxMsg->u8TxHandler);
}
return tRetval;
@ -765,7 +816,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
tTxMsg.eDataType = FLEXCAN_FRAME_DATA;
tTxMsg.eFrameType = (FLEXCAN_IdType) env->canTypeFrame;
tTxMsg.bWaitTxCompleted = 1U;
tTxMsg.u16WaitTxTimeout = 50000;
tTxMsg.u16WaitTxTimeout = 50;
uint16_t len = 0;