TI的工程师您好,我在使用AM5718的DSP核测试MCASP回环程序时遇到了一个问题,时钟线能输出我设置的频率对应的波形,同步线也一样,但是AXR引脚无法输出波形,接收缓冲区也无法接收到数据,设置的回调函数也无法触发,我在传输后查看TXSTAT和RXSTAT寄存器的值分别是0x171和0x175,也就是传输出现了错误,我在论坛上看了很多帖子,同时也查看了很多手册,没有找到哪里出了问题,希望您能帮我解答疑惑。
部分测试程序如下:
/* * bsp_mcasp.c * * Created on: 2022年3月10日 * Author: lhy0611 */ /* XDCtools Header files */ #include <xdc/std.h> #include <xdc/cfg/global.h> #include <xdc/runtime/System.h> #include <xdc/runtime/Error.h> #include <xdc/runtime/Diags.h> #include <xdc/runtime/Log.h> #include <xdc/runtime/Assert.h> #include <xdc/runtime/Registry.h> #include <xdc/runtime/IHeap.h> #include <xdc/runtime/Memory.h> /* BIOS Header files */ #include <ti/sysbios/BIOS.h> #include <ti/sysbios/knl/Task.h> #include <ti/sysbios/knl/Clock.h> #include <ti/sysbios/heaps/HeapMem.h> #include <ti/sysbios/hal/Hwi.h> #include <ti/sysbios/knl/Swi.h> #include <ti/ipc/Ipc.h> #include <ti/ipc/MessageQ.h> #include <ti/ipc/MultiProc.h> #include <ti/sysbios/knl/Semaphore.h> #include <stdio.h> #include <ti/csl/example/utils/common/inc/app_utils.h> #include <ti/csl/soc.h> #include <ti/csl/hw_types.h> #include <ti/csl/csl_edma.h> #include <ti/csl/csl_chip.h> #include <ti/csl/arch/csl_arch.h> /* TI-RTOS Header files */ #include <ti/drv/gpio/GPIO.h> #include <ti/drv/gpio/soc/GPIO_soc.h> #include <ti/drv/gpio/test/led_blink/src/GPIO_log.h> #include <ti/drv/gpio/test/led_blink/src/GPIO_board.h> #include <ti/board/board.h> #include <ti/osal/osal.h> #include <ti/osal/CacheP.h> /* EDMA3 头文件 */ #include <ti/sdo/edma3/drv/edma3_drv.h> #include <ti/sdo/edma3/rm/edma3_rm.h> #include <ti/sdo/edma3/rm/sample/bios6_edma3_rm_sample.h> #include <ti/drv/mcasp/mcasp_drv.h> #include <ti/drv/mcasp/mcasp_osal.h> #include <ti/drv/mcasp/soc/mcasp_soc.h> #include <ti/csl/csl_mcasp.h> #include <bsp_mcasp.h> #include <mcasp_cfg.h> #include <mcasp_drv.h> #include <mcasp_tune.h> void Configure_XBAR(void) { /* Mapping the DMA crossbar for McASP DMA_DREQ_(128-120) in to EDMA3_DREQ_0-15. * The EDMA3_DREQ_0-15 correspond to (CSL_EDMA3_CHA_MCASP'n'_RX) which are * used inside mcasp_soc.c to register EDMA. Please note that the API below takes * the mapped DMAReq with 1 as the base, whereas CSL_EDMA3_CHA_MCASP'n' * are with base 0 */ CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 128, 1 + CSL_EDMA3_CHA_MCASP0_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 129, 1 + CSL_EDMA3_CHA_MCASP0_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 130, 1 + CSL_EDMA3_CHA_MCASP1_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 131, 1 + CSL_EDMA3_CHA_MCASP1_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 132, 1 + CSL_EDMA3_CHA_MCASP2_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 133, 1 + CSL_EDMA3_CHA_MCASP2_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 134, 1 + CSL_EDMA3_CHA_MCASP3_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 135, 1 + CSL_EDMA3_CHA_MCASP3_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 136, 1 + CSL_EDMA3_CHA_MCASP4_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 137, 1 + CSL_EDMA3_CHA_MCASP4_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 138, 1 + CSL_EDMA3_CHA_MCASP5_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 139, 1 + CSL_EDMA3_CHA_MCASP5_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 140, 1 + CSL_EDMA3_CHA_MCASP6_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 141, 1 + CSL_EDMA3_CHA_MCASP6_TX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 142, 1 + CSL_EDMA3_CHA_MCASP7_RX); CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 143, 1 + CSL_EDMA3_CHA_MCASP7_RX); } void configMcASP_SocHwInfo(void) { /* Configure the interrupts for the McASP Instance MCASP_NUM */ /* ON Keystone, it involves CIC programming as well. * The McASP does that internally, if configured with the correct parameters. * Such as muxNum, muxInEvent, muxOutEvent, * cpuInEventNum, cpuIntNum */ Mcasp_HwInfo hwInfo; Mcasp_socGetInitCfg(MCASP_NUM, &hwInfo); if ((hwInfo.rxMuxOutEvent == MCASP_UNASSIGNED_MUX_EVENTNUM) || (hwInfo.txMuxOutEvent == MCASP_UNASSIGNED_MUX_EVENTNUM)) { #ifdef _TMS320C6X /* Choosing a free Crossbar Instance number from Table 17-3. DSP1_INTC Default Interrupt Mapping * in the AM572x TRM . Please note that this is fore Core 0 , i.e DSP1 only*/ /* Freely available cross bar instance numbers for DSP1 */ hwInfo.txMuxOutEvent = CSL_XBAR_INST_DSP1_IRQ_74; hwInfo.rxMuxOutEvent = CSL_XBAR_INST_DSP1_IRQ_75; /* The CPU event numbers corresponding to the above */ hwInfo.cpuTxEventNumber = 74; hwInfo.cpuRxEventNumber = 75; #endif } /* Write back */ Mcasp_socSetInitCfg(MCASP_NUM, &hwInfo); } extern EDMA3_DRV_GblConfigParams sampleEdma3GblCfgParams[]; static void enableEDMAHwEvent(uint32_t edmaNum, uint32_t eventNo) { sampleEdma3GblCfgParams[edmaNum].dmaChannelHwEvtMap[eventNo / 32] |= (1 << (eventNo % 32)); } EDMA3_DRV_Handle McaspApp_edmaInit(Mcasp_HwInfo *cfg) { EDMA3_DRV_Handle hEdma; EDMA3_DRV_Result edmaResult = 0; enableEDMAHwEvent(EDMACC_NUM, CSL_EDMA3_CHA_MCASP2_RX); enableEDMAHwEvent(EDMACC_NUM, CSL_EDMA3_CHA_MCASP2_TX); hEdma = edma3init(EDMACC_NUM, &edmaResult); if (edmaResult != EDMA3_DRV_SOK) { /* Report EDMA Error */ System_printf("\nEDMA driver initialization unsuccessful\n"); } else { System_printf("\nEDMA driver initialization successful.\n"); } return hEdma; } void mcaspAppCallback(void *arg, MCASP_Packet *ioBuf) { System_printf("\nmcaspAppCallback.\n"); if (ioBuf->cmd == MCASP_READ) { } else if (ioBuf->cmd == MCASP_WRITE) { } else { } } Mcasp_HwSetupData mcaspRcvSetup = { /* .rmask = */0xFFFFFFFF, /* All the data bits are to be used */ /* .rfmt = */0x000080b0, /* 0 bit delay from framsync * MSB first * No extra bit padding * Padding bit (ignore) * slot Size is 24 * Reads from DMA port * NO rotation */ /* .afsrctl = */0x00000193, /* 3-slot TDM mode, * Frame sync is one word * Internally generated frame sync * Falling edge is start of frame */ /* I2S MODE*/ /* .rtdm = */0x00000007, /* 3 slots are active * */ /* .rintctl = */0x000000b3, /* sync error and overrun error */ /* .rstat = */0x000001FF, /* reset any existing status bits */ /* .revtctl = */0x00000000, /* DMA request is enabled or disabled */ { //25Mhz /* I2S MODE*/ /* .aclkrctl = */0x00000023, /* Div (4), Internal Source, rising edge */ /* .ahclkrctl = */0x00008003, /* Div (4), Internal AUX_CLK Source */ /* .rclkchk = */0x00000000 } }; Mcasp_HwSetupData mcaspXmtSetup = { /* .xmask = */0xFFFFFFFF, /* All the data bits are to be used */ /* I2S MODE*/ /* .xfmt = */0x000080b0, //0x4846 80A8 /* * 0 bit delay from framsync * MSB first * No extra bit padding * Padding bit (ignore) * slot Size is 24 * Reads from DMA port * 0-bit rotation */ /*I2S MODE*/ /* .afsxctl = */0x00000193, /* 3-slot TDM mode,//0x4846 80AC * Frame sync is one word * internally generated frame sync * Falling edge is start of frame */ /* .xtdm = */0x00000007, /* 3 slots are active */ // 0x4846 80B8 /* .xintctl = */0x000000b7, /* sync error,overrun error,clK error */ //0x4846 80BC /* .xstat = */0x000001FF, /* reset any existing status bits */ //0x4846 80C0 /* .xevtctl = */0x00000000, /* DMA request is enabled or disabled */ //0x4846 80CC { //25Mhz /* I2S MODE*/ // 0x4846 80B0 /* .aclkxctl = */0x00000023, /* Div (4), Internal Source, SYNC, Falling edge */ /* .ahclkxctl = */0x00008003, /* Div (4), Internal AUX_CLK Source */ /* .xclkchk = */0x00000000 }, }; /* The below variables are used to quit the frame processing loop if an error occurs */ int gblErrFlagXmt = 0; int gblErrFlagRcv = 0; /* The below variables are used to analyze the errors if an error interrupt happens */ Mcasp_errCbStatus errCbStatusXmt; Mcasp_errCbStatus errCbStatusRcv; /* Error handler for Transmit side */ void GblErrXmt(Mcasp_errCbStatus errCbStat) { gblErrFlagXmt = 1; errCbStatusXmt = errCbStat; System_printf("GblErrXmt\n"); } /* Error handler for Rcv side */ void GblErrRcv(Mcasp_errCbStatus errCbStat) { gblErrFlagRcv = 1; errCbStatusRcv = errCbStat; System_printf("GblErrRcv\n"); } Mcasp_Params mcaspParams; Ptr hMcaspDev; /* McAsp channel parameters */ Mcasp_ChanParams mcasp_txchanparam = { // .noOfSerRequested = TX_NUM_SERIALIZER, //1 .indexOfSersRequested = { Mcasp_SerializerNum_0 }, // .mcaspSetup = &mcaspXmtSetup, // .isDmaDriven = TRUE, .channelMode = Mcasp_OpMode_TDM, // .wordWidth = Mcasp_WordLength_24, // .userLoopJobBuffer = NULL, .userLoopJobLength = 0, // .edmaHandle = NULL, // .gblCbk = (Mcasp_GblCallback) &GblErrXmt, // .noOfChannels = 1, // .dataFormat = Mcasp_BufferFormat_1SER_MULTISLOT_NON_INTERLEAVED, // .enableHwFifo = TRUE, // .hwFifoEventDMARatio = TX_FIFO_EVENT_DMA_RATIO, // .isDataPacked = TRUE, // .wordBitsSelect = Mcasp_WordBitsSelect_LSB // }; Mcasp_ChanParams mcasp_rxchanparam = { // .noOfSerRequested = RX_NUM_SERIALIZER, //1 .indexOfSersRequested = { Mcasp_SerializerNum_1 }, // .mcaspSetup = &mcaspRcvSetup, // .isDmaDriven = TRUE, // .channelMode = Mcasp_OpMode_TDM, // .wordWidth = Mcasp_WordLength_24, // .userLoopJobBuffer = NULL, // .userLoopJobLength = 0, // .edmaHandle = NULL, // .gblCbk = (Mcasp_GblCallback) &GblErrRcv, // .noOfChannels = 1, // .dataFormat = Mcasp_BufferFormat_1SER_MULTISLOT_NON_INTERLEAVED, // .enableHwFifo = TRUE, // .hwFifoEventDMARatio = RX_FIFO_EVENT_DMA_RATIO, // .isDataPacked = TRUE, // .wordBitsSelect = Mcasp_WordBitsSelect_LSB // }; /* Channel Handles */ Ptr hMcaspTxChan; Ptr hMcaspRxChan; /**************************************************************************************/ /* FUNCTION DESCRIPTION: This utility function converts local GEM L2 address in to global memory addresses used by the EDMA inside McASP */ /**************************************************************************************/ static uintptr_t getGlobalAddr(uintptr_t addr) { if ((addr >= 0x800000) && (addr < 0x1000000)) { #ifdef _TMS320C6X uint32_t coreNum; /* Get the core number. */ coreNum = CSL_chipReadReg(CSL_CHIP_DNUM); #if defined(SOC_AM572x) || defined(SOC_AM571x) /* Compute the global address. */ return ((1 << 30) | (coreNum << 24) | (addr & 0x00ffffff)); #else /* Compute the global address. */ return ((1 << 28) | (coreNum << 24) | (addr & 0x00ffffff)); #endif #else return addr; #endif } else { /* non-L2 address range */ return addr; } } /* * ======== prime ======== */ MCASP_Packet rxFrame; MCASP_Packet txFrame; #pragma DATA_SECTION (rxbuf,".l2sram") #pragma DATA_ALIGN (rxbuf,128) uint8_t rxbuf[100]; #pragma DATA_SECTION (txbuf,".l2sram") #pragma DATA_ALIGN (txbuf,128) uint8_t txbuf[100]; Void mcasp_test_Task(void) { Mcasp_HwInfo hwInfo; volatile int32_t i32Count, status = 0; int32_t count = 0; Mcasp_socGetInitCfg(MCASP_NUM, &hwInfo); hwInfo.dmaHandle = McaspApp_edmaInit(&hwInfo); Mcasp_socSetInitCfg(MCASP_NUM, &hwInfo); mcaspParams = Mcasp_PARAMS; mcaspParams.mcaspHwSetup.glb.dlbMode = (CSL_MCASP_DLBCTL_DLBEN_ENABLE | ( CSL_MCASP_DLBCTL_ORD_XMTEVEN << CSL_MCASP_DLBCTL_ORD_SHIFT) | ( CSL_MCASP_DLBCTL_MODE_XMTCLK << CSL_MCASP_DLBCTL_MODE_SHIFT)); status = mcaspBindDev(&hMcaspDev, MCASP_NUM, &mcaspParams); if ((status != MCASP_COMPLETED) || (hMcaspDev == NULL)) { System_printf("mcaspBindDev for McASP Failed\n"); // abort(); } else { System_printf("mcaspBindDev for McASP success\n"); } /* Create Mcasp channel for Tx */ status = mcaspCreateChan(&hMcaspTxChan, hMcaspDev, MCASP_OUTPUT, &mcasp_txchanparam, mcaspAppCallback, NULL); if ((status != MCASP_COMPLETED) || (hMcaspTxChan == NULL)) { System_printf("mcaspCreateChan for McASP3 Tx Failed %d\n", status); // BIOS_exit(0); } else { System_printf("mcaspCreateChan for McASP3 Tx success\n"); } /* Create Mcasp channel for Rx */ status = mcaspCreateChan(&hMcaspRxChan, hMcaspDev, MCASP_INPUT, &mcasp_rxchanparam, mcaspAppCallback, NULL); if ((status != MCASP_COMPLETED) || (hMcaspRxChan == NULL)) { System_printf("mcaspCreateChan for McASP3 Rx Failed\n"); // BIOS_exit(0); } else { System_printf("mcaspCreateChan for McASP3 Rx success\n"); } uint32_t tx_bytes_per_sample = (mcasp_txchanparam.wordWidth / 8); uint32_t rx_bytes_per_sample = (mcasp_rxchanparam.wordWidth / 8); uint32_t tx_frame_size = mcasp_txchanparam.noOfSerRequested * tx_bytes_per_sample; uint32_t rx_frame_size = mcasp_rxchanparam.noOfSerRequested * rx_bytes_per_sample; System_printf("rx_frame_size:%d,tx_frame_size:%d\n", rx_frame_size, tx_frame_size); // rxbuf = malloc(rx_frame_size); // txbuf = malloc(tx_frame_size); memset(rxbuf, 0, rx_frame_size); memset(txbuf, 3, tx_frame_size); rxFrame.cmd = MCASP_READ; rxFrame.addr = rxbuf; //(void*)(getGlobalAddr((uintptr_t) rxbuf)); rxFrame.size = rx_frame_size; rxFrame.arg = (uintptr_t) hMcaspRxChan; rxFrame.status = 0; rxFrame.misc = 1; /* reserved - used in callback to indicate asynch packet */ status = mcaspSubmitChan(hMcaspRxChan, &rxFrame); if ((status != MCASP_PENDING)) { System_printf( "Debug: Error McASP3 RX : Prime buffer #%d submission FAILED\n", status); } else { System_printf( "Debug: McASP3 RX : Prime buffer #%d submission Success\n", status); } txFrame.cmd = MCASP_WRITE; txFrame.addr = txbuf; //(void*) (getGlobalAddr((uintptr_t) txbuf)); txFrame.size = tx_frame_size; txFrame.arg = (uintptr_t) hMcaspTxChan; txFrame.status = 0; txFrame.misc = 1; /* reserved - used in callback to indicate asynch packet */ status = mcaspSubmitChan(hMcaspTxChan, &txFrame); if ((status != MCASP_PENDING)) { System_printf( "Debug: Error McASP3 TX : Prime buffer #%d submission FAILED\n", status); } else { System_printf( "Debug: McASP3 TX : Prime buffer #%d submission Success\n", status); } Task_sleep(1000); int cnt = 0; for (cnt = 0; cnt < tx_frame_size; cnt++) { System_printf("txbuf[%d]:%d,rxbuf[%d]:%d\r\n", cnt, txbuf[cnt], cnt, rxbuf[cnt]); } status = McASPTxStatusGet(CSL_MPU_MCASP3_CFG_REGS); //0x4846 80c0 System_printf("Txstatus:%x\r\n", status); status = McASPRxStatusGet(CSL_MPU_MCASP3_CFG_REGS); //0x4846 8080 System_printf("Rxstatus:%x\r\n", status); // // status = mcaspControlChan(hMcaspRxChan, Mcasp_IOCTL_CHAN_PARAMS_WORD_WIDTH, // &mcasp_chanparam[0]); status = mcaspDeleteChan(hMcaspRxChan); System_printf("Deleting Rx channel %d\r\n", status); status = mcaspDeleteChan(hMcaspTxChan); System_printf("Deleting Tx channel %d\r\n", status); status = mcaspUnBindDev(hMcaspDev); System_printf("UnBinding Mcasp %d\r\n", status); } void McASP3_Enable(void) { //uint32_t regVal = 0U; // Choose SYS_CLK2 (22.5792 MHZ) as source for ABE_PLL REF CLK HW_WR_FIELD32(CSL_DSP_CKGEN_PRM_REGS+CSL_CKGEN_PRM_CM_CLKSEL_ABE_PLL_SYS_REG, \ CSL_CKGEN_PRM_CM_CLKSEL_ABE_PLL_SYS_REG_CLKSEL, \ CSL_CKGEN_PRM_CM_CLKSEL_ABE_PLL_SYS_REG_CLKSEL_SEL_SYS_CLK1); /* Reprogram ABE DPLL for 451.584 MHz output on PER_ABE_X1_GFCLK line */ // step 1: disable the PLL, if enabled (ex: via GEL) while(HW_RD_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN) == CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN_DPLL_LOCK_MODE) HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN_DPLL_FR_BYP_MODE); // step 2: modify Synthesized Clock Parameters - DPLL MULT & DIV HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKSEL_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKSEL_DPLL_ABE_REG_DPLL_MULT, \ 0xC8); HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKSEL_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKSEL_DPLL_ABE_REG_DPLL_DIV, \ 0x09); // step 3: Configure output clocks parameters - M2 = 1 M3 = 1 HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_DIV_M2_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_DIV_M2_DPLL_ABE_REG_DIVHS, \ 0x1); HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_DIV_M3_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_DIV_M3_DPLL_ABE_REG_DIVHS, \ 0x1); // step 4: Confirm that the PLL has locked while(HW_RD_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN) != CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN_DPLL_LOCK_MODE) HW_WR_FIELD32(CSL_DSP_CKGEN_CM_CORE_AON_REGS+CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN, \ CSL_CKGEN_CM_CORE_AON_CM_CLKMODE_DPLL_ABE_REG_DPLL_EN_DPLL_LOCK_MODE); /* McASP3 Module Control */ HW_WR_FIELD32(CSL_DSP_L4PER_CM_CORE_REGS+CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER2_MCASP3_CLKCTRL_REG, \ CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER2_MCASP3_CLKCTRL_REG_MODULEMODE, \ CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER2_MCASP3_CLKCTRL_REG_MODULEMODE_ENABLE); while ((HW_RD_REG32(CSL_DSP_L4PER_CM_CORE_REGS+CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER2_MCASP3_CLKCTRL_REG) & CM_L4PER2_MCASP3_CLKCTRL_MODULEMODE_MASK) != \ CSL_L4PER_CM_CORE_COMPONENT_CM_L4PER2_MCASP3_CLKCTRL_REG_MODULEMODE_ENABLE) ; /* PAD IO Config for McASP3 pins - ACLKX, AFSX, AXR0, AXR1*/ HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_ACLKX, \ CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_ACLKX_MCASP3_ACLKX_MUXMODE, \ 0xc0000);//0x4a00 3724 HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_FSX, \ CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_FSX_MCASP3_FSX_MUXMODE, \ 0xc0000);//0x4a00 3728 HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_AXR0, \ CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_AXR0_MCASP3_AXR0_MUXMODE, \ 0xc0000);//0x4a00 372c HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_AXR1, \ CSL_CONTROL_CORE_PAD_IO_PAD_MCASP3_AXR1_MCASP3_AXR1_MUXMODE, \ 0xc0000);//0x4a00 3730 //HW_WR_REG32(0x4AE06160, 0x1); // CM_CLKSEL_CLKOUT2: 0x1: Selects SYS_CLK2 HW_WR_FIELD32(CSL_DSP_CKGEN_PRM_REGS+CSL_CKGEN_PRM_CM_CLKSEL_CLKOUTMUX2_REG, \ CSL_CKGEN_PRM_CM_CLKSEL_CLKOUTMUX2_REG_CLKSEL, \ CSL_CKGEN_PRM_CM_CLKSEL_CLKOUTMUX2_REG_CLKSEL_SEL_SYS_CLK2);//0x4ae0 6160 HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_XREF_CLK0, \ CSL_CONTROL_CORE_PAD_IO_PAD_XREF_CLK0_XREF_CLK0_INPUTENABLE, \ 0x0); // 0x0: Receive mode is disabled HW_WR_FIELD32(CSL_DSP_CORE_PAD_IO_REGISTERS_REGS+CSL_CONTROL_CORE_PAD_IO_PAD_XREF_CLK0, \ CSL_CONTROL_CORE_PAD_IO_PAD_XREF_CLK0_XREF_CLK0_MUXMODE, \ 0x9); //0x9: clkout2 //0x4a00 3694 HW_WR_FIELD32(CSL_DSP_COREAON_CM_CORE_REGS+CSL_COREAON_CM_CORE_CM_COREAON_DUMMY_MODULE2_CLKCTRL_REG, \ CSL_COREAON_CM_CORE_CM_COREAON_DUMMY_MODULE2_CLKCTRL_REG_OPTFCLKEN_CLKOUTMUX2_CLK, \ CSL_COREAON_CM_CORE_CM_COREAON_DUMMY_MODULE2_CLKCTRL_REG_OPTFCLKEN_CLKOUTMUX2_CLK_FCLK_EN);//0x4a00 86b0 } /***************************** End Of File ***********************************/
期待您的回复,感谢!