另外,还有二点需要说明: 通过改变宏定义中的DSPNUMBER常量可以控制地址总线A6、A7、A8。通过这3个总线组合并通过简单地址译码电路就可以完成对多块DSP板的读写。在硬件电路中可以定义为0。 A4(HR/W)同时还用做SN74LVTH16245的方向控制。读的时候A4=1,此时SN74LVTH16245的数据从A-->B;反之,则从B-->A。 下面给出程序中的自增读和注释部分: int dev_hpi_auto1(str_HPI *ss) {volatile unsigned long dsp_addr_hign_read_auto;//定义各种中间变量 volatile unsigned long dsp_addr_low_read_auto; volatile unsigned long dsp_data_hign_read_auto; volatile unsigned long dsp_data_low_read_auto; volatile unsigned long dsp_add_temp; int i; volatile unsigned long data_length; //---read hpic----the host polls the HPIC for HRDY=1 volatile unsigned long polltest; polltest=HPIC_R_F((*ss).hpi_mmap_start); while((polltest&0x00000008)!=0x00000008) {polltest=HPIC_R_F((*ss).hpi_mmap_start); } dsp_add_temp=((*ss).hpi_dsp_add);//从应用程序传过来的参数,指明希望从DSP的哪一个地址读起 dsp_addr_low_read_auto=((dsp_add_temp)&0x0000ffff)+((dsp_add_temp)<<16); //完成数据转换 dsp_addr_hign_read_auto=((dsp_add_temp)&0xffff0000)+((dsp_add_temp)>>16); //---write dsp s addr to HPIA HPIA_W_F ((*ss).hpi_mmap_start)=(dsp_addr_hign_read_auto); HPIA_W_S((*ss).hpi_mmap_start)=(dsp_addr_low_read_auto); //--------write hpic----------to FETCH bit HPIC_W_F((*ss).hpi_mmap_start)=0xfff8fff8; HPIC_W_S((*ss).hpi_mmap_start)=0xfff8fff8; //---read dsp s data from HPID,autoincrement mode data_length=(*ss).hpi_dsp_data_length;//从应用程序传过来的参数,指明期望读取多少个字 for(i=0;i<=data_length;i++) {//---read hpic----the host polls the HPIC for HRDY=1 again polltest=HPIC_R_F((*ss).hpi_mmap_start); while((polltest&0x00000008)!=0x00000008) {polltest=HPIC_R_F((*ss).hpi_mmap_start); } dsp_data_hign_read_auto =HPID_R_F_A((*ss).hpi_mmap_start); //读第一个半字。 dsp_data_low_read_auto =HPID_R_S_A((*ss).hpi_mmap_start); //第二个个半字 {(*ss).buffer [(i)]=(dsp_data_hign_read_auto&oxffff0000)+(dsp_data_low_read_auto&0x0000ffff); //数据拼接,放入结构体,回传给调用的用户程序。 } } } //dev_hpi_read_auto(str_HPI *ss) 5 结束语 本文通过一个实例说明了如何实现在Linux操作系统下ARM体系结构的处理器与DSP的数据通信。给出了接口部分的硬件处理和部分驱动程序。 在某款智能仪表的研发过程中,给出一个简单的地址译码电路对二块(或更多)DSP板进行交替读写,并以自增读方式进行操作,当ARM主频为180MHz,DSP主频为125MHz时,对DSP数据的读写速度可以达到每毫秒1k的32位字。
|