背景介绍:DSP新手一枚,在用c6701做EMIF到HPI接口的信息传输,看了TI的关于两个接口的文档和一些DSP开发的书籍,emif和dsp的基本的原理已经清楚。硬件结构如图所示,反相器什么的是用一个fpga直接assign过去的,我的目标是主dsp能够成功的写从dsp。 我的问题如下: 1. 我始终不明白的是要在DSP里面写一些什么样的语句,才能够从fpga观察到信号的变换。我学过c++,但是ccs里面的c和visual studio里面的c有什么区别呢?硬件和软件是怎么建立的联系呢? 2. 我要使用emif接口的话要初始化主dsp的吧。但是我在一本书上找到了如下的代码。 #include <stdio.h> #include <stdlib.h> #include "code.h" #include "initia.h" #define C6701_HPI1 0x03000000 #define C6701_HPI2 0x03000008 #define C6701_HPI3 0x03000010 #define DEGUG 0 int *ptr_hpi1=(int*) C6701_HPI1; int *ptr_hpi2=(int*) C6701_HPI2; int *ptr_hpi3=(int*) C6701_HPI3; void C6x_write_word(int *ptr_hpi,int *source_word,intdest_address); {ptr_hpi[0]=0x0001; ptr_hpi[1]=0x0001; ptr_hpi[2]=(int)(dest_address& 0x0ffff); ptr_hpi[3]=(int)((dest_address>>16)& 0x0ffff); ptr_hpi[6]=(int)(source_word& 0x0ffff); ptr_hpi[7]=(int)((source_word>>16) &0x0ffff); } void C6x_write_section(int *ptr_hpi,int *source,int dest_add,intlength); {int i; ptr_hpi[0]=0x0001; ptr_hpi[1]=0x0001; ptr_hpi[2]=(int)(dest_add& 0x0ffff); ptr_hpi[3]=(int)((dest_add>>16) &0x0ffff); for(i=0;i<=length;i++) {ptr_hpi[4]=(int)*source++; ptr_hpi[5]=(int)*source++; } } #define Emif_globa_control 0x01800000; #define Emif_CE1_control 0x01800004; #define Emif_CE0_control 0x01800008; #define Emif_CE2_control 0x01800010; #define Emif_CE3_control 0x01800014; #define SDRAM_control 0x01800018; #define SDRAM_refresh 0x0180001C; void main(void) { int *ptr_hpi; inti,number_code,number_init; ptr_hpi=(int*)C6416_HPI; init_host(); C6x_write_word(ptr_hpi,0x0000377d,Emif_globa_control); C6x_write_word(ptr_hpi,0x00000040,Emif_CE1_control); C6x_write_word(ptr_hpi,0x00000030,Emif_CE0_control); C6x_write_word(ptr_hpi,0x00000030,Emif_CE2_control); C6x_write_word(ptr_hpi,0xffffff23,Emif_CE3_control); C6x_write_word(ptr_hpi,0x03166000,SDRAM_control); C6x_write_word(ptr_hpi,0x00000aaa,SDRAM_refresh); number_code=sizeof(code); C6x_write_section(ptr_hpi,(int *)&code,0x0,number_code); number_init=sizeof(inita)/sizeof(inita[0]); C6x_write_section(ptr_hpi,(int*)&inita,0x80000000,number_init); #if DEGUG printf("C6416 bootcode loaded\n"); #endif ptr_hpi[0]=0x0003; ptr_hpi[1]=0x0003; #if DEBUG printf("C6701 isrunning\n"); #endif } 为什么在初始化EMIF寄存器的时候使用了C6x_write_word这个函数呢?这个函数本身不就是通过hpi接口传输过去的吗?难道这段代码是初始化的从DSP的EMIF寄存器?那么如何初始化主DSP的EMIF寄存器呢? 我个人做的尝试是,首先查找EMIF相关寄存器的地址,比如EMIF接口CE1的寄存器地址是01800004h,那我我应该在.c文件里面直接使用这一句吗? *(int*)0x01800004=0x20d20311; 后面的0x20d20311是我根据寄存器各个位的意义自行进行的配置。 3. Dsp开发就是写一个.c吗?为什么我看还有DSP/BIOS的相关内容,使用相关的API函数?我这里要用得到吗?怎么理解DSP/BIOS是一个实时的操作系统呢? 相信这些问题对于有过相关开发经验的人都是非常简单的问题,希望能够点拨点拨我。 |