以下是我调试5502图像板所累积的认识和经验,仅供参考,有错请指正。
前提
1. 请安装CCS和仿真器驱动,并配置CCS为 C5502 XDS510 Emulator
第一个程序------点亮LED
打开工程 LED_TEST和文件 LED_TEST.C ,仔细浏览程序。程序由C语言编写,简单易懂。由于Ti提供了5000和6000系列DSP的CSL库,调用CSL库的函数使得配置芯片更容易,CSL库中的函数请参考TMS320C55x Chip Support Library API Reference Guide,使用CSL库函数前需要一些简单配置,请参考TMS320C55x Chip Support Library API Reference Guide 第二章 How to Use CSL。一般的程序都可以参考LED_TEST的框架结构。
CSL_init(); /*初始化CSL库*/
PLL_setFreq(1, 0xF, 0, 1, 3, 3, 0); /*设置系统的运行速度为300MHz*/
// SYSCLK1(Fast Peripherals)=150MHz ,SYSCLK2(Slow Peripherals) = SYSCLK3(EMIF Internal Clock) = 75MHz
CHIP_RSET(XBSR,0x0001); /* EMIF为全EMIF接口 */
EMIF_config(&MyEmifConfig); /*初始化DSP的EMIF接口*/
IRQ_setVecs((Uint32)(&VECSTART)); /*中断向量表设置为VECSTART ,在vectors.s55 文件中*/
IRQ_globalDisable();/* Temporarily disable all maskable interrupts */
要完全理解程序,您需要参考TMS320VC5502 Data Sheet了解5502的工作原理和寄存器设置以及CSL库函数的详细说明。
#define Led (*(volatile Uint16 *)(0x40000A)) 定义了Led端口,其字地址是0x40000A,
向其低四位写1可以点亮Lec,写0熄灭Led。 Led = 0xf 点亮4个Led。
使用IRQ_plug(EventId0,&Timer0Isr);来设置定时器的中断服务程序,其余的请自行学习。需要说明的另一个问题是地址的分配,5502有CE0—CE3 4块空间,参考DSP手册,其中片内的双口RAM 64K,DARAM0 : origin = 0001000h, length = 000F000h,60k用来存放程序,所以程序一般不可以 >60K,否则请自行调整储存配置文件,CE1空间分配给FLASH ,CE2空间给FPGA和USB,CE3空间给SRAM。初始化时需要设置各空间存储器的访问时序,即 EMIF_config(&MyEmifConfig)。
第二个程序-----烧些FLASH
本程序的目的是将用户程序烧些至FLASH中,然后上电程序即可运行。图像板可以通过跳线选择多种启动方式,用跳线短路J41的56引脚可以选择从FLASH启动。C5502 ROM中的BootLoader可以自动将FLASH中的程序导到DARAM中,然后运行。下面以上一个程序LED_TEST为用户程序,介绍将其烧入FLASH中的过程。关于BootLoader请参考Using the TMS320VC5501/C5502 Bootloader。
首先要生成LED_TEST.out的可执行文件,然后通过LED_TEST/Debug目录下的hex55.exe 程序生成LED_TEST.hex 文件,在命令行输入hex55.exe -boot -v5510:2 -parallel16 -map LED_TEST.map -a -delay 0x100 -o LED_TEST.hex LED_TEST.out ,接着把LED_TEST.hex转化成可导入CCS的LED_TEST.dat,在命令行输入hex2dat.exe LED_TEST.hex LED_TEST.dat,下一步在Load Program FLASHBOOT.out以后,通过 File-->Data-->Load把LED_TEST.dat导到DARAM中,然后运行程序即可把LED_TEST程序正确烧写到FLASH中。需要注意用户程序的起始地址(一般是DARAM0 : origin = 0001000h)和必须与FLASHBOOT程序中的#define BIGSECT_ADDRESS 0x00001000 相同。
第三个程序-----采集原始图像
本程序的目的是通过FPGA实现图像采集的功能。首先需要介绍一下FPGA程序,在FPGA程序中设置了两个全局的寄存器,一个是系统状态寄存器,一个是系统控制寄存器。
/*System Status Register*/
#define SYSSTATA 0x400020 /*系统外设状态寄存器在IO空间的地址。只读*/
/*D07 D06 D05 D04 D03 D02 D01 D00
* res res res USBVBUS USBRDY USBFLAGC USBFLAGB USBFLAGA
*各控制位说明:
* USBFLAGC:USB的FLAGC的状态;
* USBFLAGB:USB的FLAGB的状态;
* USBFLAGA:USB的FLAGA的状态;
* USBRDY : USB的READY的状态;
* USBVBUS :USB连线的的状态;
/*System Control Register */
#define SYSCNTLA 0x400021 /*系统设置寄存器在IO空间的地址。读写*/
/*D07 D06 D05 D04 D03 D02 D01 D00
* res res res res res res COLLECT USBWAKE
*各控制位说明:
* USBWAKE: USB唤醒信号
* 其值为0时:不唤醒USB
* 其值为1时: 唤醒USB(默认值)。
* COLLECT: 写1使7113采集图像,一帧图像采集完后自动清0
*/
这样图像采集程序就非常简单了,只要向SYSCNTL的COLLECT位写1即可启动采集,一帧图像采集完成后FPGA给DSP的INT1发送中断,图像大小为360*288,从SRAM的0地址开始存放。只需在SYSCNTL = 0x03;下方的一条语句加个端点,然后执行程序,执行FileàDataàSave 保存地址为0x600000,长度为0x19500的图像数据为.dat文件,此图像文件存储的是YUV格式的数据,通过VC程序show_yuv_image.exe可以转化成RGB的图像显示,在命令行输入show_yuv_image.exe *.dat即可,请安装OpenCV来支持图像显示。修改了7113的 {MOD}饱和度值使 {MOD}彩更逼真,想要改变7113输出图像的设置,请修改数组init7113[102]中的值,该数组的值通过I2C总线写入到7113的寄存器中,具体的寄存器功能请参考7113的手册。