这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 【求助】RTL8019,初始化芯片以后,读取ISR和CURR寄存器的值全部为0x

共4条 1/1 1 跳转至

【求助】RTL8019,初始化芯片以后,读取ISR和CURR寄存器的值全部为0xFF

助工
2011-10-17 21:12:23 打赏

最近在做一个TCP/IP的东东,刚好使用RTL8019AS芯片,在编写驱动程序的时候,对芯片进行初始化以后,进行读取ISR和CURR寄存器,发现两个寄存器的值都是0xFF,颇感郁闷,在此向各位大虾请教一下。具体初始化代码如下:

//==========================================
//软件复位部分
//==========================================
// 选择页
RealTekSelectPage(0);
// 切换到正常工作方式
RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x22);

// 对芯片进行复位操作
OSTimeDly(OS_TICKS_PER_SEC >> 4);
value = RealTekReadREG(pRealTekReg->reg0r.ResetPort, pRealTekReg);
RealTekWriteREG(pRealTekReg->reg0w.ResetPort, pRealTekReg, (BYTE)value);
OSTimeDly(OS_TICKS_PER_SEC >> 4);

// 使网卡停止运行
RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x21);

// 延时10 毫秒以上,确保芯片进入停止模式
OSTimeDly(OS_TICKS_PER_SEC >> 4);

// 读取ISR 标志,判断网卡是否复位成功
value = RealTekReadREG(&pRealTekReg->reg0r.ISR, pRealTekReg);
if (value & 0x00000080)
{
printf("NIC Reset OK!\r\n");
}
else
{
printf("NIC Reset Failed!\r\n");
goto InitcleanUp;
}
// 软复位结束

//==========================================
//初始化部分
//==========================================
// 设置发送缓冲区起始地址
RealTekWriteREG(&pRealTekReg->reg0w.TPSR, pRealTekReg, 0x40);

// 设置接收缓冲区范围
RealTekWriteREG(&pRealTekReg->reg0w.PSTART, pRealTekReg, 0x4C);
RealTekWriteREG(&pRealTekReg->reg0w.PSTOP, pRealTekReg, 0x80);
RealTekWriteREG(&pRealTekReg->reg0w.BNRY, pRealTekReg, 0x4C);

// 清除中断标志位
RealTekWriteREG(&pRealTekReg->reg0w.ISR, pRealTekReg, 0xFF);

// IMR 中断屏蔽寄存器,禁止所有中断
RealTekWriteREG(&pRealTekReg->reg0w.IMR, pRealTekReg, 0x00);

// RBCR0, RBCR1 远程字节寄存器,用于设置远程DMA 字节数
RealTekWriteREG(&pRealTekReg->reg0w.RBCR0, pRealTekReg, 0x00);
RealTekWriteREG(&pRealTekReg->reg0w.RBCR1, pRealTekReg, 0x00);

// RCR 接收配置寄存器,监视方式,不接收数据包
RealTekWriteREG(&pRealTekReg->reg0w.RCR, pRealTekReg, 0x20);

// TCR 传输配置寄存器,选择内部Loop back 模式
RealTekWriteREG(&pRealTekReg->reg0w.TCR, pRealTekReg, 0x02);

// DCR 数据配置寄存器,8 位DMA 方式
RealTekWriteREG(&pRealTekReg->reg0w.DCR, pRealTekReg, 0xC8);

// 选择页
RealTekSelectPage(1);

// CURR 当前页面寄存器
RealTekWriteREG(&pRealTekReg->reg1rw.CURR, pRealTekReg, 0x4D);

// MAR0 - MAR7 设置多播地址
RealTekWriteREG(&pRealTekReg->reg1rw.MAR0, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR1, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR2, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR3, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR4, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR5, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR6, pRealTekReg, 0xFF);
RealTekWriteREG(&pRealTekReg->reg1rw.MAR7, pRealTekReg, 0xFF);

// PAR0 - PAR5 设置MAC 地址
RealTekWriteREG(&pRealTekReg->reg1rw.PAR0, pRealTekReg, 0x00);
RealTekWriteREG(&pRealTekReg->reg1rw.PAR1, pRealTekReg, 0x1F);
RealTekWriteREG(&pRealTekReg->reg1rw.PAR2, pRealTekReg, 0x16);
RealTekWriteREG(&pRealTekReg->reg1rw.PAR3, pRealTekReg, 0x16);
RealTekWriteREG(&pRealTekReg->reg1rw.PAR4, pRealTekReg, 0x73);
RealTekWriteREG(&pRealTekReg->reg1rw.PAR5, pRealTekReg, 0x1A);

// 选择页
RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x20);
OSTimeDly(OS_TICKS_PER_SEC >> 4);

// RCR 接收配置寄存器,仅接收自己地址的数据包( 以及广播地址数据包) 和多点播送地址包
// 丢弃小于64 字节的数据包,丢弃校验错误的数据包
RealTekWriteREG(&pRealTekReg->reg0w.RCR, pRealTekReg, 0xCC);

// TCR 传输配置寄存器,启用CRC 生成和CRC 自动校验,工作在正常模式
RealTekWriteREG(&pRealTekReg->reg0w.TCR, pRealTekReg, 0xE0);

// 写ISR 寄存器, 清空中断状态寄存器
RealTekWriteREG(&pRealTekReg->reg0w.ISR, pRealTekReg, 0xFF);

// IMR 中断屏蔽寄存器
RealTekWriteREG(&pRealTekReg->reg0w.IMR, pRealTekReg, 0x35);

// 回到正常工作方式
RealTekWriteREG(&pRealTekReg->reg0w.CR, pRealTekReg, 0x22);

当读取ISR和CURR的值的时候,发现两个寄存器都为0xFF,不知为何,请各位赐教,非常感谢!




关键词: 求助 RTL8019 初始化 芯片 以后 读取

菜鸟
2011-10-17 21:24:49 打赏
2楼
问题出在了初始化的时候,添加了一些调试代码,选择了Page1,而当有数据到来时,直接读取0x07寄存器的值,引入了错误。正确的做法是:当网卡中断的时候,先停止网卡工作,然后保证在页面0的时候,读取ISR寄存器的值,再根据ISR的值进行中断处理。

菜鸟
2013-08-06 11:13:03 打赏
3楼

兄弟,我也出现了这个情况,看了你的帖子,还是没有成功啊!指教一下啊!


菜鸟
2013-08-06 11:15:44 打赏
4楼

NET_RST=1; //RESET
delay_ms(500);
NET_RST=0;
Data=RTL8019_Read(0x1f);
RTL8019_Write(0x1f,Data);
// RTL8019_Write(ISR,0xff);
delay_ms(100);
/*
RTL8019_Write(CR,0XE1); // PAGE3
RTL8019_Write(0X01,0XC0);
RTL8019_Write(CONFIG2,0X60);
RTL8019_Write(CONFIG3,0x0);
RTL8019_Write(0X01,0X00);
*/

RTL8019_Write(CR,0X21); // PAGE0
delay_ms(100);
//RTL8019_Write(ISR,0xff);
// RTL8019_Write(IMR,0);

// RTL8019_Write(BNRY,0X4C);
// Data=RTL8019_Read(BNRY);

RTL8019_Write(RCR,0x1C);
RTL8019_Write(TCR,0x02);
RTL8019_Write(DCR,0x48);
// RTL8019_Write(BNRY,0X4C);

RTL8019_Write(PSTART,0x4c);
RTL8019_Write(PSTOP,0X80);
RTL8019_Write(TPSR,0X40);

RTL8019_Write(RBCR0,0x0);
RTL8019_Write(RBCR1,0x0);
RTL8019_Write(TBCR0,0x0);
RTL8019_Write(TBCR1,0x0);
delay_ms(200);
RTL8019_Write(BNRY,0X4C);
RTL8019_Write(ISR,0xFF);
// Data=RTL8019_Read(BNRY);
RTL8019_Write(IMR,0x1F);
// RTL8019_Write(TCR,0x00);
delay_ms(2);


RTL8019_Write(CR,0X61); // PAGE1

RTL8019_Write(CURR, 0x4C);//CURRÊÇÍø¿¨Ð´ÄÚ´æµÄÖ¸Õë¡£ËüÖ¸Ïòµ±Ç°ÕýÔÚдµÄÒ³µÄÏÂÒ»Ò³
Data=RTL8019_Read(CURR);

RTL8019_Write(PAR0, 0xBA);
Data=RTL8019_Read(CURR);
Data=RTL8019_Read(PAR0);

RTL8019_Write(PAR1, 0xDD);
RTL8019_Write(PAR2, 0xEA);
RTL8019_Write(PAR3, 0x0C);
RTL8019_Write(PAR4, 0x11);


RTL8019_Write(MAR0, 0xff);
RTL8019_Write(MAR1, 0xff);
RTL8019_Write(MAR2, 0xff);
RTL8019_Write(MAR3, 0xff);
RTL8019_Write(MAR4, 0xff);
RTL8019_Write(MAR5, 0xff);
RTL8019_Write(MAR6, 0xff);
RTL8019_Write(MAR7, 0xff);

RTL8019_Write(CR,0x22); //Start the NIC



共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]