OMAPL138使用UPP读写测试
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读写测试相关推荐
- 读写测试_UFS3.0手机闪存测试曝光 读写速度足以秒杀超极本!
[手机中国新闻]2018年1月31日,固态技术协会(JEDEC)正式发布了UFS 3.0标准.相较于目前旗舰手机中常用的UFS 2.1闪存,UFS 3.0引入了HS-G4规范,每通道传输数据速率高达1 ...
- hadoop 基准测试与读写测试
2019独角兽企业重金招聘Python工程师标准>>> hadoop 基准测试与读写测试 排序100G数据 /opt/cloudera/parcels/CDH/bin/yarn ja ...
- matlab画扇区,NFCDemo NFC读写测试 ,自动读取每个扇区 块的值 matlab 238万源代码下载- www.pudn.com...
文件名称: NFCDemo下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 66 KB 上传时间: 2013-12-13 下载次数: 24 提 供 者: wuze ...
- vfifo控制mig_MIG IP控制DDR3读写测试
本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...
- FPGA学习日记(八)SDRAM的读写测试
目的:对SDRAM进行读写测试,使用FIFO对SDRAM进行封装. SDRAM功能框图: SDRAM原理图: 初始化状态机: 工作状态机: 代码如下: SDRAM顶层模块:连接外部芯片与测试灯,并通过 ...
- A40I工控主板(SBC-X40I)USB接口读写测试
SBC-X40I产品特性 采用Allwinner公司Cortex-A7四核A40i处理器,运行最高速度为1.2GHZ: 支持Mali-400MP2 GPU,支持OpenGL ES 2.0 / Open ...
- DDR3基本的读写测试,适用于verilog语言学习
近期学习使用Verilog编写DDR3接口读写测试,在编写过程中遇到许多问题,最终功夫不负有心人,实现了DDR3数据写入和数据读取功能.同时在问题排查过程中,也学习到了很多新的东西. 现将我实现DDR ...
- 全志A40i开发板(4核ARM CortexA7)测评合集——存储介质读写测试
本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口.双路CAN.双路USB.双路RS485等通信接口,板载Bluetooth.WIFI.4G(选配)模块,同时引 ...
- ZYNQ之FPGA 片内RAM读写测试实验
文章目录 前言 一.添加RAM IP核 二.编写测试程序 三.添加ILA 四.分配管脚 五.Simulator仿真 六.硬件调试 总结 前言 本实验的主要内容是介绍如何使用 FPGA内部的RAM以及程 ...
最新文章
- 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?(附代码)
- gdb调试问题Missing separate debuginfos, use: debuginfo-install
- java乱码怎么解决_如何解决java乱码
- docker 和挂载文件一起打包成新镜像_Docker文件系统和数据卷
- 身份令牌toKen Vuex + localStorage结合存储
- 糖药病数据集分类_使用optuna和mlflow进行心脏病分类器调整
- vnc连接服务器怎么修改配置,vnc连接服务器怎么配置
- 20155227第十二周课堂实践
- 停止MySQL正在执行的SQL语句
- 计算机网络发展分几个阶段各有什么特点,计算机网络的发展可以划分为几个阶段?每个阶段都有什么特点?...
- Blow Up 3macOS图片放大锐利的详细使用教程与安装方法
- 笔记本电脑连不上WIFI
- html p首字母缩进,css如何控制首行缩进2个字符?
- 【读书笔记 1】《读大江大河 有感》
- 什么是论坛域名?论坛域名适用在哪些地方?
- 线性离散系统的分析与校正
- selenium +eclipse+firefox/chrome 环境全套搭配
- 25万的特斯拉会动了谁的奶酪?
- 华为云cce 部署nacos集群docker
- linux-鸟哥私房菜,基础命令全掌握