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(); // 初始化串口终端 使用串口2 UARTStdioInit(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(); // 配置数据总线16bit EMIFAAsyncDevDataBusWidthSelect(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_SETUP W_STROBE/R_STROBE W_HOLD/R_HOLD TA等参数 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 _TMS320C6X IntEventClear(SYS_INT_UPP_INT); #else IntSystemStatusClear(SYS_INT_UPP); #endif if (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); }