我目前在调试DM9000A,但是初始化过程老是失败,参见厂家资料,也没有发现啥问题。谁能帮我看看代码,谢谢了。 /**************************************************************************** * 函数名称 void EEPROM_Initial(void) * 函数功能 用于初始化eeprom,配置相关参数。 * 入口参数 无 * * 出口参数 无 * 说 明 ****************************************************************************/ void EEPROM_Initial( void ) { uint8 i; uint16 *u16pTemp; /* write mac_address */ u16pTemp = (uint16 *)MAC_Address; for(i=0; i < 3; i++) { EEPROM_Write(i, *(u16pTemp++)); } /* write auto load control*/ EEPROM_Write(0x03, 0x5455); /* write Vendor ID */ EEPROM_Write(0x04, 0x0a46); /* write Product ID */ EEPROM_Write(0x05, 0x9000); /* write Pin Control */ EEPROM_Write(0x06, 0x01e7); /* write wake_up mode control */ EEPROM_Write(0x07, 0x0180); } /**************************************************************************** * 函数名称 uint32 Ethernet_Controller__Initial(void) * 函数功能 用于初始化enthernet_controller,配置相关参数。 * 入口参数 无 * * 出口参数 uint32 返回初始化结果,如果返回的数据非0,则初始化失败,返回值为出错信息 * 说 明 ****************************************************************************/ uint32 Ethernet_Controller__Initial() { uint16 i; uint8 u8Offset; uint16 *u16pMAC_Address; /* power on reset */ LINK_RST_SET0(); delayNus (50000); /* 等待50ms,PHY 上电完成 */ LINK_RST_SET1(); // /*step 2:*/ /*access EEPROM*/ u16pMAC_Address = (uint16*)&MAC_Address; for(i = 0; i < 3; i++) { if(*(u16pMAC_Address++) != EEPROM_Read(i)) /*eeprom loaded data?*/ { EEPROM_Initial(); break; } } /* reload EEPROM*/ iow(DM9KS_EPCR, 0x40); /* wait for reload EEPROM complete */ while ( i < 200 ) { if(ior ( DM9KS_EPCR ) & 1) break; delayNus ( 10 ); i++; } /*step 3:  rogram the NCR register to choose normal mode by setting NCR (REG. 00) LBK Bit [2:1] = "00"b. */ iow ( 0x00 , 0x00 );//0, 0; /*step 4:*/ /* disable interrupts and enable the Pointer Auto Return function*/ iow ( 0xFF, 0x80 ); //0x00, 0x80
/*设置PHY 寄存器内容*/ /*step 1:GPR REG. 1FH PHYPD Bit[0] = 0 to 激活内部phy*/ iow ( 0x1F, 0x00 ); /* 0x58, 0x58*/ delayNus (5000); /* 等待2ms,PHY 上电完成 */ /* PHY 软件方式复位: PHY寄存器取缺省值, 0x3100*/  HY_Write ( 0, 0x8000 ); /* 0x000d, 0x3100*/ delayNus (3000); /*设置流控参数, 10(FCS=1)支持流控; 08(TX-FDX=1)支持100base-tx 全双工; 07(TX-HDX=1)支持半双工; 06(10-FDX=1)支持10base-t 全双工; 05(10-HDX=1)支持10base-t 半双工; 04~01(selector=00001)支持IEE802.3 CSMA/CD 0x0000 0101 1110 0001*/  HY_Write ( 4, 0x01E1 | 0x0400 ); /*0x0d, 0x05e1*/ /*12(auto-negotiation enable=1)自适应机制使能;09(Restart Auto-negotiation=1)重新初始化自动开始, 当自适应 被禁止后(bit12=0),这位将没有用处,应该被清零,在自动初始化没有完成前这位保持1, 完成后自动清零;自适应 操作过程中,将该位清零,对该过程没有影响。0001 0010 0000 0000*/ /* PHY Auto-negotiation: Auto sense and recovery registers */  HY_Write ( 0, 0x1200 ); /*0x000d, 0x1000*/ delayNus (2000); /* wait >2 ms for PHY Auto-sense linking to partner */ /*only read status*/  HY_Read(0x01); /*get PHY 01H register status = 0x7849*/  HY_Read(0x05); /*get DA9000A 05H register status = 0x0000*/ ior(0x01); ///* 配置多波通信的hash表 */ dm9000_hash_table (); /* enable chip functions and disable loopback back to normal*/ iow ( 0x00, 0x00 ); /*0, 0*/ /* Bit[0]=1 enable RX; BIT4=1 discard crc error packet; bit5=1 discard long(1522byte) packet */ iow ( 0x05, 0x30 | 1); /*0, 0x31*/ /*clear stutus tag*/ /*clear NSR status tag*/ watch_value = ior(0x01); /*clear stutus tag*/ watch_value = ior(0x07); /*clear ROCR status*/ /*set RX and TX flow control function */ /* BPTR REG.08 7~4(BPHW=3) 接受数据的空余空间下限值为 3KB, 3~1(JPT =f)处于拥挤模式600us */ iow ( 0x08, 0x3F );/*37, 3f*/ /* FCTR REG.09 7~4(HWOT = 5) 接受数据的空余空间下限值为5KB; 3~1(LWOT = 10) 接受数据的空余空间上限值为10KB;*/ iow ( 0x09, 0x5A ); /*38,5a*/ /* FCR REG.0AH 5(TXPEN = 1) 强制 TX 暂停包使能; 3(BKPM = 1) 回压模式 0(FLCE = 1) 流控使能;*/ iow ( 0x0A, 0x29 ); /*00, 29*/ /*TCR2(2DH), LED(7)=1 the led pins act as led mode 1; RLCP(6)=1 retry tanssmit the packet with late-collision; *//********I ADD********/ iow (0x2d, 0x40 );/*00, 0x40*/ delayNus(2000); ior(0x01); /* clear any pending interrupt */ /* clear NSR 3bits status: TX1END, TX2END, WAKEST by RW/C1 */ // iow ( 0x01, 0x2c ); /*80, 80, c0, c0*/ /* clear ISR status: PR,PT, ROS,ROO, UDRUN, LNKCHG by RW/C1 */ iow ( 0xFE, 0x3f ); /*20, 00*/ /* enable interrupts and enable the Pointer Auto Return function*/ /* IMR REG. FFH enable PAR+ PTI+PRI+ROI+ROOI+UDRUNI+LNKCHGI */ iow ( 0xFF, 0xbf ); /*80, bf*/ /* initialize the driver variables or the user passed arguments */ IO_mode = ior ( 0xFE )>>7; /* ISR Bit [7] IOMODE indicating DATA I/O mode */ LINK = ( ior ( 0X01 )& 0x40 ) ? TRUE: FALSE; /* if NSR Bit [6] = 1: LINK ok, else failed*/ SPEED = ( ior ( 0X01 ) & 0x80 ) ? 10: 100; /* if NSR Bit [7] = 0: SPEED = 100Mbps */ DUPLEX = ( ior ( 0x00 ) & 8 ) ? FULL: HALF; /* if NCR Bit [3] = 1: Full Duplex mode */ return (0); /* RETURN "NU_SUCCESS" */ /* end DM9000A_init I/O routine */ } |