#define HPIC_W_S *(UINR8 *)(HPI_BASE +0x2) //000 1 0
#define HPIC_R_F *(UINT8 *) (HPI_BASE + 0x10) //110 0 0
#define HPIC_R_S *(UNIT8 *)(HPI_BASE+0x12) //110 1 0
/*define HPID_W_A_F *(UINT8 *)(HPI_BASE +0x4) //001 0 0
#define HPID_W_A_S *(UINT8 *)(HPI_BASE + 0x6) //001 1 0
#define HPID_R_A_F *(UINT8 *) (HPI_BASE+0x14) //101 0 0
#define HPID_R_A_S *(UINT8 *)(HPI_BASE + 0x16) //101 1 0
/* HPIA reg */
#define HPIA_W_F *(UINT8 *)(HPI_BASE + 0x8) //010 0 0
#define HPIA_W_S *(UINT8 *)(HPI_BASE +0xA) //010 1 0
#define HPIA_R_F *(UINT8 *)(HPI_BASE +0x18) //110 0 0
#define HPIA_R_S *(UINT8 *)(HPI_BASE + 0x1A) //110 1 0
上述这些宏定义了HPI8接口寄存器的地址。对S3C44B0X来说,HPI8占用其内存的BANK2,即起始地址为0X04000000。又由于HPI8的HR/W和HBIL信号用S3C44B0X的地址线实现,因此对同一个寄存器而言,其读写地址不同。
以下代码从DSP 读出数据:
UINT16 read_dsp( UINT16 addr){
INT16 i;
INT8 j;
set_HPIa(addr); //设置起始地址
i=HPID_R_A_F; //读出第一字节
j=HPID_R_A_S; //读出第二字节
return (i<<8)|(j&0xff);
}
以下代码向DSP 写入数据:
void write_dsp(UINT16 addr,UINT16 dat)
{ set_HPIa(addr-1); //设置起始地址
HPID_W_A_F=(UINT8)((dat>>8)& 0xff); //写入第一字节
HPID_W_A_S=(UINT8)(dat & 0xff); //写入第二字节
}
在嵌入式系统设计中,用S3C44B0X作为主控制器,用TMS320C5416 进行运算,然后通过HPI接口进行通信和交换数据。事实证明,用HPI接口在ARM和DSP间通信满足嵌入式系统的实时性要求。