ronghua_su
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:935回复:1

set_hpia(addr-1);

楼主#
更多 发布于:2004-12-13 13:17

请问下面函数:set_hpia(addr-1); //设置起始地址
的作用,哪里来的?谢谢!



         ARM CPU S3C44B0X与C54X DSP的接口设计

当主机开始存取DSP的数据时,首先要执行以下两步操作:

?HPIC寄存器的BOB位置1(高字节与低字节必须相同)。BOB位为字节选择位。BOB位置1,表示第一字节为低字节。BOB位影响数据和地址的传送。只有主机可以修改这一位,C54X对它既不能读也不能写。

?将起始地址写入HPIA寄存器。

此后可正常存取DSP内部RAM的数据了。

结合硬件设计和HPI的操作步骤,便可以在S3C44B0X上编写程序实现C5416的数据通信。

程序主要分为两个部分:一部分是地址及数据的定义;一部分是实现代码。具体程序如下:

#define HPI_BASE 0x4000000

/* HPIC reg */

#define HPIC_W_F *(UINT8*)(HPI_BASE+0x0) //000 0 0

#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); //写入第二字节

}

ronghua_su
驱动牛犊
驱动牛犊
  • 注册日期2004-07-13
  • 最后登录2005-05-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-13 13:25
帮帮我
游客

返回顶部