导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教关于RTL8019AS方面的问题

* 94654: 请教关于RTL8019AS方面的问题

   fn333 
fn333发表的帖子 

 请教关于RTL8019AS方面的问题
[size=2][size=3][size=2][color=#00FFFF]在使用RTL8019传送数据时,能不能不用把数据打包直接传送数据呢?这是附的RTL8019进行网上传数的程序。
/************************************************************
 * File name : Ne2000.c         *
  ************************************************************/

#include "armnet.h"
#include "..\inc\44blib.h"
#include "..\inc\44b.h"
#include   <string.h>  

extern NODE locnode;       //本机的节点信息结构(mac,ip,mask,port)
NICHDR  nichdr;

void ResetNic(void)
{
 
 unsigned char temp;
 
    EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;//22H
    Delay(100); 
 
 rPCONC |= 0x10000000;
 #if NE_WORDMODE
  rPDATC |= 0x4000;
 #else
  rPDATC &= 0xbfff;
 #endif
 Delay(200);
 temp = EN_RESET;
 EN_RESET = temp;
 Delay(200);
 rPDATC &= 0xbfff;
 rPCONC &= 0xcfffffff;
 
    EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_STOP;//21H
    Delay(100);
    
    if(EN_ISR & ENISR_RESET)       //检测ISR的第7位,判断是否复位成功
    {
     DEBUGF(DEMO_DEBUG,("\nNIC Reset OK!\n"));
    }
    else
    {
     DEBUGF(DEMO_DEBUG,("\nNIC Reset Failed!\n"));
     return;
    }
    
    EN_DCR   = NE_DCRVAL;
    EN_RBCR0  = 0x00;     /* MSB remote byte count reg */
    EN_RBCR1  = 0x00;     /* LSB remote byte count reg */
    EN_RCR   = ENRCR_RXOFF;    /* RX configuration reg  Monitor mode (no packet receive) */
    EN_TCR   = ENTCR_TXOFF;    /* TX configuration reg  set internal loopback mode  */
    EN_TPSR     = TX_START_PG;
    EN_PSTART   = RX_START_PG ;   /* DMA START PAGE 46h */ 
    EN_PSTOP   = RX_STOP_PG;      /* Ending page +1 of ring buffer */
    EN_BNRY  = RX_START_PG;   /* Boundary page of ring buffer */
    EN_ISR      = 0xff;     /* INTerrupt stauts reg */
    EN_IMR      = ENIMR_RX | ENIMR_RX_ERR | ENIMR_TX | ENIMR_TX_ERR;

    EN_CR = ENCR_PAGE1 + ENCR_NODMA + ENCR_STOP;
    Delay(100);
    EN_PAR0  = locnode.mac[0];
    EN_PAR1  = locnode.mac[1];
    EN_PAR2  = locnode.mac[2];
    EN_PAR3  = locnode.mac[3];
    EN_PAR4  = locnode.mac[4];
    EN_PAR5  = locnode.mac[5];
    EN_MAR0  = 0xff;  
    EN_MAR1  = 0xff;
    EN_MAR2  = 0xff;
    EN_MAR3  = 0xff;
    EN_MAR4  = 0xff;
    EN_MAR5  = 0xff;
    EN_MAR6  = 0xff;
    EN_MAR7  = 0xff;
    EN_CURR  = RX_START_PG + 1;   /* RX_CURR_PG; Current memory page = RX_CURR_PG  ? */
  
    EN_CR = ENCR_PAGE0 + ENCR_NODMA ;   /* 00001010B: PS1 PS0 RD2 RD1 RD0 TXP STA STP */
    Delay(100);
    EN_RCR   = ENRCR_RXCONFIG;    /* rx on(broadcasts, no multicast,errors   04*/
    EN_TCR   = ENTCR_TXCONFIG;   /* xmit on. */
    EN_ISR   = 0xff;      /* Individual bits are cleared by writing a "1" into it. */
    EN_IMR   = ENISR_ALL;    /* INTerrupt mask reg */
    
 EN_CR = ENCR_PAGE0 + ENCR_NODMA + ENCR_START;
}

void getnic(unsigned short addr, unsigned char data[],unsigned short len)
{
 unsigned short count;
 unsigned short * dataw;
 
 count = NE_WORDMODE ? len >  >   1 : len;
 
 EN_ISR   = ENISR_RDC;       // clear remote dma interrupt flag
   EN_RBCR0 = (unsigned char)(len & 0xff);   // read length low
 EN_RBCR1 = (unsigned char)(len >  >   8);   // read length high
 EN_RSAR0 = (unsigned char)(addr & 0xff);  // read address low
 EN_RSAR1 = (unsigned char)(addr >  >   8);   // read address high
 EN_CR    = ENCR_RREAD + ENCR_START + ENCR_PAGE0;// do dma read
 
 #if NE_WORDMODE
     dataw = (unsigned short *)data;    // Use pointer for speed 
     while(count--)                        // Get words 
         *dataw++ = EN_DATAW;
     if (len & 0x01)                          // If odd (奇数)length, do last byte 
         *(unsigned char *)dataw = EN_DATAB;
 #else
     while(count--)                        // Get bytes 
         *data++ = EN_DATAB;
 #endif
}

void putnic(unsigned short addr, unsigned char data[],unsigned short len)
{
 unsigned short count;
 unsigned short * dataw;
 
 len += len & 0x01;    //将长度调整为偶数
 count = NE_WORDMODE ? len >  >   1 : len;//根据字节,半字调整长度
  
 EN_ISR   = ENISR_RDC;       //clear remote dma interrupt flag
 EN_RBCR0 = (unsigned char)(len & 0xff);
 EN_RBCR1 = (unsigned char)(len >  >   8);
 EN_RSAR0 = (unsigned char)(addr & 0xff);
 EN_RSAR1 = (unsigned char)(addr >  >   8);
 EN_CR    = ENCR_RWRITE + ENCR_START + ENCR_PAGE0;
 
 #if NE_WORDMODE                              /* Word transfer? */
     dataw = (unsigned short *)data;
     while(count--)
         EN_DATAW = *dataw++;
 #else
     while(count--)                  /* O/P bytes */
         EN_DATAB = *data++;
 #endif
 
    count = 10000;                      /* Done: must ensure DMA complete */
    while(count && (EN_ISR & ENISR_RDC) == 0)
        count--;
}

unsigned char nicwrap(unsigned char page)
{
 if (page >  = RX_STOP_PG)
  page += RX_START_PG - RX_STOP_PG;
 else if(page   < RX_START_PG)
  page += RX_STOP_PG - RX_START_PG;
 return (page);

unsigned short GetEthernet(ETHERFRAME *efp)   
{
 unsigned short current_offset;
 unsigned char curr_page;
 unsigned char bnry;
 
 if (EN_ISR & 0x10) ResetNic();     
        
 EN_CR = ENCR_NODMA + ENCR_PAGE1 + ENCR_START;  
 curr_page = EN_CURR;
 EN_CR = ENCR_NODMA + ENCR_PAGE0 + ENCR_START;
 bnry = EN_BNRY + 1;  
 if (bnry >   RX_STOP_PG)  bnry = RX_START_PG;

 if (bnry != curr_page)                 //如果接收到数据包
    {
  current_offset = (unsigned short)(bnry   <  < 8);
  memset((unsigned char *)&nichdr, 0xee, sizeof(nichdr));//得到NIC信息头
  getnic(current_offset, (unsigned char *)&nichdr, sizeof(nichdr));

  if ((nichdr.stat & 0x01) && nichdr.len >  = MINFRAMEC  && nichdr.len  <=MAXFRAMEC)//如果信息头没有问题,接收数据包
   if(efp)
             getnic(current_offset + sizeof(nichdr), (unsigned char *)efp, nichdr.len - sizeof(nichdr));
  if (nichdr.next >  = RX_START_PG && nichdr.next   < RX_STOP_PG)
   bnry = nichdr.next;
  else
   bnry = nicwrap(bnry + 1);
  bnry = nicwrap(bnry - 1);
  EN_BNRY = bnry;
  return (nichdr.len - sizeof(nichdr));// - sizeof(ETHERHDR));
 } 
 return (0);
}


unsigned short PutEthernet(ETHERFRAME *efp, unsigned short len)
 {
   if  (EN_CR & ENCR_TRANS)  //如果仍然正在发送,返回0
       len=0;
   else  
   {
    len = min(MAXFRAME,max(len,MINFRAME));
    EN_CR = ENCR_PAGE0 + ENCR_NODMA;
   EN_ISR = ENISR_TX + ENISR_TX_ERR;
   EN_TBCR0=(unsigned char)(len & 0xff);
   EN_TBCR1=(unsigned char)(len >  >   8);
   putnic(TX_START_PG   <  < 8, (unsigned char *)efp, len);
   EN_CR = ENCR_NODMA + ENCR_PAGE0 + ENCR_TRANS;
  }
  return(len);
}

unsigned short MakeFrame(ETHERFRAME *efp, unsigned char srce[], unsigned char dest[], unsigned short pcol, unsigned short dlen)
{
  unsigned char i;

    efp->  e.ptype = pcol;
    for(i=0;i  <MACLEN;i++)
    {
     efp->  e.dest[i] = dest[i];
  efp->  e.srce[i] = srce[i];
 }
 SwapEther(efp);
    dlen += sizeof(ETHERHDR);
    return(dlen);
}


void SwapEther(ETHERFRAME *efp)
{
    efp->  e.ptype = swapw(efp->  e.ptype);
}
 

[/color][/size][/size][/size]

发表时间:2006年6月14日9:38:28

  
回复该帖

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

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

[上一篇帖子]:[求助]用80C51单片机制作交通灯的编程和电路图!!???这是我选修课作业,请各位大虾帮忙哈,谢谢
[下一篇帖子]:哎,还是不明白阿,能具体点么,万分感谢!还是不太明白。我的意思是难道不管这条LED有多长,我一次都要