diff --git a/Inc/SerialPortFlagchip.h b/Inc/SerialPortFlagchip.h index cfd07b4..6dba95d 100644 --- a/Inc/SerialPortFlagchip.h +++ b/Inc/SerialPortFlagchip.h @@ -19,7 +19,7 @@ #include "fc7xxx_driver_dma.h" -#define UART_RX_FIFO_WATERMARK 15U +#define UART_RX_WATERMARK 64U typedef struct { uint8_t UART_INDEX; @@ -29,9 +29,10 @@ typedef struct { uint32_t DMA_BUF_LEN; - uint32_t UART_DMA_RECEIVED_LEN_BUF; uint32_t UART_DMA_RECEIVED_POINTER_BUF; + uint16_t PROCESSED_BYTES; + FCUART_DataType s_tFCUART_TxMsg; FCUART_InitType tInitCfg; @@ -102,8 +103,9 @@ void vSerialPortInitDMA( ); tSerialPortIO vSerialPortGetIo(tSerialPortFlagchip *env); +tSerialPortIO vSerialPortGetSnifferIo(tSerialPortFlagchip *env); -void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer); +void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, bool isTransferComplete, const uint8_t *pSrcBuffer); void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data); /* diff --git a/Src/SerialPortFlagchip.c b/Src/SerialPortFlagchip.c index 572ce73..a1d0040 100644 --- a/Src/SerialPortFlagchip.c +++ b/Src/SerialPortFlagchip.c @@ -69,7 +69,6 @@ void vSerialPortInitDMA( env->TX_DMA_CHANNEL = DMA_CHANNEL_TX; env->UART = uart; env->DMA_BUF_LEN = DMA_BUF_LEN_RX; - env->UART_DMA_RECEIVED_LEN_BUF = 0; env->dataBufTransmit = dataBufTransmit; env->dataBufTransmitLen = dataBufTransmitLen; env->txAccessQueue = osMessageQueueNew(1, 1, NULL); @@ -88,7 +87,7 @@ void vSerialPortInitDMA( env->chnCfg_RX.pSrcBuffer = &(uart->DATA); env->chnCfg_RX.pDestBuffer = DMA_BUF_RX; env->chnCfg_RX.u32BlockSize = 1U; - env->chnCfg_RX.u16BlockCount = 1U; + env->chnCfg_RX.u16BlockCount = UART_RX_WATERMARK; env->chnCfg_RX.u8ChannelPriority = IRQ_DMA_CHANNEL_PRIORITY_RX; env->chnCfg_RX.eSrcDataSize = DMA_TRANSFER_SIZE_1B; env->chnCfg_RX.eDestDataSize = DMA_TRANSFER_SIZE_1B; @@ -102,7 +101,7 @@ void vSerialPortInitDMA( env->chnCfg_RX.bAutoStop = false; env->chnCfg_RX.bSrcCircularBufferEn = false; - env->chnCfg_RX.u32SrcCircBufferSize = 0U; + env->chnCfg_RX.u32SrcCircBufferSize = 0U; env->chnCfg_RX.bDestCircularBufferEn = true; env->chnCfg_RX.u32DestCircBufferSize = DMA_BUF_LEN_RX; @@ -147,7 +146,7 @@ void vSerialPortInitDMA( env->chnCfg_TX.bAutoStop = true; env->chnCfg_TX.bSrcCircularBufferEn = false; - env->chnCfg_TX.u32SrcCircBufferSize = 0U; + env->chnCfg_TX.u32SrcCircBufferSize = 0U; env->chnCfg_TX.bDestCircularBufferEn = false; env->chnCfg_TX.u32DestCircBufferSize = 0U; @@ -223,8 +222,8 @@ void vSerialPortInitDMA( tRetVal = FCUART_SetInterrupt(UART_INDEX, &env->tInterruptCfg); -// NVIC_SetPriority(IRQ_UART, UART_PRIORITY); -// NVIC_EnableIRQ(IRQ_UART); + NVIC_SetPriority(IRQ_UART, UART_PRIORITY); + NVIC_EnableIRQ(IRQ_UART); FCUART_HWA_SetTxTransfer(env->UART, true); @@ -310,43 +309,46 @@ vSerialPortTransmitOverCore(tSerialPortFlagchip *env, uint8_t *data, uint16_t si return sent; - -/* - uint16_t sent = 0; - - FCUART_ErrorType tRetVal; - - tRetVal = FCUART_AssignTxInterruptData(env->UART_INDEX, env->dataBufTransmit, size); - - tRetVal = FCUART_StartTransmit(env->UART_INDEX); - - PROCESS_UNUSED_VAR(tRetVal) - - uint8_t res; - - sent = (osMessageQueueGet(env->txAccessQueue, &res, 0, timeout) == osOK) ? size : 0; - - return sent; - */ } void SerialPort_TxEndTransmitted(tSerialPortFlagchip *env, uint8_t data) { osMessageQueuePut(env->txAccessQueue, &data, 0x0, 0U); } -void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, const void *pSrcBuffer) { +void SerialPort_RxDmaBufToQueue(tSerialPortFlagchip *env, bool isTransferComplete, const uint8_t *pSrcBuffer) { - for (uint32_t i = 0; i < env->UART_DMA_RECEIVED_LEN_BUF; ++i) { - osMessageQueuePut(env->rxDataQueue, &((uint8 *) pSrcBuffer)[i], 0x0, 0U); - if (env->rxDataSnifferQueue) { - osMessageQueuePut(env->rxDataSnifferQueue, &((uint8 *) pSrcBuffer)[i], 0x0, 0U); - } + DMA_Type *aDma[] = DMA_BASE_PTRS; + DMA_Type *const pDma = aDma[DMA_INSTANCE_0]; + + uint16_t remaining_bytes; + + // Если передача завершена + if (isTransferComplete) { + // Количество байт в буфере + remaining_bytes = env->chnCfg_RX.u16BlockCount - env->PROCESSED_BYTES; + env->PROCESSED_BYTES = 0; + } else { + // Количество байт в буфере + remaining_bytes = + env->chnCfg_RX.u16BlockCount - env->PROCESSED_BYTES - pDma->CFG[env->RX_DMA_CHANNEL].CLC.CHTRGENNO; + env->PROCESSED_BYTES += remaining_bytes; } - env->UART_DMA_RECEIVED_POINTER_BUF += env->UART_DMA_RECEIVED_LEN_BUF; - env->UART_DMA_RECEIVED_LEN_BUF = 0; - if (env->UART_DMA_RECEIVED_POINTER_BUF >= env->DMA_BUF_LEN) - env->UART_DMA_RECEIVED_POINTER_BUF = 0; + for (uint16_t i = 0; i < remaining_bytes; ++i) { + + osMessageQueuePut(env->rxDataQueue, &pSrcBuffer[env->UART_DMA_RECEIVED_POINTER_BUF], 0x0, 0U); + + if (env->rxDataSnifferQueue) { + osMessageQueuePut(env->rxDataSnifferQueue, &pSrcBuffer[env->UART_DMA_RECEIVED_POINTER_BUF], 0x0, 0U); + } + + ++env->UART_DMA_RECEIVED_POINTER_BUF; + + if (env->UART_DMA_RECEIVED_POINTER_BUF >= env->DMA_BUF_LEN) { + env->UART_DMA_RECEIVED_POINTER_BUF = 0; + } + + } }