请教关于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