各位大侠:
我在编写AT91RM9200以太网数据处理程序时,没有使用Uboot和linux操作系统,自己编写的程序和以太网数据缓冲均在SDRAM中运行,MCK=78M,ProcessorCLK=156M,没有使用Dcache,使用了Icache,PHY是RTL8201BL工作在MII模式,强制100M全双工。问题如下:
<1>发现ETH_RBQP不是按照0,1,2。。。的顺序移动的,而是0,1,0,1,5,6,7,16,17。。。这样跳跃着移动的,请问这是怎么回事
<2>在程序运行几十秒之后ETH_RSR的OVR就置位了,之后就一直频繁置位,无法接收到正常数据了,请问为什么?怎么解决?
另外,我发现有人和我遇到一样的问题,请看下面的链接:
http://www.at91.com/forum/viewtopic.php/f,4/t,89/
调试程序时没有打开任何中断,也没有运行其它应用程序,就像单片机程序那样使用了while循环,初始化代码如下:
/*********************************************************************************************************
** 函数名称:
** 函数功能:
** 入口参数:
** 出口参数:
** 说 明:
********************************************************************************************************/
void EMAC9200_CfgETH (void)
{
uint32 i;
// 清除统计
AT91C_BASE_EMAC->EMAC_CTL |= AT91C_EMAC_CSR;
// 初始接收队列
for (i=0;i<EMAC_Recv_QueueMax;i++)
{
EMACRecvQueue.Address = (uint32)(EMACRecvBuf);
EMACRecvQueue.Size = 0;
}
EMACRecvQueue[EMAC_Recv_QueueMax-1].Address |= RBF_WRAP;
// 设置接收缓冲队列指针
AT91C_BASE_EMAC->EMAC_RBQP = (uint32)EMACRecvQueue;
// 设置MAC地址
AT91C_BASE_EMAC->EMAC_SA1L = ((MAC[3] << 24) + (MAC[2] << 16) + (MAC[1] << 8) + (MAC[0]));
AT91C_BASE_EMAC->EMAC_SA1H = ((MAC[5] << 8) + (MAC[4]));
// 100M,全双工,MCK/64
AT91C_BASE_EMAC->EMAC_CFG = (AT91C_EMAC_SPD | AT91C_EMAC_FD | AT91C_EMAC_CLK_HCLK_64);
// 清除接收状态
AT91C_BASE_EMAC->EMAC_RSR = ~(AT91C_EMAC_BNA | AT91C_EMAC_REC | AT91C_EMAC_RSR_OVR);
for (i=0;i<EMAC_Send_QueueMax;i++)
{
EMACSendQueue.Address = (uint32)((EMAC_Buffer_Length * i) + EMAC_Send_Address);
EMACSendQueue.Size = 0;
}
EtherSendBuf = (uint8 *)(EMACSendQueue[0].Address);
EMAC9200SendBP = 0; // 发送缓冲指针
EMAC9200SendSP = 0; // 发送服务读指针
EMAC9200SendCount = 0; // 发送队列计数
EMAC9200RecvSP = 0; // 接收服务读指针
// 使能接收和发送
AT91C_BASE_EMAC->EMAC_CTL = (AT91C_EMAC_RE | AT91C_EMAC_TE);
////延时
for (i = 0; i < 1000000; i++);
}
望各位大侠不吝赐教!!!!! |