打印

向用过AT91RM9200的大侠求助

[复制链接]
3186|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hbicecream|  楼主 | 2010-9-29 17:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠:
    我在编写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++);
}


望各位大侠不吝赐教!!!!!

相关帖子

沙发
wangkj| | 2010-9-29 20:08 | 只看该作者
裸奔跑网络程序,你太牛了。
我记得,atmel有例子程序,不过是很简单的测试。
我觉得有这个必要吗?

使用特权

评论回复
板凳
hbicecream|  楼主 | 2010-9-30 10:22 | 只看该作者
我在ARM7上裸奔过网络程序,
不管用不用系统,如果底层不正常,恐怕都不行吧?
我要把网络发送速率跑到40M以上,恐怕只能裸奔吧?你有其他方法吗?

使用特权

评论回复
地板
wangkj| | 2010-9-30 15:43 | 只看该作者
u-boot正常吗?

使用特权

评论回复
5
wangkj| | 2010-9-30 15:44 | 只看该作者
linux能跑到到80M别说40M了。但得靠近底层操作。

使用特权

评论回复
6
hbicecream|  楼主 | 2010-9-30 17:16 | 只看该作者
楼上的,9200的MCK极限频率是80M,我问过ATMEL客服,包括片内SRAM在内的外围器件时钟都不可能超过它,你要发送以太网数据,且不说封装网络包消耗的时间,就是从SDRAM取指、读写数据都不是单个mck周期能完成的,我裸奔开DMA开Icache都没把EMAC发送跑到80M,你的linux难道还能快过裸奔?没有系统时钟?不用任务调度?

使用特权

评论回复
7
hbicecream|  楼主 | 2010-9-30 17:29 | 只看该作者
另外,请问各位ETH_CFG中的CAF怎么理解,是不是置位后什么帧都收?
Uboot里面CAF和NBC都置位了,这样广播报还能收到吗?

使用特权

评论回复
8
wangkj| | 2010-9-30 19:00 | 只看该作者
linux直接控制寄存器,跟裸奔没区别。
我给公司做的产品就是应用程序直接控制寄存器,
标准内核随时可以估计,驱动都不用重写。
驱动在应用程序中实现。
这是俺06年代独创。
后来,发现android也是这么干的。
mac细节我没看。也没那么高的速度要求。
sdram去数据,只要顺序取非常快。有读又写加上随机,速度巨降

使用特权

评论回复
9
hbicecream|  楼主 | 2010-10-8 08:40 | 只看该作者
楼上的,不要偷换概念,你直接操作寄存器,几乎所有嵌入式操作系统驱动都是这么干的,这并不能提高你的速度,因为操作系统肯定有任务管理,任务切换,各种优先级管理,这些都是要消耗时间的,不可能你的CPU有了操作系统就能同时干好几件事,还是要一条指令一条指令的执行,不要神化操作系统,说到底都是代码,谁比谁更神奇呢?

使用特权

评论回复
10
fancyfeeling| | 2010-10-8 09:09 | 只看该作者
我是菜鸟,看看帖子,学习中!

使用特权

评论回复
11
wangkj| | 2010-10-8 09:24 | 只看该作者
只要提供足够的数据给dma控制器,无需cpu干预;另外,俺是应用程序控制寄存器,不是驱动。
我只是提供一种思路,我也没这种高速数据收发的需求,所以没研究过,只能是说自己的一点建议。
最终还得靠你自己解决。

通常,网络互助,也只能做到这点。毕竟不是一个公司,不是一个项目组的。

使用特权

评论回复
12
shockwave| | 2010-10-8 10:07 | 只看该作者
9200裸跑网络和带linu的网络俺都用过,已经都产品化了。
你不开Dcache想跑到80M很困难。linux都比你现在情况快很多。因为linux开Dcache的。
我测试过,如果用外部SDRAM光开Icache的9200比内置flash的60M的ARM7速度还慢点。开了Dcache后至少翻几倍。

使用特权

评论回复
13
hbicecream|  楼主 | 2010-10-8 12:37 | 只看该作者
偏题了啊,我的问题是数据接收出现异常,不知道是不是设置问题,收发速度不管开不开Dcache都有40M以上了,满足要求了

另请教楼上,开了Dcache是如何影响速度的?

使用特权

评论回复
14
wangkj| | 2010-10-8 13:52 | 只看该作者
这种用法,非典。帮不上忙了。得花很多的功夫去琢磨,而且,9200本身有很多bug,看看他的bug纠正,看看是否才地雷了。如果不是,恐怕你得好好下一番功夫。

使用特权

评论回复
15
hbicecream|  楼主 | 2010-10-8 14:36 | 只看该作者
他姥姥的,要不是看它有QFP封装,就不用它了

使用特权

评论回复
16
Allent| | 2010-10-8 15:10 | 只看该作者
可以广告吗?西安现货、

使用特权

评论回复
17
wangkj| | 2010-10-8 16:30 | 只看该作者
9260 9315 winbond w950都是tqfp封装的arm9

使用特权

评论回复
18
hbicecream|  楼主 | 2010-10-8 17:13 | 只看该作者
斑竹。。同档次的意义不大,性能要高一个档次,跑操作系统还能轻轻松松达到我的要求,我倒是想上A8呢,又担心开发周期和风险,你当我不想上linux么:'(

使用特权

评论回复
19
wangkj| | 2010-10-9 08:37 | 只看该作者
嘿嘿,我现在正在搞A8,不过,确实只能是高收益项目才能用。
技术不是问题,钱是问题。
BGA的焊接不是问题,只要找对人,不用焊接台,肯定能搞定。

使用特权

评论回复
20
hbicecream|  楼主 | 2010-10-11 11:55 | 只看该作者
终于搞定了,踩了个大地雷,该死的ATMEL手册也不更新,写得不清不楚,大家注意看纠错手册

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

241

帖子

0

粉丝