diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index 3b3acc3..bacd1e9 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -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 { diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 8328501..6163f5d 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -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;