This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SYS_EDMA_TPCC是否可以被DSP使用?
可以,SYS_EDMA可以被所有的核使用。
DSP_EDMA_TPCC 和DSP1_EDMA_TPCC/DSP2_EDMA_TPCC 有什么区别?
各个核私有的。
/* EDMA3 TPCC region. */ #define EDMA3_CC_REGION (1U) /* EDMA3 Event queue number. */ #define EVT_QUEUE_NUM (0U) uint32_t edma_address = CSL_DSP_DSP_EDMA_CC_REGS; void uart_task(UArg a0, UArg a1) { /*Pad configuration and PRCM enable*/ padConfig_prcmEnable(); /*Configure the EDMA clock */ PlatformEDMAWkupDepEnable(); /* Do EDMA init Done once in the beginning of application */ EDMAsetRegion(EDMA3_CC_REGION); EDMA3Init(edma_address, EVT_QUEUE_NUM); // SOC_EDMA_TPCC_BASE_VIRT CSL_DSP_DSP_EDMA_CC_REGS ... } //Table 16-6. Connection of The Device DREQs to The DMA_CROSSBAR Inputs #define DMA_XBAR_INST_TX (49U) #define DMA_XBAR_INST_RX (50U) //Table 5-7. DSP2_EDMA Default Request Mapping #define DMA_XBAR_INST_TX_SRC CSL_XBAR_INST_DMA_DSP2_DREQ_16 #define DMA_XBAR_INST_RX_SRC CSL_XBAR_INST_DMA_DSP2_DREQ_17 /* ** This function configures the DMA crossbar for UART TX and RX events. */ static void EdmaEvtConfigure(void) { CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_DSP2_DMA, DMA_XBAR_INST_TX, DMA_XBAR_INST_TX_SRC); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_DSP2_DMA, DMA_XBAR_INST_RX, DMA_XBAR_INST_RX_SRC); }
typedef enum
{
CSL_XBAR_DMA_CPU_ID_SYSTEM_DMA,
CSL_XBAR_DMA_CPU_ID_EDMA,
CSL_XBAR_DMA_CPU_ID_DSP1_DMA,
CSL_XBAR_DMA_CPU_ID_DSP2_DMA
} CSL_XbarDmaCpuId;
问题1:DSP2的EDMA_TPCC访问 CSL_DSP_DSP_EDMA_CC_REGS ,若要触发UART1_TX 事件,使用CSL_xbarDmaConfigure()函数进行事件映射,
void CSL_xbarDmaConfigure(CSL_XbarDmaCpuId dmaRegType, Uint32 dmaCrossbarInputNo, Uint32 dmaDreqToMapTo);
其中第一个参数是配置 CSL_XBAR_DMA_CPU_ID_DSP2_DMA吗?
问题2:CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_DSP2_DMA, DMA_XBAR_INST_TX,
DMA_XBAR_INST_TX_SRC);
DMA事件映射后,DMA通道是否必须为 CSL_xbarDmaConfigure(...)的第三个参数 dmaDreqToMapTo ?
其中第一个参数是配置 CSL_XBAR_DMA_CPU_ID_DSP2_DMA吗?
typedef enum
{
CSL_XBAR_DMA_CPU_ID_SYSTEM_DMA,
CSL_XBAR_DMA_CPU_ID_EDMA,
CSL_XBAR_DMA_CPU_ID_DSP1_DMA,
CSL_XBAR_DMA_CPU_ID_DSP2_DMA
} CSL_XbarDmaCpuId;
DMA事件映射后,DMA通道是否必须为 CSL_xbarDmaConfigure(...)的第三个参数 dmaDreqToMapTo ?
映射事件需一致。
/** * @file bsp_uart_edma.c * * @brief This file tests the UART driver APIs in EDMA mode. * */ #include <stdio.h> #include <string.h> #include <stdint.h> /* XDCtools Header files */ #include <xdc/std.h> #include <xdc/cfg/global.h> #include <xdc/runtime/Error.h> #include <xdc/runtime/System.h> #include <xdc/runtime/Log.h> #include <xdc/runtime/Diags.h> /* BIOS Header files */ #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/hal/Hwi.h> /* TI-RTOS Header files */ #include <ti/drv/gpio/GPIO.h> /* CSL Header files */ #include <ti/csl/csl_chip.h> #include <ti/csl/arch/c66x/interrupt.h> #include <ti/csl/example/utils/uart_console/inc/uartConfig.h> #include <ti/csl/soc.h> #include <ti/csl/hw_types.h> #include <ti/csl/csl_uart.h> #include <ti/csl/csl_edma.h> #include <ti/csl/arch/csl_arch.h> /* OSAL Header files */ #include <ti/osal/osal.h> /* UART Header files */ #include <ti/drv/uart/UART.h> #include <ti/drv/uart/UART_stdio.h> #include <ti/drv/uart/src/UART_osal.h> #include <ti/drv/uart/soc/UART_soc.h> #include <ti/board/src/evmAM572x/include/evmam572x_pinmux.h> /****************************************************************************/ /* INTERNAL MACROS */ /****************************************************************************/ /* EDMA3 Event queue number. */ #define EVT_QUEUE_NUM (0U) /* EDMA3 TPCC region. */ #define EDMA3_CC_REGION (2U) /* PaRAM Set number for Dummy Transfer. */ #define DUMMY_CH_NUM (5U) /* EDMA3 interrupt number. */ /* EDMA3 error interrupt number. */ //说明:Table 17-4. DSP2_INTC Default Interrupt Mapping 查看默认映射关系 /* #if (EDMA3_CC_REGION==3) #define EDMA3_CC_XFER_COMPLETION_INT 20 //TPCC_INT3 - EDMA CC region3 interrupt #define EDMA3_CC_XFER_ERROR_INT 27 #elif (EDMA3_CC_REGION==2) #define EDMA3_CC_XFER_COMPLETION_INT 19 //TPCC_INT2 - EDMA CC region2 interrupt #define EDMA3_CC_XFER_ERROR_INT 27 #elif (EDMA3_CC_REGION == 1) #define EDMA3_CC_XFER_COMPLETION_INT 18 //TPCC_INT1 - EDMA CC region1 interrupt #define EDMA3_CC_XFER_ERROR_INT 27 #elif (EDMA3_CC_REGION == 0) #define EDMA3_CC_XFER_COMPLETION_INT 17 //TPCC_INT0 - EDMA CC region0 interrupt #define EDMA3_CC_XFER_ERROR_INT 27 #endif */ /* EDMA3 interrupt number. */ #define EDMA3_CC_XFER_COMPLETION_INT (75U) #define XBAR_INST_CC_XFER_COMPLETION (CSL_XBAR_INST_DSP2_IRQ_75) #define XBAR_INTR_SOURCE_CC_XFER_COMPLETION (CSL_XBAR_EDMA_TPCC_IRQ_REGION1) /* EDMA3 error interrupt number. */ #define EDMA3_CC_XFER_ERROR_INT (76U) #define XBAR_INST_CC_XFER_ERROR (CSL_XBAR_INST_DSP2_IRQ_76) #define XBAR_INTR_SOURCE_CC_XFER_ERROR (CSL_XBAR_EDMA_TPCC_IRQ_REGION1) /* DSP2 EDMA3 transfer event number */ /******************* Transmit related definitions **************************/ /* ** Transmit DMA Threshold Value. This is set in TX_DMA_THRESHOLD register. */ #define TX_DMA_THRESHOLD (5U) /* ** Transmit Trigger Space value. Use this if TX Trigger Level granularity ** is selected to be 1. */ #define TX_TRIGGER_SPACE_GRAN_1 (8U) /* Number of bytes transmitted by EDMA per TX event sent by UART. */ #define TX_BYTES_PER_EVENT (8U) /******************* Receive related definitions ***************************/ /* Receiver Buffer Size. */ #define RX_BUFFER_SIZE (50U) /* Receive DMA Threshold Value. */ #define RX_DMA_THRESHOLD (8U) /* Number of bytes to be received from the user. */ #define NUM_RX_BYTES (8) /******************* DMA XBAR related definitions ***************************/ /* DMA XBAR Instance for UART1 Tx/RX. Refer TRM for DMA XBAR instance numbers.*/ /* Wrapper Definitions. */ #define EDMA3_UART_TX_CHA_NUM (16U) #define EDMA3_UART_RX_CHA_NUM (49U) //Table 16-6. Connection of The Device DREQs to The DMA_CROSSBAR Inputs #define DMA_XBAR_INST_TX (49U) #define DMA_XBAR_INST_RX (50U) //Table 16-89. EDMA Default Request Mapping //#define DMA_XBAR_INST_TX_SRC CSL_XBAR_INST_DMA_EDMA_DREQ_48 //#define DMA_XBAR_INST_RX_SRC CSL_XBAR_INST_DMA_EDMA_DREQ_49 //Table 5-7. DSP2_EDMA Default Request Mapping #define DMA_XBAR_INST_TX_SRC CSL_XBAR_INST_DMA_DSP2_DREQ_16 #define DMA_XBAR_INST_RX_SRC CSL_XBAR_INST_DMA_DSP2_DREQ_17 // EDMA3 参数 #define MAX_ACNT 1 #define MAX_CCNT 1 /* OPT Field specific defines */ #define OPT_SYNCDIM_SHIFT (0x00000002u) #define OPT_TCC_MASK (0x0003F000u) #define OPT_TCC_SHIFT (0x0000000Cu) #define OPT_ITCINTEN_SHIFT (0x00000015u) #define OPT_TCINTEN_SHIFT (0x00000014u) #define OPT_TCCMOD_SHIFT (0x0000000Bu) #define UART_EDMA3CC_OPT_FIFO_WIDTH ((uint32_t)0xFFFFF8FFU) /**< Set FIFO Width for edma transfer */ #define UART_EDMA3CC_OPT_DAM_CONST_MODE ((uint32_t)0x00000002U) /**< Set DAM in Constant Addressing Mode */ #define UART_EDMA3CC_OPT_SAM_INCR_MODE ((uint32_t)0xFFFFFFFEU) /**< Set SAM in Increment Mode */ /****************************************************************************/ /* GLOBAL VARIABLES */ /****************************************************************************/ static void(*cb_Fxn[EDMA3_NUM_TCC]) (uint32_t tcc); unsigned char intent[] = "The application echoes the characters that you type on the console.\r\n"; unsigned char welcome[] = "StarterWare UART DMA application.\r\n"; unsigned char enter[] = "Please Enter 08 bytes from keyboard.\r\n"; volatile uint32_t clBackFlag = 0; unsigned char rxBuffer[RX_BUFFER_SIZE]; /* ** Transmit Trigger Space value. This is applicable only when UART FIFO mode ** is used. Refer to the comments of the API UARTFIFOConfig() to find the ** possible values of TX Trigger Space. */ uint32_t txTrigSpace = TX_TRIGGER_SPACE_GRAN_1; /* ** Number of bytes transmitted by EDMA per TX event sent by UART. ** In UART FIFO mode, this should be equal to the TX Trigger Space value. */ uint32_t txBytesPerEvent = TX_BYTES_PER_EVENT; /* ** Receive DMA Thresold Level. This applies to both UART FIFO and Non-FIFO ** modes of operation. For FIFO mode, refer to the comments of the API ** UARTFIFOConfig() to find the possible values of RX Trigger Level. ** For Non-FIFO mode, this value is 1. */ uint32_t rxTrigLevel = RX_DMA_THRESHOLD; /* Transmit DMA Threshold Level. This is set in TX_DMA_THRESHOLD register. */ uint32_t txThreshLevel = TX_DMA_THRESHOLD; uint32_t uartBaseAddr = SOC_UART1_BASE; uint32_t edma_address = CSL_DSP_DSP_EDMA_CC_REGS; //CSL_DSP_DSP_EDMA_CC_REGS CSL_DSP_EDMA_CC_REGS CSL_DSP_DSP2_EDMA_CC_REGS SOC_EDMA_TPCC_BASE_VIRT //#pragma DATA_ALIGN (local_arr, 32) //256位地址对齐,地址的低5位为0 static uint8_t local_arr[256] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x11, 0x22, 0x33, 0x44, 0x66, 0xFF, 0xEE, 0xAA}; /****************************************************************************/ /* LOCAL FUNCTION DEFINITIONS */ /****************************************************************************/ static void edma_hwi_init(void); static void Edma3CompletionIsr(void); static void padConfig_prcmEnable() { uint32_t regVal = 0; /* uart1 pinmux initialization */ CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_RXD_UART1_RXD_MUXMODE, 0x0U); //0x0: uart1_rxd CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_RXD_UART1_RXD_SLEWCONTROL, 0x1U); //0x1: Slow slew is selected CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_RXD_UART1_RXD_INPUTENABLE, 0x1U); //0x1: Receive mode is enabled ((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_UART1_RXD = regVal; /* uart1_rxd.uart1_rxd */ CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_TXD_UART1_TXD_MUXMODE, 0x0U); CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_TXD_UART1_TXD_SLEWCONTROL, 0x1U); CSL_FINS(regVal, CONTROL_CORE_PAD_IO_PAD_UART1_TXD_UART1_TXD_INPUTENABLE, 0x1U); ((CSL_padRegsOvly) CSL_MPU_CORE_PAD_IO_REGISTERS_REGS)->PAD_UART1_TXD = regVal; /* uart1_txd.uart1_txd */ } static void PlatformEDMAWkupDepEnable(void) { HW_WR_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPTC1_WKDEP, 0x1); //0x4a008700U + 0x78U = 0x4A00 8778U, CM_L3MAIN1_TPTC1_CLKCTRL while ((HW_RD_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPTC1_WKDEP) & 0x00030000U) != 0x0) { ; } HW_WR_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPTC2_WKDEP, 0x1); //0x4A00 8780U,CM_L3MAIN1_TPTC2_CLKCTRL while ((HW_RD_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPTC2_WKDEP) & 0x00030000U) != 0x0) { ; } HW_WR_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPCC_WKDEP, 0x1); //0x4A00 8770U,CM_L3MAIN1_TPCC_CLKCTRL while ((HW_RD_REG32(SOC_CORE_CM_CORE_BASE + PM_L3MAIN1_TPCC_WKDEP) & 0x00030000U) != 0x0) { ; } } /* ** This function configures the AINTC to receive EDMA3 interrupts. */ static void Edma3INTCConfigure(void) { //中断映射 -> 默认映射,无需重新映射 // CSL_xbarIrqConfigure(CSL_XBAR_IRQ_CPU_ID_DSP2, // XBAR_INST_CC_XFER_COMPLETION, // XBAR_INTR_SOURCE_CC_XFER_COMPLETION); // CSL_xbarIrqConfigure(CSL_XBAR_IRQ_CPU_ID_DSP2, // XBAR_INST_CC_XFER_ERROR, // XBAR_INTR_SOURCE_CC_XFER_ERROR); edma_hwi_init(); } /* ** A wrapper function performing FIFO configurations. */ static void UartFIFOConfigure(void) { uint32_t fifoConfig = 0; #if 0 /* ** Transmitter Trigger Level Granularity is 1. ** Receiver Trigger Level Granularity is 1. ** Transmit Trigger Space set 1. ** Receive Trigger level set 1. ** Clear the Trasnmit FIFO. ** Clear the Receive FIFO. ** DMA Mode enabling shall happen through SCR register. ** DMA Mode 1 is enabled. */ fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1, UART_TRIG_LVL_GRANULARITY_1, 1, 1, 1, 1, UART_DMA_EN_PATH_SCR, UART_DMA_MODE_3_ENABLE); #else /* ** Transmitter Trigger Level Granularity is 1. ** Receiver Trigger Level Granularity is 1. ** Transmit Trigger Space set using 'txTrigSpace'. ** Receive Trigger level set using 'rxTrigLevel'. ** Clear the Trasnmit FIFO. ** Clear the Receive FIFO. ** DMA Mode enabling shall happen through SCR register. ** DMA Mode 1 is enabled. */ fifoConfig = UART_FIFO_CONFIG(UART_TRIG_LVL_GRANULARITY_1, UART_TRIG_LVL_GRANULARITY_1, txTrigSpace, //8 rxTrigLevel, //8 1, 1, UART_DMA_EN_PATH_SCR, UART_DMA_MODE_3_ENABLE); #endif /* Configuring the FIFO settings. */ fifoConfig = UARTFIFOConfig(uartBaseAddr, fifoConfig); Log_print1(Diags_ENTRY, "FCR: 0x%02x", fifoConfig); } /* ** A wrapper function performing Baud Rate settings. */ static void UartBaudRateSet(void) { uint32_t divisorValue = 0; /* Computing the Divisor Value. */ divisorValue = UARTDivisorValCompute(UART_MODULE_INPUT_CLK, BAUD_RATE_115200, UART16x_OPER_MODE, UART_MIR_OVERSAMPLING_RATE_42); /* Programming the Divisor Latches. */ UARTDivisorLatchWrite(uartBaseAddr, divisorValue); } /* ** This function initializes the UART instance for use. */ static void UartInitialize(void) { /* Performing a module reset. */ //UARTModuleReset(uartBaseAddr); /* Performing FIFO configurations. */ UartFIFOConfigure(); /* Selecting the method of setting the Transmit DMA Threshold value. */ UARTTxDMAThresholdControl(uartBaseAddr, UART_TX_DMA_THRESHOLD_REG); /* Configuring the Transmit DMA Threshold value. */ UARTTxDMAThresholdValConfig(uartBaseAddr, txThreshLevel); //txThreshLevel = 5 /* Performing Baud Rate settings. */ UartBaudRateSet(); /* Switching to Configuration Mode B. */ UARTRegConfigModeEnable(uartBaseAddr, UART_REG_CONFIG_MODE_B); /* Programming the Line Characteristics. */ UARTLineCharacConfig(uartBaseAddr, (UART_FRAME_WORD_LENGTH_8 | UART_FRAME_NUM_STB_1), UART_PARITY_NONE); /* Disabling write access to Divisor Latches. */ UARTDivisorLatchDisable(uartBaseAddr); /* Disabling Break Control. */ UARTBreakCtl(uartBaseAddr, UART_BREAK_COND_DISABLE); /* Switching to UART16x operating mode. */ UARTOperatingModeSelect(uartBaseAddr, UART16x_OPER_MODE); } /* ** This function configures the DMA crossbar for UART TX and RX events. */ static void EdmaEvtConfigure(void) { CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_DSP2_DMA, DMA_XBAR_INST_TX, //?? DMA_XBAR_INST_TX_SRC); // CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_DSP2_DMA, DMA_XBAR_INST_RX, // DMA_XBAR_INST_RX_SRC); } /****************************************************************************/ /* */ /* 发送数据 */ /* */ /****************************************************************************/ void UartTransmitData(unsigned int tccNum, unsigned int chNum, volatile char *buffer, unsigned int buffLength) { EDMA3CCPaRAMEntry paramSet; unsigned char *p = (unsigned char *)¶mSet; unsigned int icyc = 0; /* Clean-up the contents of structure variable. */ for (icyc = 0; icyc < sizeof(paramSet); icyc++) { p[icyc] = 0; } // 配置参数 RAM paramSet.srcAddr = (unsigned int)buffer; // 接收缓存寄存器 / 发送保持寄存器 地址 paramSet.destAddr = uartBaseAddr + 0; paramSet.aCnt = 1; paramSet.bCnt = (unsigned short)buffLength; paramSet.cCnt = 1; // 源索引自增系数 1 即一个字节 paramSet.srcBIdx = (short)1u; // 目标索引自增系数 paramSet.destBIdx = (short)0u; // AB同步传输模式 paramSet.srcCIdx = (short)0u; paramSet.destCIdx = (short)0u; paramSet.linkAddr = (unsigned short)0xFFFFu; paramSet.bCntReload = (unsigned short)0u; /* OPT PaRAM entries. */ paramSet.opt = (uint32_t) 0x0; /* Src is in INCR mode & Dest is in FIFO modes */ paramSet.opt &= UART_EDMA3CC_OPT_SAM_INCR_MODE; //[0] paramSet.opt |= UART_EDMA3CC_OPT_DAM_CONST_MODE; //[1] /* FIFO width is 8 bit */ //paramSet.opt &= UART_EDMA3CC_OPT_FIFO_WIDTH; //[10:8] paramSet.opt &= ((uint32_t)0xFFFFFCFFU); /* AB Synchronized Transfer. */ paramSet.opt |= (1 << EDMA_TPCC_OPT_SYNCDIM_SHIFT); /* Setting the Transfer Complete Code(TCC). */ paramSet.opt |= ((tccNum << EDMA_TPCC_OPT_TCC_SHIFT) & EDMA_TPCC_OPT_TCC_MASK); //[17:12] /* Enabling the Completion Interrupt. */ paramSet.opt |= (1 << EDMA_TPCC_OPT_TCINTEN_SHIFT); //[20] Log_print2(Diags_ENTRY, "opt = 0x%02x, bCnt = 0x%02x", paramSet.opt, paramSet.bCnt); //0x110006 // 写参数 RAM EDMA3SetPaRAM(edma_address, chNum, ¶mSet); } /* ** This function is used as a callback from EDMA3 Completion Handler. */ static void callback(uint32_t tccNum) { /* Disabling DMA Mode of operation in UART. */ UARTDMADisable(uartBaseAddr); /* Disabling DMA transfer on the specified channel. */ EDMA3DisableTransfer(edma_address, tccNum, EDMA3_TRIG_MODE_EVENT); clBackFlag = 1; } /* ** EDMA Completion Interrupt Service Routine(ISR). */ static void Edma3CompletionIsr(void) { volatile uint32_t pendingIrqs; uint32_t index = 1; uint32_t count = 0; if (EDMA3GetIntrStatus(edma_address)) { /* ** Wait for a finite time to monitor the EDMA Completion Interrupt ** status. */ while ((count < EDMA3CC_COMPL_HANDLER_RETRY_COUNT) && (index != 0U)) { index = 0; /* Get the Interrupt status. */ pendingIrqs = EDMA3GetIntrStatus(edma_address); while (pendingIrqs) { if ((pendingIrqs & 1U) == TRUE) { /* Clear the interrupt status. */ EDMA3ClrIntr(edma_address, index); (*cb_Fxn[index])(index); } ++index; pendingIrqs >>= 1U; } count++; } } #if 0 if(EDMA3IntrStatusHighGet(edma_address)) { Log_print1(Diags_ENTRY, "------------------> EDMA3IntrStatusHighGet: 0x%02x", EDMA3IntrStatusHighGet(edma_address)); while ((count < EDMA3CC_COMPL_HANDLER_RETRY_COUNT) && (index != 0U)) { index = 32; pendingIrqs = EDMA3IntrStatusHighGet(edma_address); while(pendingIrqs) { if( (pendingIrqs & 1U) == TRUE ) { EDMA3ClrIntr(edma_address, index); if(cb_Fxn[index]) { (*cb_Fxn[index])(index); } } } } } #endif } /* ** EDMA Error Interrupt Service Routine(ISR). */ static void Edma3ErrorIsr(void) { volatile uint32_t pendingIrqs = 0; uint32_t evtqueNum = 0; uint32_t index = 1; uint32_t Cnt = 0; Log_print2(Diags_ENTRY, "EDMA3GetErrIntrStatus: 0x%02x, EDMA3GetCCErrStatus: 0x%02x", EDMA3GetErrIntrStatus(edma_address), EDMA3GetCCErrStatus(edma_address)); Log_print1(Diags_ENTRY, "EDMA3ErrIntrHighStatusGet: 0x%02x", EDMA3ErrIntrHighStatusGet(edma_address)); if ((0 != EDMA3GetErrIntrStatus(edma_address)) || (0 != (EDMA3GetCCErrStatus(edma_address)))) { /* Loop for EDMA3CC_ERR_HANDLER_RETRY_COUNT number of time, breaks * when no pending interrupt is found */ while ((Cnt < EDMA3CC_ERR_HANDLER_RETRY_COUNT) && (index != 0U)) { index = 0U; pendingIrqs = EDMA3GetErrIntrStatus(edma_address); while (pendingIrqs) { /*Process all the pending interrupts*/ if ((pendingIrqs & 1U) == TRUE) { /* Writing to EMCR to clear the corresponding EMR bits. * Also clearing any Secondary events in SER. */ EDMA3ClrMissEvt(edma_address, index); } ++index; pendingIrqs >>= 1U; } index = 0U; pendingIrqs = EDMA3GetCCErrStatus(edma_address); if (pendingIrqs != 0U) { /* Process all the pending CC error interrupts. */ /* Queue threshold error for different event queues. */ for (evtqueNum = 0U; evtqueNum < EDMA3_0_NUM_EVTQUE; evtqueNum++) { if ((pendingIrqs & (1U << evtqueNum)) != 0U) { /* Clear the error interrupt. */ EDMA3ClrCCErr(edma_address, (1U << evtqueNum)); } } /* Transfer completion code error. */ if ((pendingIrqs & (1 << EDMA_TPCC_CCERR_TCERR_SHIFT)) != 0U) { EDMA3ClrCCErr(edma_address, (0x01U << EDMA_TPCC_CCERR_TCERR_SHIFT)); } ++index; } Cnt++; } } Log_print2(Diags_ENTRY, "EDMA3GetErrIntrStatus: 0x%02x, EDMA3GetCCErrStatus: 0x%02x", EDMA3GetErrIntrStatus(edma_address), EDMA3GetCCErrStatus(edma_address)); Log_print1(Diags_ENTRY, "EDMA3ErrIntrHighStatusGet: 0x%02x", EDMA3ErrIntrHighStatusGet(edma_address)); } #define DSP1_EDMA3_CC_XFER_COMPLETION_INT 19 //TPCC_INT2 - EDMA CC region2 interrupt #define DSP1_EDMA3_CC_ERROR_INT 27 static void edma_cb_isr(UInt32 event_id) { switch(event_id) { case DSP1_EDMA3_CC_XFER_COMPLETION_INT: /* Transfer completed successfully */ Edma3CompletionIsr(); break; case DSP1_EDMA3_CC_ERROR_INT: /* Transfer resulted in error. */ Edma3ErrorIsr(); break; default: break; }; } static void edma_hwi_init(void) { Hwi_Params hwiParams; Error_Block eb; Hwi_Params_init(&hwiParams); Error_init(&eb); /* set the event id of the peripheral assigned to this interrupt */ hwiParams.eventId = DSP1_EDMA3_CC_XFER_COMPLETION_INT; /* set the argument passed to ISR function */ hwiParams.arg = DSP1_EDMA3_CC_XFER_COMPLETION_INT; hwiParams.maskSetting = Hwi_MaskingOption_SELF; Hwi_create(11, edma_cb_isr, &hwiParams, &eb); if (Error_check(&eb)) { Log_print0(Diags_INFO, "Hwi create failed \n"); return ; } /* set the event id of the peripheral assigned to this interrupt */ hwiParams.eventId = DSP1_EDMA3_CC_ERROR_INT; /* set the argument passed to ISR function */ hwiParams.arg = DSP1_EDMA3_CC_ERROR_INT; hwiParams.maskSetting = Hwi_MaskingOption_SELF; Hwi_create(12, edma_cb_isr, &hwiParams, &eb); if (Error_check(&eb)) { Log_print0(Diags_INFO, "Hwi create failed \n"); return ; } // Hwi_enable(); } void uart_task(UArg a0, UArg a1) { uint32_t icyc = 0; for(icyc=0; icyc<256; icyc++) { local_arr[icyc] = icyc+1; } Log_print0(Diags_ENTRY, "uart_task | edma | 20220401-V5.3.1"); /*Pad configuration and PRCM enable*/ padConfig_prcmEnable(); /*Configure the EDMA clock */ PlatformEDMAWkupDepEnable(); /* Do EDMA init Done once in the beginning of application */ EDMAsetRegion(EDMA3_CC_REGION); EDMA3Init(edma_address, EVT_QUEUE_NUM); // SOC_EDMA_TPCC_BASE_VIRT CSL_DSP_DSP_EDMA_CC_REGS Edma3INTCConfigure(); UartInitialize(); EdmaEvtConfigure(); /* Request DMA Channel and TCC for UART Transmit*/ EDMA3RequestChannel(edma_address, EDMA3_CHANNEL_TYPE_DMA, EDMA3_UART_TX_CHA_NUM, EDMA3_UART_TX_CHA_NUM, EVT_QUEUE_NUM); /* Registering Callback Function for TX*/ cb_Fxn[EDMA3_UART_TX_CHA_NUM] = &callback; icyc = 8; /* Configuring EDMA PaRAM sets to transmit 'welcome' message. */ UartTransmitData(EDMA3_UART_TX_CHA_NUM, EDMA3_UART_TX_CHA_NUM, (volatile char *)local_arr, icyc++); // 使能 EDMA3 通道 EDMA3EnableTransfer(edma_address, EDMA3_UART_TX_CHA_NUM, EDMA3_TRIG_MODE_EVENT); //EDMA3_TRIG_MODE_EVENT EDMA3_TRIG_MODE_MANUAL /* Enabling DMA Mode 3. */ UARTDMAEnable(uartBaseAddr, UART_DMA_MODE_3_ENABLE); while(1) { if(clBackFlag == 1) { clBackFlag = 0; /* Configuring EDMA PaRAM sets to transmit 'welcome' message. */ UartTransmitData(EDMA3_UART_TX_CHA_NUM, EDMA3_UART_TX_CHA_NUM, (volatile char *)local_arr, icyc); // 使能 EDMA3 通道 EDMA3EnableTransfer(edma_address, EDMA3_UART_TX_CHA_NUM, EDMA3_TRIG_MODE_EVENT); //EDMA3_TRIG_MODE_EVENT EDMA3_TRIG_MODE_MANUAL /* Enabling DMA Mode 3. */ UARTDMAEnable(uartBaseAddr, UART_DMA_MODE_3_ENABLE); icyc++; if(icyc == 70) { icyc = 0; break; } } Task_sleep(100); } /******************* Freeing of allocated channels **********************/ /* Free EDMA3 Channels for TX and RX */ // EDMA3FreeChannel(edma_address, EDMA3_CHANNEL_TYPE_DMA, // EDMA3_UART_TX_CHA_NUM, EDMA3_TRIG_MODE_MANUAL, // EDMA3_UART_TX_CHA_NUM, EVT_QUEUE_NUM); }
目前,我已实现UART EDMA发送数据,但是存在BUG,只能发送8-65字节的数据,若发送数据长度小于8字节,则无法发送数据,发送数据长度大于65字节,则只能发送65字节,超出部分的数据丢失。能帮我看下我的配置哪里出问题吗?
我怀疑是UART FIFO配置异常,还有就是,PaRAM参数的opt[DAM],应该设置为INCR还是FIFO,若设置为FIFO,则FWID应该设置为多少?
跟这个帖子中的现象有点像,参考以下帖子的讨论看一下,可能是FIFO下EDMA配置的问题。
https://e2echina.ti.com/support/processors/f/processors-forum/190473/c6678-dma/586483