Part Number:OMAP-L138
uPP通道a接收,使用ddr,16bit,但是接收到的数据每次都会丢失从第512位开始的512个数据,FPGA生成8192个数据,仿真以后的波形和ILA显示的波形是一样的,数据传的都是一样的,不知道到底是哪的问题了
#include "OMAPL138.h" #include "soc_OMAPL138.h" #include "hw_types.h" #include "psc.h" #include "uart.h" #include "delay.h" #include "emifa.h" #include "upp.h" #include "interrupt.h" #include "uartStdio.h" #include "string.h" #include "stdio.h" /****************************************************************************/ /**/ /*宏定义*/ /**/ /****************************************************************************/ #define upp_line_size(1024) #define upp_line_count(8) #define upp_frame_size(upp_line_size * upp_line_count) #define upp_line_offset(upp_line_size) /****************************************************************************/ /**/ /*全局变量*/ /**/ /****************************************************************************/ volatile int upp_interrupt_count = 0;//中断标记 volatile int upp_error_count = 0; //#pragma DATA_SECTION(upp_buffer, "ipc_shram") #pragma DATA_ALIGN(upp_buffer, 8) unsigned short upp_buffer[upp_frame_size]; uPPDMAConfig DMAConfig; /****************************************************************************/ /**/ /*函数声明*/ /**/ /****************************************************************************/ static void InterruptInit(void); static void EMIFAInit(void); static void uPPInit(void); static void uPPInterruptInit(void); static void uPPIsr(void); static void uPPTransferStart(void); /****************************************************************************/ /**/ /*主函数*/ /**/ /****************************************************************************/ int main(void) {int i, target_int_count = 1;// 中断初始化InterruptInit();// 初始化串口终端 使用串口2UARTStdioInit(1);// 定时器 初始化DelayTimerSetup();/* 打印串口终端信息*/UARTprintf("uPP Test Application.\r\n");// EMIFA 初始化EMIFAInit();*((short *) (SOC_EMIFA_CS5_ADDR + 2 * 1)) = 0;// uPP 初始化uPPInit();UARTprintf("Starting uPP transfers...\r\n");while (1){// 启动uPP DMA传输uPPTransferStart();*((short *) (SOC_EMIFA_CS5_ADDR + 2 * 1)) = 1; // 启动数据生成/*等待UPP传输完毕*/while (upp_interrupt_count < target_int_count && upp_error_count == 0){}*((short *) (SOC_EMIFA_CS5_ADDR + 2 * 1)) = 0;UARTprintf("uPP transfers...OK\r\n"); // ///*检查UPP传输的数据是否正确*/ //for (i = 0; i < upp_frame_size; i = i + 2) //{ //if (upp_buffer[i] != ((i / 2) + 1)) //{ //UARTprintf("Data mismatch in %d\n", i); //break; //} //}} } /****************************************************************************/ /**/ /*中断初始化*/ /**/ /****************************************************************************/ static void InterruptInit(void) {IntAINTCInit();// 初始化 ARM 中断控制器IntMasterIRQEnable();// 使能 IRQ(CPSR)IntGlobalEnable();// 使能中断(AINTC GER)IntIRQEnable();// 使能中断(AINTC HIER) } /****************************************************************************/ /**/ /*初始化 EMIFA*/ /**/ /****************************************************************************/ static void EMIFAInit(void) {// 使能 EMIFA 模块PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_EMIFA, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);// 配置EMIFA相关复用引脚EMIFAPinMuxSetup();// 配置数据总线16bitEMIFAAsyncDevDataBusWidthSelect(SOC_EMIFA_0_REGS, EMIFA_CHIP_SELECT_5,EMIFA_DATA_BUSWITTH_16BIT);// 选着Normal模式EMIFAAsyncDevOpModeSelect(SOC_EMIFA_0_REGS, EMIFA_CHIP_SELECT_5,EMIFA_ASYNC_INTERFACE_NORMAL_MODE);// 禁止WAIT引脚EMIFAExtendedWaitConfig(SOC_EMIFA_0_REGS, EMIFA_CHIP_SELECT_5,EMIFA_EXTENDED_WAIT_DISABLE);// 配置W_SETUP/R_SETUPW_STROBE/R_STROBEW_HOLD/R_HOLDTA等参数EMIFAWaitTimingConfig(SOC_EMIFA_0_REGS, EMIFA_CHIP_SELECT_5, EMIFA_ASYNC_WAITTIME_CONFIG(2, 3, 2, 2, 3, 2, 0)); } /****************************************************************************/ /**/ /*初始化 uPP*/ /**/ /****************************************************************************/ static void uPPInit(void) {// 使能 uPP 模块PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UPP, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);// 配置uPP相关复用引脚uPPPinMuxSetup(uPP_CHA_16BIT);// uPP复位 软件复位uPPReset(SOC_UPP_0_REGS);// 数据格式配置UPCTL,通道,16位,单边沿uPPDataFmtConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_DataPackingFmt_LJZE | uPP_DataPacking_FULL |uPP_InterfaceWidth_16BIT | uPP_DataRate_DOUBLE);// 通道配置 双边沿失能 单倍数据率交错模式失能 A接收uPPChannelConfig(SOC_UPP_0_REGS, uPP_DDRDEMUX_DISABLE | uPP_SDRTXIL_DISABLE |uPP_CHN_ONE | uPP_ALL_RECEIVE);// 引脚配置 控制引脚都开启uPPPinConfig(SOC_UPP_0_REGS, uPP_CHA, uPP_PIN_ENABLE | uPP_PIN_WAIT | uPP_PIN_START);// DMA读脉冲串大小uPPThresholdConfig(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_Threshold_256Bytes);// 中断使能uPPIntEnable(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL | uPP_INT_EOW);// 中断映射uPPInterruptInit();// uPP使能uPPEnable(SOC_UPP_0_REGS);// DMA通道参数DMAConfig.WindowAddress = (unsigned int *) ((int) upp_buffer);DMAConfig.LineCount = upp_line_count;DMAConfig.ByteCount = (upp_line_size * sizeof(unsigned short));DMAConfig.LineOffsetAddress = (upp_line_offset * sizeof(unsigned short));// 初始化接收区域memset(upp_buffer, 0x3F, upp_frame_size * sizeof(unsigned short)); } /****************************************************************************/ /**/ /*uPP 中断初始化*/ /**/ /****************************************************************************/ static void uPPInterruptInit(void) {IntRegister(SYS_INT_UPP, uPPIsr);// 注册中断服务函数IntChannelSet(SYS_INT_UPP, 8);// 映射中断IntSystemEnable(SYS_INT_UPP);// 使能中断 } /****************************************************************************/ /**/ /*uPP 中断服务函数*/ /**/ /****************************************************************************/ static void uPPIsr(void) {unsigned int intr_dmai_status = 0;// 取得 DMA 中断状态intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);while(intr_dmai_status != 0){// 清除 uPP 系统中断 #ifdef _TMS320C6XIntEventClear(SYS_INT_UPP_INT); #elseIntSystemStatusClear(SYS_INT_UPP); #endifif (intr_dmai_status & uPP_INT_EOL){uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOL);}if (intr_dmai_status & uPP_INT_EOW){uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_EOW);upp_interrupt_count++;}if (intr_dmai_status & uPP_INT_ERR){uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_ERR);upp_error_count++;}if (intr_dmai_status & uPP_INT_UOR){uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_UOR);upp_error_count++;}if (intr_dmai_status & uPP_INT_DPE){uPPIntClear(SOC_UPP_0_REGS, uPP_DMA_CHI, uPP_INT_DPE);upp_error_count++;}// uPP 中断将多个事件组合为同一中断源// 判断是否全部事情被处理完毕intr_dmai_status = uPPIntStatus(SOC_UPP_0_REGS, uPP_DMA_CHI);}// 通知 CPU uPP 中断处理完毕以便后续事件可以产生uPPEndOfInt(SOC_UPP_0_REGS); } /****************************************************************************/ /**/ /*uPP DMA参数*/ /**/ /****************************************************************************/ static void uPPTransferStart(void) {// uPP中断标志位清零upp_interrupt_count = 0;upp_error_count = 0;// uPP 通道启动接收uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &DMAConfig); }
Vivian Gao:
您好
感谢您对TI产品的关注!为更加有效地解决您的问题,我们建议您将问题发布在E2E英文技术论坛上(TI E2E support forums),将由资深的英文论坛工程师为您提供帮助