导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→还是读错,气杀我也!

* 2724: 硬件:这样读8019的接收缓冲区为什么错?

   huangyan 
huangyan发表的帖子 

 还是读错,气杀我也!
我读DMA总是少了第偶数字节,如:
正确包:
 FF FF FF FF FF FF 00 D0-F8 09 17 77 08 00 45 00   
 03 54 4D A1 00 00 80 11-67 A7 C0 A8 

而读取的却是:
FF FF FF D0 09 77 00 00 54 A1 00 11 A7 A8

很明显,NIC接收正确,但我读取DMA时错。这是为什么?
请各虾们指点。谢谢
另:我用的是DM9008,但我认真看了9008与8019的说明书,
并没什么区别。

以下是程序.

/* store 类似于 outportb  */
/* take  类似于 inport */


void Ne2000Init()
{
  set_io(ETH_RST,1);
  delay_20ms();
  set_io(ETH_RST,0);
  delay_20ms();            /* DM9008 RESET */
  
  store(ETH_R00,0x22);     
  store(ETH_R01,0x4c);      /* Pstart 接收缓冲区起始页 */
  store(ETH_R02,0x80);      /* Pstop  接收缓冲区结束页 */
  store(ETH_R03,0x4c);      /* NBRY   已被读取的页 */
  store(ETH_R04,0x45);      /* TPSR   发送缓冲区起始页 */
  store(ETH_R0C,0xcc);      /* RCR    接收配置 0xcc   */
  store(ETH_R0D,0xe0);      /* TCR    接收配置       */
  store(ETH_R0E,0xc8);      /* DCR    DMA数据配置 */
  store(ETH_R0F,0x00);      /* IMR    中断配置  */


  page(1);
  store(ETH_R07,0x4d);      /* CURR 接收指针 */
  store(ETH_R08,0x00);      /* MAR0----MAR7  */
  store(ETH_R09,0x41);
  store(ETH_R0A,0x00);
  store(ETH_R0B,0x80);
  store(ETH_R0C,0x00);
  store(ETH_R0D,0x00);
  store(ETH_R0E,0x00);
  store(ETH_R0F,0x00);
  page(0);
}

/* 从任何一个位置读   8019RAM地址    数据区  字节数 */
void ReadNe2000Ram(uint ram_addr,uchar *buf,int len)
{
  uint ui;
  uchar uc;
  int i;

  page(0);
  ui=(ram_addr & 0xff00)>>8;
  uc=(char)ui;
  store(ETH_R09,uc);   /* Set High address */
  ui=ram_addr & 0x00ff;
  uc=(char)ui;
  store(ETH_R08,uc);   /* Set low address */
  ui=( (len*2) & 0xff00)>>8;  /* len or len*2? */
  uc=(char)ui;
  store(ETH_R0B,uc);  /* Set read counter High */
  ui=( len*2 ) & 0x00ff;      /* len or len*2? */
  uc=(char)ui;
  store(ETH_R0A,uc);  /* Set read counter low */
  store(ETH_R00,0x0a);   /* Read DMA */
  for(i=0;i<len;i++)
  {
    uc=take(ETH_R10);
    buf[i]=uc;
    take(ETH_R10);  /* 抛弃一个,如果不抛弃,则变成
                       FF FF FF FF FF FF D0 D0 09 09
                       77 77 00 00 ....(真是,该来的
                      不来,不该来的却来了)
                    */
  }
}


/* 写8019的RAM     8019RAM地址    数据区  字节数 */
void WriteNe2000Ram(uint ram_addr,uchar *buf,int len)
{
  uint ui;
  uchar uc;
  int i;

  page(0);
  ui=(ram_addr & 0xff00)>>8;
  uc=(char)ui;
  store(ETH_R09,uc);   /* Set High address */
  ui=ram_addr & 0x00ff;
  uc=(char)ui;
  store(ETH_R08,uc);   /* Set low address */
  ui=((len*2) & 0xff00)>>8;     /* len or len*2? */
  uc=(char)ui;
  store(ETH_R0B,uc);  /* Set read counter High */
  ui=(len*2) & 0x00ff;   /* len or len*2? */
  uc=(char)ui;
  store(ETH_R0A,uc);  /* Set read counter low */
  store(ETH_R00,0x12);   /* 00 010 0 10  Write DMA */
  for(i=0;i<len;i++){store(ETH_R10,buf[i]); store(ETH_R10,buf[i]); }
}

/* 读8019已接收但还未被读取的当前页 */
void ReadOnePage(char *buf)
{
  int address;
  uchar c;
  c=take(ETH_R03); /* Get Now BNRY */
  c++;
  address=c;
  address=address<<8;
  ReadNe2000Ram(address,buf,256);
  if(c==RcvBufEnd) c=RcvBufBeg;
  store(ETH_R03,c);  /* BNRY=BNRY+1 */
}



发表时间:2001年11月16日20:24:00

  
回复该帖

本主题共有 21 帖,分页:>>>>>该主题的所有内容[21]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

  2741.[详细]看我的新文章.
摘要:......(无内容)
- [老古][1174次] 2001年11月17日

  2744.[详细]老古,你的新文章在哪里呀,我怎么找不着?
摘要:......(无内容)
- [huangyan][1016次] 2001年11月17日

  2756.[详细]http://www.laogu.com/MY/pci7.htm
摘要:......(无内容)
- [easy][1218次] 2001年11月17日

[上一篇帖子]:不会吧,有8位的,因为我用8位的方式写DMA,读DMA,完全正确呀
[下一篇帖子]:我刚问了你几个问题,看一下,咱们交流一下