diff --git a/Inc/SerialPortFlagchip.h b/Inc/SerialPortFlagchip.h index 4c4dd97..eaa7b04 100644 --- a/Inc/SerialPortFlagchip.h +++ b/Inc/SerialPortFlagchip.h @@ -18,6 +18,9 @@ #include "fc7xxx_driver_gpio.h" #include "fc7xxx_driver_dma.h" + +#define UART_RX_FIFO_WATERMARK 15U + typedef struct { uint8_t UART_INDEX; DMA_ChannelType RX_DMA_CHANNEL; @@ -26,6 +29,7 @@ typedef struct { uint32_t DMA_BUF_LEN; uint32_t UART_DMA_RECEIVED_LEN_BUF; + uint32_t UART_DMA_RECEIVED_POINTER_BUF; FCUART_DataType s_tFCUART_TxMsg; @@ -42,7 +46,7 @@ typedef struct { osMessageQueueId_t txAccessQueue; osMessageQueueId_t rxDataQueue; osMessageQueueId_t rxDataSnifferQueue; - osMessageQueueId_t rxDataSnifferSecondQueue; + } tSerialPortFlagchip; diff --git a/Src/SerialPortFlagchip.c b/Src/SerialPortFlagchip.c index a07d58d..d4c9618 100644 --- a/Src/SerialPortFlagchip.c +++ b/Src/SerialPortFlagchip.c @@ -74,9 +74,6 @@ void vSerialPortInitDMA( env->rxDataSnifferQueue = 0; } - - FCUART_InitMemory(UART_INDEX); - env->dmaInitCfg.eArbitrationAlgorithm = DMA_ARBITRATION_ALGORITHM_FIXED_PRIORITY; env->dmaInitCfg.bHaltOnError = false; DMA_Init(DMA_INSTANCE_0, &env->dmaInitCfg); @@ -84,6 +81,7 @@ void vSerialPortInitDMA( env->chnCfg.pSrcBuffer = &(uart->DATA); env->chnCfg.pDestBuffer = DMA_BUF; env->chnCfg.u32BlockSize = 1U; + //env->chnCfg.u32BlockSize = (UART_RX_FIFO_WATERMARK + 1U);; env->chnCfg.u16BlockCount = 1U; env->chnCfg.u8ChannelPriority = IRQ_DMA_CHANNEL_PRIORITY; env->chnCfg.eSrcDataSize = DMA_TRANSFER_SIZE_1B; @@ -96,10 +94,17 @@ void vSerialPortInitDMA( env->chnCfg.bSrcAddrLoopbackEn = false; env->chnCfg.bDestAddrLoopbackEn = false; env->chnCfg.bAutoStop = false; + + //env->chnCfg.bSrcCircularBufferEn = false; + //env->chnCfg.u32SrcCircBufferSize = 0U; + //env->chnCfg.bDestCircularBufferEn = false; + //env->chnCfg.u32DestCircBufferSize = 0U; + env->chnCfg.bSrcCircularBufferEn = false; - env->chnCfg.u32SrcCircBufferSize = 0U; - env->chnCfg.bDestCircularBufferEn = false; - env->chnCfg.u32DestCircBufferSize = 0U; + env->chnCfg.u32SrcCircBufferSize = 0U; + env->chnCfg.bDestCircularBufferEn = true; + env->chnCfg.u32DestCircBufferSize = DMA_BUF_LEN; + env->chnCfg.eTriggerSrc = RX_DMA_CHANNEL_REQ; DMA_InitChannel(DMA_INSTANCE_0, RX_DMA_CHANNEL, &env->chnCfg); @@ -111,23 +116,30 @@ void vSerialPortInitDMA( DMA_StartChannel(DMA_INSTANCE_0, RX_DMA_CHANNEL); - //NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); - NVIC_SetPriority(DMA_Error_IRQn, IRQ_DMA_PRIORITY); NVIC_SetPriority(IRQ_DMA, IRQ_DMA_PRIORITY); NVIC_EnableIRQ(IRQ_DMA); + FCUART_ErrorType tRetVal; uint32_t u32PccFuncClk; + FCUART_InitMemory(UART_INDEX); + u32PccFuncClk = PCC_GetPccFunctionClock(s_ePccUartTable[UART_INDEX]); if (u32PccFuncClk != 0U) { env->tInitCfg.bEnRxFullDma = true; // UART receiver full DMA disable - env->tInitCfg.bEnRxFifo = false; // UART fifo disable - env->tInitCfg.bEnTxFifo = true; // UART tx fifo enable - env->tInitCfg.u8TxFifoWaterMark = 0U; // UART tx fifo 16 bytes trigger + //env->tInitCfg.bEnRxFifo = false; // UART fifo disable + //env->tInitCfg.bEnTxFifo = true; // UART tx fifo enable + //env->tInitCfg.u8TxFifoWaterMark = 0U; // UART tx fifo 16 bytes trigger + + env->tInitCfg.bEnTxFifo = true; + env->tInitCfg.u8TxFifoWaterMark = 0U; + + env->tInitCfg.bEnRxFifo = true; + env->tInitCfg.u8RxFifoWaterMark = 0U; env->tInitCfg.eIdleCharNum = FCUART_IDLE_CHARCTER_64; // UART idle character number 64 env->tInitCfg.eIdleStart = FCUART_START_AFTER_STOPBIT; // UART idle character type @@ -162,11 +174,11 @@ void vSerialPortInitDMA( tRetVal = FCUART_SetInterrupt(UART_INDEX, &env->tInterruptCfg); - tRetVal = FCUART_StartReceive(UART_INDEX); - NVIC_SetPriority(IRQ_UART, UART_PRIORITY); NVIC_EnableIRQ(IRQ_UART); + tRetVal = FCUART_StartReceive(UART_INDEX); + } } @@ -220,14 +232,6 @@ static uint16_t vSerialPortReceiveSniffer(tSerialPortFlagchip *env, uint8_t *dat : 0; } -static uint16_t -vSerialPortReceiveSnifferSecond(tSerialPortFlagchip *env, uint8_t *data, uint16_t size, uint32_t timeout) { - - return env->rxDataSnifferSecondQueue - ? vSerialPortReceiveQueue(env, data, size, timeout, env->rxDataSnifferSecondQueue) - : 0; -} - static uint16_t vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t size, uint32_t timeout) { @@ -236,7 +240,6 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si FCUART_ErrorType tRetVal; -// memcpy(env->dataBufTransmit, data, size); tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, env->dataBufTransmit, size); tRetVal = FCUART_StartTransmit(env->UART_INDEX); @@ -293,12 +296,3 @@ tSerialPortIO vSerialPortGetSnifferIo(tSerialPortFlagchip *env) { }; return io; } - -tSerialPortIO SerialPort_GetSnifferSecondIo(tSerialPortFlagchip *env) { - tSerialPortIO io = { - .env = env, - .receive = (SerialPortIOTransaction) vSerialPortReceiveSnifferSecond, - .transmit = vSerialPortTransmitterGet(env) - }; - return io; -} \ No newline at end of file