2829|1

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

cs8900无法正确接收数据 [复制链接]

各位大虾,经过几天的努力,网卡中断无法响应的问题已经解决了,可是现在又遇到个问题:中断程序虽然响应了,也进入的接收数据的函数,可是在查询接收状态寄存器的时候,总是返回接收没有OK,我用的是网卡的混杂模式,初始化以及接收函数如下:
  1. put_reg (PP_RxCTL,PP_RxCTL_Promiscuous| PP_RxCTL_IA | PP_RxCTL_Broadcast | PP_RxCTL_RxOK);
  2.         /* enable receive interrupt on receive operations */
  3.         put_reg (PP_RxCFG, 0x0003 | PP_RxCFG_RxOK/*RXIRQ*/);
  4.         /* do not generate any interrupts on transmit operations */
  5.         put_reg (PP_TxCFG, 0x0007 | 0);
  6.         /* use interrupt number 0*/
  7.         put_reg (PP_IntReg, PP_IntReg_IRQ0);
  8.         /* interrupt before counter overflow on buffer operations */
  9.         put_reg (PP_BufCFG, PP_BufCFG_Miss | PP_BufCFG_TxCol);
  10.         /* enable interrupt generation */
  11.         put_reg (PP_BusCTL, 0x0017 | PP_BusCTL_EnableIRQ/*EnableIRQ*/);
  12.         /* enable transmitter/receiver mode */
  13.         put_reg (PP_LineCTL, PP_LineCTL_Rx | PP_LineCTL_Tx);
复制代码

处理函数:
  1. int eth_rx (void)
  2. {
  3.         int i;
  4.         unsigned short rxlen;
  5.         unsigned short *addr;
  6.         unsigned short status;

  7.         status = get_reg (PP_RER);


  8.         if ((status & PP_RER_RxOK) == 0)
  9.                 return 0;

  10.         status = CS8900_RTDATA;                /* stat */
  11.         rxlen = CS8900_RTDATA;                /* len */
  12. #ifdef DEBUG
  13.         if (rxlen > PKTSIZE_ALIGN + PKTALIGN)
  14.                 Uart_Printf ("packet too big!\n");
  15. #endif
  16.     /*NetRxPackets--接收数据的缓存区*/
  17.         for (addr = (unsigned short *) NetRxPackets[0], i = rxlen >> 1; i > 0;i--)
  18.         {
  19.                 *addr++ = CS8900_RTDATA;
  20.         }
  21.         if (rxlen & 1)
  22.         {
  23.                 *addr++ = CS8900_RTDATA;
  24.         }

  25.         /* Pass the packet up to the protocol layers. */
  26. //        NetReceive (NetRxPackets[0], rxlen);
  27. //        main_count=0;
  28.         Uart_Printf("Rv OK!\n");
  29.         return rxlen;
  30. }
复制代码

上面的status总是返回4,也就是初始化的值,而我的中断处理函数部分如下:
  1.         irq_status = get_reg (PP_ISQ);
  2.         // ISQ interrupt event, and allowed to service in this loop?
  3.         while ((irq_status != 0x0000) && (events2service-- > 0))
  4.         {
  5.                 // investigate event
  6.                 if ((irq_status & 0x003f) == 0x0004/*Receiver Event*/)
  7.                 {
  8.                         // correctly received frame, either broadcast or individual address
  9.                         // TODO: think where these checks should appear: here or in cs8900_input()
  10.                         if ((irq_status & 0x0100/*RxOK*/) && (irq_status & 0x0c00/*Broadcast | Individual*/))
  11.                         {
  12.                                 // read the frame from the cs8900a
  13.                                 eth_rx();
  14.                         }
复制代码

能够成功进入eth_rx函数。可是既然进去了,又为什么Rx不OK呢?请高手指教,谢谢了!

最新回复

你好:     你上面写得接收程序好像是查询模式的吧?如果你是用中断的话,那你要改程序!我也在做网卡部分的设计,但是在程序上也是遇见了问题,希望你也能给点意见,我的邮箱drr520cl@163.com  详情 回复 发表于 2008-10-9 16:18
点赞 关注

回复
举报

86

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你好:
    你上面写得接收程序好像是查询模式的吧?如果你是用中断的话,那你要改程序!我也在做网卡部分的设计,但是在程序上也是遇见了问题,希望你也能给点意见,我的邮箱drr520cl@163.com
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表