diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index e45ef48..17059d9 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -54,6 +54,8 @@ typedef struct { uint8_t CAN_INDEX; + osMessageQueueId_t txDataQueueCan; + uint32_t id; uint32_t id1; FLEXCAN_IdType canTypeFrame; diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 141a465..c996a75 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -118,6 +118,7 @@ bool vCanSerialPortFrameDMAInit( env->DMA_ErrorCallback = DMA_ErrorCallback; + env->txDataQueueCan = osMessageQueueNew(1, 1, NULL); env->access = osMutexNew(NULL); //начало-----------------------------------DMA-RX------------------------------------------------------------------- @@ -325,7 +326,7 @@ bool vCanSerialPortFrameMbInit( // env->DMA_ErrorCallback = DMA_ErrorCallback; env->access = osMutexNew(NULL); - + env->txDataQueueCan = osMessageQueueNew(1, 1, NULL); //начало------------------------------------CAN--------------------------------------------------------------------- //начало------------------------------------CAN--------------------------------------------------------------------- @@ -704,6 +705,32 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u // : 0; //} +FLEXCAN_ErrorType TransmitCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *tTxMsg) { + + 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) { + + uint8_t u8TxHandler; + if (osMessageQueueGet(env->txDataQueueCan, &u8TxHandler, NULL, tTxMsg->bWaitTxCompleted) == osOK) { + tRetval = FLEXCAN_ERROR_OK; + } else { + tRetval = FLEXCAN_ERROR_TIMEOUT; + } + + } + + FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg->u8TxHandler); + } + + return tRetval; +} + + uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr, uint8_t canType, uint32_t timeout) { @@ -739,12 +766,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t * FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], 8, NULL); len += 8; - tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, &tTxMsg); - if (tRetval != FLEXCAN_ERROR_OK) { - FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg.u8TxHandler); - } else { - FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg.u8TxHandler); - } + tRetval = TransmitCan(env, &tTxMsg); sent += 8; size -= 8; @@ -755,12 +777,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t * FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], tailSize, NULL); - tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, &tTxMsg); - if (tRetval != FLEXCAN_ERROR_OK) { - FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg.u8TxHandler); - } else { - FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg.u8TxHandler); - } + tRetval = TransmitCan(env, &tTxMsg); sent += tailSize; size -= tailSize;