UPP测试代码

#include "hw_types.h"              // 宏命令
#include "hw_syscfg0_OMAPL138.h"      // 系统配置模块寄存器
#include "soc_OMAPL138.h"             // DSP C6748 外设寄存器
#include "psc.h"                  // 电源与睡眠控制宏及设备抽象层函数声明
#include "interrupt.h"             // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
#include "uartStdio.h"             // 串口标准输入输出终端函数声明// CSLR header files
#include <cslr_soc_OMAPL138.h>
#include <cslr_upp.h>
#include <cslr_syscfg0_OMAPL138.h>/****************************************************************************/
/*                                                                          */
/*              宏定义                                                      */
/*                                                                          */
/****************************************************************************/
// CSL register handles
CSL_UppRegs *upp_reg_hdl       = (CSL_UppRegs *)CSL_UPP_0_REGS;
CSL_SyscfgRegs *syscfg_reg_hdl = (CSL_SyscfgRegs *)CSL_SYSCFG_0_REGS;// local macros
#define upp_isr_bit_eolq    (CSL_UPP_UPISR_EOLQ_MASK)
#define upp_isr_bit_eowq    (CSL_UPP_UPISR_EOWQ_MASK)
#define upp_isr_bit_errq    (CSL_UPP_UPISR_ERRQ_MASK)
#define upp_isr_bit_uorq    (CSL_UPP_UPISR_UORQ_MASK)
#define upp_isr_bit_dpeq    (CSL_UPP_UPISR_DPEQ_MASK)
#define upp_isr_bit_eoli    (CSL_UPP_UPISR_EOLI_MASK)
#define upp_isr_bit_eowi    (CSL_UPP_UPISR_EOWI_MASK)
#define upp_isr_bit_erri    (CSL_UPP_UPISR_ERRI_MASK)
#define upp_isr_bit_uori    (CSL_UPP_UPISR_UORI_MASK)
#define upp_isr_bit_dpei    (CSL_UPP_UPISR_DPEI_MASK)
#define upp_isr_bit_all     (upp_isr_bit_eolq | upp_isr_bit_eowq | \upp_isr_bit_errq | upp_isr_bit_uorq | \upp_isr_bit_dpeq | upp_isr_bit_eoli | \upp_isr_bit_eowi | upp_isr_bit_erri | \upp_isr_bit_uori | upp_isr_bit_dpei)// inline functions
#define upp_int_clear(a)    upp_reg_hdl->UPIER = a
#define upp_int_status()    upp_reg_hdl->UPIER
#define upp_int_enable(a)   upp_reg_hdl->UPIES = a
#define upp_int_disable(a)  upp_reg_hdl->UPIEC = a// configuration macros
#define upp_line_size        (1024)
#define upp_line_count       (4)
#define upp_frame_size       (upp_line_size * upp_line_count)
#define upp_line_offset      (upp_line_size)
#define UPP_CLOCK_DIV        (1)               //分频/****************************************************************************/
/*                                                                          */
/*              全局变量                                                    */
/*                                                                          */
/****************************************************************************/
// global variables
volatile int upp_interrupt_count = 0;
volatile int upp_error_count = 0;#pragma DATA_ALIGN(upp_buffer_a, 8)
#pragma DATA_ALIGN(upp_buffer_b, 8)
Uint16 upp_buffer_a[upp_frame_size];
Uint16 upp_buffer_b[upp_frame_size];/****************************************************************************/
/*                                                                          */
/*              函数声明                                                    */
/*                                                                          */
/****************************************************************************/
void UPPReset(void);
void UPPInit(void);
void PSCInit(void);
void UPPInterruptInit(void);
void InterruptInit(void);
void uPPIsr(void);
void PSCInit(void);
void UPPEnable(void);
void UPPPinMuxSetup(void);
void Delay(volatile unsigned int count);/****************************************************************************/
/*                                                                          */
/*              主函数                                                      */
/*                                                                          */
/****************************************************************************/
int main(void)
{int i,j,target_int_count=2;char ch[2];/* 初始化串口终端 使用串口2*/UARTStdioInit();/* 打印串口终端信息*/UARTPuts("UPP Test Application.\r\n", -2);PSCInit();UPPPinMuxSetup();UPPInit();/* ARM 中断初始化*/InterruptInit();UPPInterruptInit();UPPEnable();upp_interrupt_count  = 0;upp_error_count = 0;UARTPuts("\tResetting uPP buffers...\r\n",-2);// Initialize data buffersfor (i = 0; i < upp_frame_size; i++){upp_buffer_b[i] =i;upp_buffer_a[i] = 0xDEAD;}/*启动UPP DMA传输*/UARTPuts("upp_prog_dma_i\n",-2);upp_reg_hdl->UPID0 = (Uint32)upp_buffer_a;upp_reg_hdl->UPID1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);upp_reg_hdl->UPID2 = (Uint32)upp_line_offset*sizeof(Int16);UARTPuts("upp_prog_dma_i\n",-2);upp_reg_hdl->UPQD0 = (Uint32)upp_buffer_b;upp_reg_hdl->UPQD1 = ((Uint32)upp_line_count << 16) | (Uint32)upp_line_size*sizeof(Int16);upp_reg_hdl->UPQD2 = (Uint32)upp_line_offset*sizeof(Int16);/*等待UPP传输完毕*/while (upp_interrupt_count < target_int_count && upp_error_count == 0){asm(" nop");UARTprintf( "upp_interrupt_count=%d\n",upp_interrupt_count);}/*检查UPP传输的数据是否正确 (loopback modes only)*/UARTPuts("Data mismatch in buffers.\n",-2);if (upp_interrupt_count == 2 && upp_error_count == 0){for (i = 0; i<upp_frame_size; i++){if (upp_buffer_a[i] != upp_buffer_b[i]){upp_error_count++;}}}/* 报告通信结果*/if(upp_error_count != 0)UARTprintf( "upp_error_count=%d\n",upp_error_count);elseUARTPuts("uPP transfers complete!\n",-2);UARTPuts("Do you want to print all the data?(y/n)   ",-2);UARTGets(ch,2);UARTPuts("\n", -2);if(ch[0] == 'y'){/*打印全部读到的数据*/for(i=0; i<upp_frame_size; ){for(j=0; j<5; j++){UARTprintf("upp_buffer_a[%d]=%d   ",i,upp_buffer_a[i]);i++;if(i >= 4096)break;}UARTPuts("\n",-2);}}/* 主循环*/for(;;){}
}/****************************************************************************/
/*                                                                          */
/*              UPP复位                                              */
/*                                                                          */
/****************************************************************************/
void UPPReset(void)
{// toggle reset with short delayCSL_FINST(upp_reg_hdl->UPPCR, UPP_UPPCR_SWRST, RESET);Delay(0xfff);CSL_FINST(upp_reg_hdl->UPPCR, UPP_UPPCR_SWRST, RUNNING);
}/****************************************************************************/
/*                                                                          */
/*              UPP初始化                                              */
/*                                                                          */
/****************************************************************************/
void UPPInit(void)
{unsigned int temp_reg = 0;// configure registers: CTL, ICR, IVR/***************************** 1. CTL************************/// Channel B paramsCSL_FINST(temp_reg, UPP_UPCTL_DPFB, LJZF);     //Left-justified, zero filledCSL_FINST(temp_reg, UPP_UPCTL_IWB, 8BIT);      //8-bit interfaceCSL_FINST(temp_reg, UPP_UPCTL_DPWB, FULL);     //Channel B bit width = 8CSL_FINST(temp_reg, UPP_UPCTL_DRB, SINGLE);    //Single data rate// Channel B paramsCSL_FINST(temp_reg, UPP_UPCTL_DPFA, LJZF);     //Left-justified, zero filledCSL_FINST(temp_reg, UPP_UPCTL_IWA, 8BIT);      //8-bit interfaceCSL_FINST(temp_reg, UPP_UPCTL_DPWA, FULL);     //Channel B bit width = 8CSL_FINST(temp_reg, UPP_UPCTL_DRA, SINGLE);    //Single data rateCSL_FINST(temp_reg, UPP_UPCTL_CHN, TWO);       //Channel A and Channel B are both active.CSL_FINST(temp_reg, UPP_UPCTL_MODE, DUPLEX0);  //Operating mode  Duplex Mode 0.upp_reg_hdl->UPCTL = temp_reg;temp_reg = 0;/****************** 2. ICR*********************/// Channel A paramsCSL_FINST(temp_reg, UPP_UPICR_TRISA, ENABLE);  //Channel A data pins are in a high-impedance state while idleif (UPP_CLOCK_DIV > 0x0F)UARTPuts("Clock divisor error.\n",-2);elseCSL_FINS(temp_reg, UPP_UPICR_CLKDIVA, UPP_CLOCK_DIV); //Clock divisorCSL_FINST(temp_reg, UPP_UPICR_STARTA, ENABLE); //Channel A START Signal Enable.CSL_FINST(temp_reg, UPP_UPICR_ENAA, ENABLE);   //Channel A ENABLE Signal Enable// Channel B paramsif (UPP_CLOCK_DIV > 0x0F)UARTPuts("Clock divisor error.\n",-2);elseCSL_FINS(temp_reg, UPP_UPICR_CLKDIVB, UPP_CLOCK_DIV);CSL_FINST(temp_reg, UPP_UPICR_STARTB, ENABLE); //Channel B START Signal Enable.CSL_FINST(temp_reg, UPP_UPICR_ENAB, ENABLE);  //Channel B ENABLE Signal Enable// apply all fields in one shotupp_reg_hdl->UPICR = temp_reg;temp_reg = 0;/******************************** 3. IVR******************************/CSL_FINS(temp_reg, UPP_UPIVR_VALB, 0x7b7b);   //Channel B idle valueCSL_FINS(temp_reg, UPP_UPIVR_VALA, 0x7f7f);   //Channel A idle value// apply all fields in one shotupp_reg_hdl->UPIVR = temp_reg;
}/****************************************************************************/
/*                                                                          */
/*              UPP中断初始化                                          */
/*                                                                          */
/****************************************************************************/
void UPPInterruptInit(void)
{// Initialize interruptupp_int_enable(upp_isr_bit_eolq);upp_int_enable(upp_isr_bit_eowq);upp_int_enable(upp_isr_bit_eoli);upp_int_enable(upp_isr_bit_eowi);// 注册中断服务函数IntRegister(SYS_INT_UPP, uPPIsr);// 映射中断IntChannelSet(SYS_INT_UPP, 2);// 使能中断IntSystemEnable(SYS_INT_UPP);
}/****************************************************************************/
/*                                                                          */
/*              ARM 中断初始化                                              */
/*                                                                          */
/****************************************************************************/
void InterruptInit(void)
{// 初始化 ARM 中断控制器IntAINTCInit();// 使能 IRQ(CPSR)IntMasterIRQEnable();// 使能中断(AINTC GER)IntGlobalEnable();// 使能中断(AINTC HIER)IntIRQEnable();
}/****************************************************************************/
/*                                                                          */
/*              中断服务函数                                                */
/*                                                                          */
/****************************************************************************/
void uPPIsr(void)
{Uint32 intr_status = upp_int_status();// 清除 UART2 系统中断IntSystemStatusClear(SYS_INT_UPP);// inline functionsUARTPuts("uPPIsr.\n",-2);while (intr_status != 0){if (intr_status & upp_isr_bit_eoli){UARTPuts("eoli.\n",-2);upp_int_clear(upp_isr_bit_eoli);}if (intr_status & upp_isr_bit_eowi){UARTPuts("eowi.\n",-2);upp_int_clear(upp_isr_bit_eowi);upp_interrupt_count++;}if (intr_status & upp_isr_bit_erri){UARTPuts("erri.\n",-2);upp_int_clear(upp_isr_bit_erri);upp_error_count++;}if (intr_status & upp_isr_bit_uori){UARTPuts("uori.\n",-2);upp_int_clear(upp_isr_bit_uori);upp_error_count++;}if (intr_status & upp_isr_bit_dpei){UARTPuts("dpei.\n",-2);upp_int_clear(upp_isr_bit_dpei);upp_error_count++;}if (intr_status & upp_isr_bit_eolq){UARTPuts("eolq.\n",-2);upp_int_clear(upp_isr_bit_eolq);}if (intr_status & upp_isr_bit_eowq){UARTPuts("eowq.\n",-2);upp_int_clear(upp_isr_bit_eowq);upp_interrupt_count++;}if (intr_status & upp_isr_bit_errq){UARTPuts("errq.\n",-2);upp_int_clear(upp_isr_bit_errq);upp_error_count++;}if (intr_status & upp_isr_bit_uorq){UARTPuts("uorq.\n",-2);upp_int_clear(upp_isr_bit_uorq);upp_error_count++;}if (intr_status & upp_isr_bit_dpeq){UARTPuts("dpeq.\n",-2);upp_int_clear(upp_isr_bit_dpeq);upp_error_count++;}// make sure all interrupts are handledintr_status = upp_int_status();}// finally: write 0 to EOI registerupp_reg_hdl->UPEOI = 0;
}/****************************************************************************/
/*                                                                          */
/*              PSC初始化                                            */
/*                                                                          */
/****************************************************************************/
void PSCInit(void)
{PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UPP, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
}/****************************************************************************/
/*                                                                          */
/*              UPP使能                                             */
/*                                                                          */
/****************************************************************************/
void UPPEnable(void)
{// turn on peripheralCSL_FINST(upp_reg_hdl->UPPCR, UPP_UPPCR_EN, ENABLE);
}/****************************************************************************/
/*                                                                          */
/*              UPP 复用管脚初始化                                          */
/*                                                                          */
/****************************************************************************/
void UPPPinMuxSetup(void)
{unsigned int savePinmux13 = 0;unsigned int savePinmux14 = 0;unsigned int savePinmux15 = 0;unsigned int savePinmux16 = 0;unsigned int savePinmux17 = 0;unsigned int savePinmux18 = 0;/* all pins (channel A, channel B, DATA, and XDATA)*/savePinmux13 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) & 0x0000FFFF);savePinmux14 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(14)) & 0x000000FF);savePinmux15 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(15)) & 0x00000000);savePinmux16 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(16)) & 0x00000000);savePinmux17 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(17)) & 0x00000000);savePinmux18 = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(18)) & 0xFF000000);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(13)) = (0x44440000 | savePinmux13);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(14)) = (0x44444400 | savePinmux14);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(15)) = (0x44444444 | savePinmux15);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(16)) = (0x44444444 | savePinmux16);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(17)) = (0x44444444 | savePinmux17);HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(18)) = (0x00444444 | savePinmux18);
}/****************************************************************************/
/*                                                                          */
/*              延时                                                        */
/*                                                                          */
/****************************************************************************/
void Delay(volatile unsigned int count)
{while(count--);
}

串口打印信息

输入字母Y,打印信息如图

修改传输速率的地方:修改UPP_CLOCK_DIV,可以写的范围是0-15,下图写到是1

OMAPL138使用UPP读写测试相关推荐

  1. 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!

    [手机中国新闻]2018年1月31日,固态技术协会(JEDEC)正式发布了UFS 3.0标准.相较于目前旗舰手机中常用的UFS 2.1闪存,UFS 3.0引入了HS-G4规范,每通道传输数据速率高达1 ...

  2. hadoop 基准测试与读写测试

    2019独角兽企业重金招聘Python工程师标准>>> hadoop 基准测试与读写测试 排序100G数据 /opt/cloudera/parcels/CDH/bin/yarn ja ...

  3. matlab画扇区,NFCDemo NFC读写测试 ,自动读取每个扇区 块的值 matlab 238万源代码下载- www.pudn.com...

    文件名称: NFCDemo下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 66 KB 上传时间: 2013-12-13 下载次数: 24 提 供 者: wuze ...

  4. vfifo控制mig_MIG IP控制DDR3读写测试

    本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...

  5. FPGA学习日记(八)SDRAM的读写测试

    目的:对SDRAM进行读写测试,使用FIFO对SDRAM进行封装. SDRAM功能框图: SDRAM原理图: 初始化状态机: 工作状态机: 代码如下: SDRAM顶层模块:连接外部芯片与测试灯,并通过 ...

  6. A40I工控主板(SBC-X40I)USB接口读写测试

    SBC-X40I产品特性 采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ: 支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / Open ...

  7. DDR3基本的读写测试,适用于verilog语言学习

    近期学习使用Verilog编写DDR3接口读写测试,在编写过程中遇到许多问题,最终功夫不负有心人,实现了DDR3数据写入和数据读取功能.同时在问题排查过程中,也学习到了很多新的东西. 现将我实现DDR ...

  8. 全志A40i开发板(4核ARM CortexA7)测评合集——存储介质读写测试

    本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口.双路CAN.双路USB.双路RS485等通信接口,板载Bluetooth.WIFI.4G(选配)模块,同时引 ...

  9. ZYNQ之FPGA 片内RAM读写测试实验

    文章目录 前言 一.添加RAM IP核 二.编写测试程序 三.添加ILA 四.分配管脚 五.Simulator仿真 六.硬件调试 总结 前言 本实验的主要内容是介绍如何使用 FPGA内部的RAM以及程 ...

最新文章

  1. 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?(附代码)
  2. gdb调试问题Missing separate debuginfos, use: debuginfo-install
  3. java乱码怎么解决_如何解决java乱码
  4. docker 和挂载文件一起打包成新镜像_Docker文件系统和数据卷
  5. 身份令牌toKen Vuex + localStorage结合存储
  6. 糖药病数据集分类_使用optuna和mlflow进行心脏病分类器调整
  7. vnc连接服务器怎么修改配置,vnc连接服务器怎么配置
  8. 20155227第十二周课堂实践
  9. 停止MySQL正在执行的SQL语句
  10. 计算机网络发展分几个阶段各有什么特点,计算机网络的发展可以划分为几个阶段?每个阶段都有什么特点?...
  11. Blow Up 3macOS图片放大锐利的详细使用教程与安装方法
  12. 笔记本电脑连不上WIFI
  13. html p首字母缩进,css如何控制首行缩进2个字符?
  14. 【读书笔记 1】《读大江大河 有感》
  15. 什么是论坛域名?论坛域名适用在哪些地方?
  16. 线性离散系统的分析与校正
  17. selenium +eclipse+firefox/chrome 环境全套搭配
  18. 25万的特斯拉会动了谁的奶酪?
  19. 华为云cce 部署nacos集群docker
  20. linux-鸟哥私房菜,基础命令全掌握

热门文章

  1. ros ekf融合odom imu ov信息
  2. photoshop 怎么用参考线将页面平分
  3. Python+Django基于Python的古诗词在线学习网站#毕业设计
  4. 学习总结--ICEPAK 多级网格划分设置和效果对比
  5. android-jain-sip-ri
  6. USB驱动之USB网络共享
  7. PCAN-USB在INCA中使用
  8. van Emde Boas树
  9. 只读TextBox的文字颜色不随ForeColor的改变而改变
  10. chrome翻译无效解决方法