Обновление
This commit is contained in:
parent
084ac5a199
commit
29f57d78be
|
|
@ -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);
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue