dm9000的初始化问题

[复制链接]
查看11 | 回复5 | 2021-1-27 06:31:06 | 显示全部楼层 |阅读模式
请各位大虾多多指教和帮忙::
我在对dm9000进行初始化时,LED1和LED2两个灯都不亮,也看了不少关于9000初始化的源码,觉得程序应该没问题,已经弄了好久了,实在找不出问题所在,请各位大虾多多帮忙!
初始化代码如下:
/********************(C)COPYRIGHT2008STMicroelectronics********************
*FileName:main.c
*Author:MCDApplicationTeam
*Version:V2.1
*Date:12/22/2008
*Description:ThisisanEMI16bitsMuxmodeexamplerunning@96MHz.
*ItaimstoconfiguretheSTR9EMIin16bitsMuxmode.
*Hencesomehalfwordsarewritteninexternalmemory
*mappedonbank0.
********************************************************************************
*THEPRESENTSOFTWAREWHICHISFORGUIDANCEONLYAIMSATPROVIDINGCUSTOMERSWITH
*CODINGINFORMATIONREGARDINGTHEIRPRODUCTSINORDERFORTHEMTOSAVETIME.AS
*ARESULT,STMICROELECTRONICSSHALLNOTBEHELDLIABLEFORANYDIRECT,INDIRECT
*ORCONSEQUENTIALDAMAGESWITHRESPECTTOANYCLAIMSARISINGFROMTHECONTENT
*OFSUCHSOFTWAREAND/ORTHEUSEMADEBYCUSTOMERSOFTHECODINGINFORMATION
*CONTAINEDHEREININCONNECTIONWITHTHEIRPRODUCTS.
*******************************************************************************/
/*Includes------------------------------------------------------------------*/
#include"91x_lib.h"

/*Privatetypedef-----------------------------------------------------------*/
/*Privatedefine------------------------------------------------------------*/
#defineTRUE1
#defineFALSE0
#defineFULL0
#defineHALF1
/*Privatemacro-------------------------------------------------------------*/
/*Privatevariables---------------------------------------------------------*/
u32IOBASE=0x3C400000;
u32IODATA=0x3D400000;
u16value1,value2,value3,value4;
u8value;
u8SPEED,LINK,DUPLEX;
/*Privatefunctionprototypes-----------------------------------------------*/
staticvoidDelay(u32nCount);
staticintDM9000A_init(void);
staticvoidphy_write(intoffset,u16value);
staticu16phy_read(intoffset);
voidoutb(u16bRegvsData,u32b4Addr);
u8inb(u32b4Addr);
voidiow(u8reg,u8RegData);
u8ior(u8reg);
/*Privatefunctions---------------------------------------------------------*/
/*******************************************************************************
*FunctionName:main
*Description:Mainprogram
*Input:None
*Output:None
*Return:None
*******************************************************************************/
intmain()
{
//while(1)
{

value=DM9000A_init();
}
}

voidoutb(u16bReg,u32b4Addr)
{
*(u16*)b4Addr=bReg;
}
u8inb(u32b4Addr)
{
u8bRtn;
bRtn=*(u8*)b4Addr;
return(bRtn);
}
voidiow(u8reg,u8RegData)
{
outb(reg,IOBASE);
Delay(75);
outb(RegData,IODATA);
Delay(75);
//*(u16*)IODATA=RegData;
}
u8ior(u8reg)
{
unsignedintrt;
outb(reg,IOBASE);
Delay(75);
rt=inb(IODATA);
Delay(75);
returnrt;
}
/*******************************************************************************
*FunctionName:DM9000A_init
*Description:initlizeDM9000A
*Output:None
*Return:None
*******************************************************************************/
staticintDM9000A_init(void)
{
u16i;
iow(0x1F,0x00);/*GPRREG.1FHPHYPDBit[0]=0toactivateinternalPHY*/
Delay(30000);/*wait>2ms(2~60msnormal)forPHYpower-upready*/
/*software-RESETNIC*/
iow(0x00,0x3);/*NCRREG.00RSTBit[0]=1RESETon,LBK=1MACloopbackon*/
Delay(150);
//value2=ior(0x01);
phy_write(0,0x8000);/*PHYsoftwareRESET:registerstothedefaultstates*/
i=0;do{Delay(75);i++;}while((i2msforPHYAuto-senselinkingtopartner*/
/*programoperatingregisters~*/
iow(0x00,0x00);/*enablechipfunctionsanddisableloopbackbacktonormal*/
/*setotherregistersdependingonapplications*/
iow(0x2F,0x00);/*SpecialMode*/
iow(0xFF,0x80);/*IMRenableonlyPointerAutoReturnforRX/TXFIFOSRAM*/
iow(0x08,0x3F);/*BPTRREG.08(ifnecessary)HighWaterOverflow3KB,600us*/
iow(0x09,0x5A);/*FCTRREG.09(ifnecessary)High/LowThreshold5KB/10KB*/
iow(0x0A,0x21);/*FCRREG.0AHenableTXPEN,FLCE(RX)*/
/*setupthereceiveconfigurationforBroadcast/MulticastHashtable*/
//dm9000_hash_table(dev);
iow(0x00,0x00);
/*clearanypendinginterrupt*/
iow(0x01,0x2c);/*clearNSR3bitsstatus:TX1END,TX2END,WAKESTbyRW/C1*/
iow(0xFE,0x3f);/*clearISRstatus:PR,PT,ROS,ROO,UDRUN,LNKCHGbyRW/C1*/
/*enableinterrupts~go*/
iow(0xFF,0Xbf);/*IMRREG.FFHenablePAR+PTI+PRI+ROI+ROOI+UDRUNI+LNKCHGI*/
/*enableRXBroadcast/ALLMULTICASTtoactivateDM9000A~go*/
iow(0x05,0x30|1);/*RCRREG.05RXENBit[0]=1toenableRXmachine/filter*/
/*initializethedrivervariablesortheuserpassedarguments*/
u8IO_mode=ior(0xFE)>>7;/*ISRBit[7]IOMODEindicatingDATAI/Omode*/
/*#defineTRUE1#defineFALSE0#defineFULL1#defineHALF0*/
LINK=(ior(0X01)&0x40)?TRUE:FALSE;/*ifNSRBit[6]=1:LINKok,elsefailed*/
SPEED=(ior(0X01)&0x80)?10:100;/*ifNSRBit[7]=0:SPEED=100Mbps*/
DUPLEX=(ior(0x00)&8)?HALF:FULL;/*ifNCRBit[3]=0:FullDuplexmode*/
return(0);/*RETURN"NU_SUCCESS"*/
}/*endDM9000A_initI/Oroutine*/
/*******************************************************************************
*FunctionName:phy_write
*Description:WritePHY'sregister.
*Output:None
*Return:None
*******************************************************************************/
staticvoidphy_write(intoffset,u16value)/*refertochapter4-3aboutPHYWRITE*/
{
/*fillthephyxcerregisteraddressintoEPARREG.0CH*/
iow(0x0c,offset|0x40);/*issuethePHYaddress+40H(EPARPHY_ADR="01"b)*/
/*fillthewrittendataintoEPDRH&EPDRL*/
iow(0x0E,(value>>8)&0xff);/*putthehigh-byteintoEPDRHREG.0EH*/
iow(0x0D,value&0xff);/*putthelow-byteintoEPDRLREG.0DH*/
iow(0x0B,0x0a);/*Issuephyxcerwritecommand*/
Delay(3800);/*Waitwritecomplete*/
iow(0x0B,0x08);/*Clearphyxcerwritecommand*/
}
/*******************************************************************************
*FunctionName:phy_read
*Description:WritePHY'sregister.
*Output:None
*Return:None
*******************************************************************************/
staticu16phy_read(intoffset)/*refertothechapter4-2aboutPHYREADsetting*/
{
/*fillthephyxcerregisteraddressintoEPARREG.0CH*/
iow(0x0c,offset|0x40);/*issuethePHYaddress+40H(EPARPHY_ADR="01"b)*/
iow(0x0B,0x0c);/*clearthecommand=0x08firstly*/
Delay(7500);/*wait1~5usforthe"PHY+READ"commandcompletion*/
iow(0x0B,0x08);/*clearthisPHY"READ"command*/
/*thereaddataisinEPDRHREG.0EHforhigh-byte,EPDRLREG.0DHforlow-byte*/
return((ior(0x0E) -->
回复

使用道具 举报

千问 | 2021-1-27 06:31:06 | 显示全部楼层
下个dm9000dbg.c
看一下吧如果硬件没问题的话
回复

使用道具 举报

千问 | 2021-1-27 06:31:06 | 显示全部楼层
我在测试的时候总感觉phy的软件复位没管用,因为在上电时我对phy的某个寄存器进行操作了一下,等软件复位后它并没有恢复初始值,您看有可能是哪的问题呀?因为刚开始接触网卡驱动,好多东西都不懂,望多多赐教,不胜感激!
回复

使用道具 举报

千问 | 2021-1-27 06:31:06 | 显示全部楼层
我也碰到类似的问题,我看uboot初始化的时候还加入了MAC的地址的设置,但是我设置了还是不行啊,一点反应都没有
回复

使用道具 举报

千问 | 2021-1-27 06:31:06 | 显示全部楼层
多谢各位的帮助,我的问题已经解决了,原来是复位信号没弄好!
回复

使用道具 举报

千问 | 2021-1-27 06:31:06 | 显示全部楼层
前辈,您好!!
我最近也在调试DM9000,碰到和您提到的同样的问题,就是“phy的软件复位没管用,0x01
寄存器的bit6始终都是0(连接失败),而不是1(连接成功)”,看您结帖时提到“复位信号没弄好”这个问题,不知道具体是怎么解决的,因此斗胆向您讨教,万望于百忙之中给予解答,十分感谢!!
(注:电路应该是ok的,因为之前在linux下使用网络都正常。DM9KID读取也是正确的,就是不能成功连接,而且使用uart将reg信息打印出来之后发现0x01寄存器的值始终都是0x00,但是MAC寄存器的内容确是之前写入的值,不知道这里有什么地方不对的?)
我的联系方式:[email protected]或者[email protected]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行