TI中文支持网
TI专业的中文技术问题搜集分享网站

OMAP-L138: 使用UPP与FPGA通信问题

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),将由资深的英文论坛工程师为您提供帮助

赞(0)
未经允许不得转载:TI中文支持网 » OMAP-L138: 使用UPP与FPGA通信问题
分享到: 更多 (0)