嵌入式Linux下ARM处理器与DSP的数据通信


要改变在HPI_BA_BASE基础上增加的数字就可以获取对控制口线的操作。

    在这里HPI_VA_BASE将由映射得到的用户空间虚拟地址代替,所以如果“自增模式读HPID第一半字”那么就可求满足前文提到的HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0,也就是要满足地址位A2=0、A3=1、A4=1、A5=0,所以只要在HPI_VA_BASE的基础上加0x0000_0006就可以了。要注意的是ARM处理器的地址是32位。所以是加上0x0000_0006而不是0x0000_0018。

另外,还有二点需要说明:

通过改变宏定义中的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位字。


COPYRIGHT(C) 2011 厦门永宏亚得机电科技有限公司版权所有(闽ICP备05025945号) ALL RIGHTS RESERVED?

电话: 0592-5190891 传真: 0592-5190720 E-Mail: E-mail:yade8895@163.com
地址: 厦门市海沧区兴港六里17号2607室 邮编:361009 联系人:翟先生