diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h index 9f236df..f365e19 100644 --- a/Inc/CanSerialPortFrame.h +++ b/Inc/CanSerialPortFrame.h @@ -73,7 +73,7 @@ typedef struct { osMessageQueueId_t rxDataQueue[COUNT_QUEUE]; osMessageQueueId_t rxDataSnifferQueue[COUNT_QUEUE]; - osMessageQueueId_t txAccessQueue; + osMutexId_t access; DMA_InitType dmaInitCfg_RX; DMA_ChannelCfgType chnCfg_RX; diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c index 3622017..77204ae 100644 --- a/Src/CanSerialPortFrame.c +++ b/Src/CanSerialPortFrame.c @@ -104,6 +104,9 @@ void vCanSerialPortFrameDMAInit( env->DMA_BUF_LEN_RX = DMA_BUF_LEN_RX; env->IdSoftFilter_RX = (FilterTo_FLEXCAN_RxMbFilterType *) IdSoftFilter_RX; env->CountSoftFilter_RX = CountSoftFilter_RX; + + env->access = osMutexNew(NULL); + //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- //начало-----------------------------------DMA-RX------------------------------------------------------------------- @@ -392,59 +395,68 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u // : 0; //} -uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t timeout) { +uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr, uint8_t canType, uint32_t timeout) { - uint16_t fullSize = size / 8; - uint8_t tailSize = size % 8; uint16_t sent = 0; - FLEXCAN_TxMsgType tTxMsg = {0}; - FLEXCAN_ErrorType tRetval; + if (osMutexAcquire(env->access, 1000) == osOK) { - tTxMsg.u32CanId = env->id; - tTxMsg.u8TxHandler = 0U; + env->id = adr; + env->canTypeFrame = canType; - tTxMsg.bEnFd = FALSE; - tTxMsg.bEnBrs = FALSE; - tTxMsg.u32DataLen = 8; + uint16_t fullSize = size / 8; + uint8_t tailSize = size % 8; - tTxMsg.eDataType = FLEXCAN_FRAME_DATA; - tTxMsg.eFrameType = (FLEXCAN_IdType) env->canTypeFrame; - tTxMsg.bWaitTxCompleted = 1U; - tTxMsg.u16WaitTxTimeout = 10000U; + FLEXCAN_TxMsgType tTxMsg = {0}; + FLEXCAN_ErrorType tRetval; + + tTxMsg.u32CanId = env->id; + tTxMsg.u8TxHandler = 0U; + + tTxMsg.bEnFd = FALSE; + tTxMsg.bEnBrs = FALSE; + tTxMsg.u32DataLen = 8; + + tTxMsg.eDataType = FLEXCAN_FRAME_DATA; + tTxMsg.eFrameType = (FLEXCAN_IdType) env->canTypeFrame; + tTxMsg.bWaitTxCompleted = 1U; + tTxMsg.u16WaitTxTimeout = 10000U; - uint16_t len = 0; - for (uint16_t i = 0; i < fullSize; ++i) { + uint16_t len = 0; + for (uint16_t i = 0; i < fullSize; ++i) { - FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], 8, NULL); - len += 8; + 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 = 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); + } + + sent += 8; + size -= 8; } - sent += 8; - size -= 8; - } + if (tailSize) { + tTxMsg.u32DataLen = tailSize; - if (tailSize) { - tTxMsg.u32DataLen = tailSize; + FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], tailSize, NULL); - 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 = 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); + sent += tailSize; + size -= tailSize; } - sent += tailSize; - size -= tailSize; + osMutexRelease(env->access); } return sent;