|
代码如下
#define DM_ADD (*((volatile unsigned short *) 0x20000300))
#define DM_CMD (*((volatile unsigned short *) 0x20000304))
//延时
void udelay(uint32 t)
{
U32 i;
for(;t>0;t--)
{
for(i=0;i<100;i++){}
}
}
//dm9000初始化
void DM9000_init(void)
{
uint32 i;
IOSetInit();
dm9000_reg_write(DM9000_GPCR, 0x01); //设置 GPCR(1EH) bit[0]=1,使DM9000的GPIO3为输出。
dm9000_reg_write(DM9000_GPR, 0x00); //GPR bit[0]=0 使DM9000的GPIO3输出为低以激活内部PHY。
Printf("\nGPR=%x\n",dm9000_reg_read(DM9000_GPR));/////
udelay(1000000); //延时2ms以上等待PHY上电。
Printf("\nGPR=%x\n",dm9000_reg_read(DM9000_GPR));/////
//初始化设置步骤: 2
dm9000_reg_write(DM9000_NCR, 0x03); //软件复位
Printf("\nNCR=%x\n",dm9000_reg_read(DM9000_NCR));/////
udelay(30000); //延时20us以上等待软件复位完成
dm9000_reg_write(DM9000_NCR, 0x00); //复位完成,设置正常工作模式。
dm9000_reg_write(DM9000_NCR, 0x03); //第二次软件复位,为了确保软件复位完全成功。此步骤是必要的。
udelay(30000);
Printf("\nNCR=%x\n",dm9000_reg_read(DM9000_NCR));///////
dm9000_reg_write(DM9000_NCR, 0x00);
dm9000_reg_write(DM9000_NSR, 0x2c); //清除各种状态标志位
dm9000_reg_write(DM9000_ISR, 0xbf); //清除所有中断标志位
dm9000_reg_write(DM9000_RCR, 0x39); //接收控制
dm9000_reg_write(DM9000_TCR, 0x00); //发送控制
dm9000_reg_write(DM9000_BPTR, 0x3f);
dm9000_reg_write(DM9000_FCTR, 0x38); //接收FIFO门限3k 8k
dm9000_reg_write(DM9000_FCR, 0xff);
dm9000_reg_write(DM9000_SMCR, 0x00);
//初始化设置步骤: 5
for(i=0; i<6; i++)
dm9000_reg_write(DM9000_PAR + i, hwaddr[i]);//
dm9000_reg_write(DM9000_NSR, 0x2c); //清除各种状态标志位
dm9000_reg_write(DM9000_ISR, 0x3f); //清除所有中断标志位
Printf("\nNSR=%x\n",dm9000_reg_read(DM9000_NSR));///////
dm9000_reg_write(DM9000_IMR, 0x81); //中断使能
Printf("初始化成功!\r\n");
}
|
|