嵌入式Linux下ARM處理器與DSP的數(shù)據(jù)通信
要改變在HPI_BA_BASE基礎(chǔ)上增加的數(shù)字就可以獲取對控制口線的操作。![]() 在這里HPI_VA_BASE將由映射得到的用戶空間虛擬地址代替,所以如果“自增模式讀HPID第一半字”那么就可求滿足前文提到的HCNTL0=0、HCNTL1=1、HR/W=1、HHWRL=0,也就是要滿足地址位A2=0、A3=1、A4=1、A5=0,所以只要在HPI_VA_BASE的基礎(chǔ)上加0x0000_0006就可以了。要注意的是ARM處理器的地址是32位。所以是加上0x0000_0006而不是0x0000_0018。 另外,還有二點需要說明: 通過改變宏定義中的DSPNUMBER常量可以控制地址總線A6、A7、A8。通過這3個總線組合并通過簡單地址譯碼電路就可以完成對多塊DSP板的讀寫。在硬件電路中可以定義為0。 A4(HR/W)同時還用做SN74LVTH16245的方向控制。讀的時候A4=1,此時SN74LVTH16245的數(shù)據(jù)從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);//從應(yīng)用程序傳過來的參數(shù),指明希望從DSP的哪一個地址讀起 dsp_addr_low_read_auto=((dsp_add_temp)&0x0000ffff)+((dsp_add_temp)<<16); //完成數(shù)據(jù)轉(zhuǎn)換 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;//從應(yīng)用程序傳過來的參數(shù),指明期望讀取多少個字 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); //數(shù)據(jù)拼接,放入結(jié)構(gòu)體,回傳給調(diào)用的用戶程序。 } } } //dev_hpi_read_auto(str_HPI *ss) 5 結(jié)束語 本文通過一個實例說明了如何實現(xiàn)在Linux操作系統(tǒng)下ARM體系結(jié)構(gòu)的處理器與DSP的數(shù)據(jù)通信。給出了接口部分的硬件處理和部分驅(qū)動程序。 在某款智能儀表的研發(fā)過程中,給出一個簡單的地址譯碼電路對二塊(或更多)DSP板進行交替讀寫,并以自增讀方式進行操作,當(dāng)ARM主頻為180MHz,DSP主頻為125MHz時,對DSP數(shù)據(jù)的讀寫速度可以達到每毫秒1k的32位字。 |