⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ethernet.c

📁 mc51单片机对rtl8019编程,实现ethernet的收发控制.
💻 C
字号:
#include "ethernet.h"
	
Net_inf_struc 	net_inf;


#define PSTART_data		0x46
#define PSTOP_data		0x60
#define TPSR_data		0x40

//define the register offset of the Ethernet chipset  
#define CR_Add 		0x0
#define REMOTE_DMA_PORT	0x10
#define RESET_PORT		0x18
//Page 0
#define CLDA0_Add 	0x01
#define PSTART_Add 	0x01
#define CLDA1_Add 	0x02
#define PSTOP_Add 	0x02
#define BNRY_Add 	0x03
#define TSR_Add 	0x04
#define TPSR_Add 	0x04
#define NCR_Add 	0x05
#define TBCR0_Add 	0x05
#define FIFO_Add 	0x06
#define TBCR1_Add 	0x06
#define ISR_Add 	0x07
#define CRDA0_Add 	0x08
#define RSAR0_Add 	0x08
#define CRDA1_Add 	0x09
#define RSAR1_Add 	0x09
#define ID0_Add		0x0a
#define RBCR0_Add 	0x0a
#define ID1_Add		0x0b
#define RBCR1_Add 	0x0b
#define RSR_Add 	0x0c
#define RCR_Add 	0x0c
#define CNTR0_Add	0x0d
#define	TCR_Add		0x0d
#define CNTR1_Add	0x0e
#define	DCR_Add		0x0e
#define CNTR2_Add	0x0f
#define	IMR_Add		0x0f

//Page 1
#define	PAR_Add		0x01
#define	CURR_Add	0x07
#define	MAR_Add		0x08

#define	wrport(x,y)	XBYTE[x] = (y)
#define	rdport(x)	XBYTE[x]

//-----------------------------------------------------------------
void ethernet_init(Uint16 base_addr, Uint8 *pMac)
{
	Uint8 i;
	net_inf.net_ifaddr = base_addr;
	if(pMac != NULL)
		memcpy(net_inf.mac,pMac,ETHER_ADDR_LEN);
	//Page 0,Stop command
  	wrport(net_inf.net_ifaddr+CR_Add,0x21);
  	//Auto-initalize Remote,byte-wide DMA transmit  	 	
  	wrport(net_inf.net_ifaddr+DCR_Add,0x98);
  	//Clear Remote byte count register
	wrport(net_inf.net_ifaddr+RBCR0_Add,0);
  	wrport(net_inf.net_ifaddr+RBCR1_Add,0);
  	//Config reveive mode
  	wrport(net_inf.net_ifaddr+RCR_Add,0xcc);
  	//Config transmit mode
  	wrport(net_inf.net_ifaddr+TCR_Add,0xe2);
  	//Config Receive ring 
  	wrport(net_inf.net_ifaddr+PSTART_Add,PSTART_data); 
  	wrport(net_inf.net_ifaddr+PSTOP_Add,PSTOP_data);
  	wrport(net_inf.net_ifaddr+BNRY_Add,PSTART_data);
  	//clear Isr and no interrupt
  	wrport(net_inf.net_ifaddr+ISR_Add,0xff);
  	wrport(net_inf.net_ifaddr+IMR_Add,0x0f); 	
  	//Config the transmit page address
  	wrport(net_inf.net_ifaddr+TPSR_Add,TPSR_data);
  	wrport(net_inf.net_ifaddr+TBCR0_Add,0);
  	wrport(net_inf.net_ifaddr+TBCR1_Add,0);  	
  	//Page 1,Stop command
  	wrport(net_inf.net_ifaddr+CR_Add,0x61);
  	//Config the first reveive buffer page
  	wrport(net_inf.net_ifaddr+CURR_Add,PSTART_data+1);
  	//Config MAC address
  	for(i=0;i<6;i++){
		wrport(net_inf.net_ifaddr+1+i,net_inf.mac[i]);
	}  	  	  	  	
  	//Config transmit mode
  	wrport(net_inf.net_ifaddr+CR_Add,0x21); 
  	wrport(net_inf.net_ifaddr+TCR_Add,0xe0);
  		//Page 0,Begin command
  	wrport(net_inf.net_ifaddr+CR_Add,0x22); 
}

//-----------------------------------------------------------------
Bool ethernet_send(Uint8 *pbuffer, Uint16 aLength)
{
	Uint8	crda0;
	Uint16 	i;
	if(rdport(net_inf.net_ifaddr+CR_Add)&0x4)
		return FALSE;
	aLength=Max(64,aLength);
	aLength=Min(ETHER_BUFFER_LEN,aLength);	
	//dummy read 		
	wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
	wrport(net_inf.net_ifaddr+RSAR0_Add,0);
	wrport(net_inf.net_ifaddr+RBCR1_Add,0);
	wrport(net_inf.net_ifaddr+RBCR0_Add,2);
	crda0 = rdport(net_inf.net_ifaddr+CRDA0_Add);
	wrport(net_inf.net_ifaddr+CR_Add,0x0a);
	for(i=0;i<1000;i++){
		if( crda0 != rdport(net_inf.net_ifaddr+CRDA0_Add))
			break;
	}
	if(i==1000)
		return FALSE;
	//Ready the packet
	wrport(net_inf.net_ifaddr+RSAR1_Add,TPSR_data);
	wrport(net_inf.net_ifaddr+RSAR0_Add,0);	
	wrport(net_inf.net_ifaddr+RBCR1_Add,aLength>>8);
	wrport(net_inf.net_ifaddr+RBCR0_Add,aLength);
	wrport(net_inf.net_ifaddr+CR_Add,0x12);
	for(i=0;i<aLength;i++){
		wrport(net_inf.net_ifaddr+REMOTE_DMA_PORT,*pbuffer++);
	}  	
	//Transmit the packet
	wrport(net_inf.net_ifaddr+RBCR1_Add,0x0f);
	wrport(net_inf.net_ifaddr+TBCR1_Add,aLength>>8);
	wrport(net_inf.net_ifaddr+TBCR0_Add,aLength);
	wrport(net_inf.net_ifaddr+CR_Add,0x16);
	return TRUE;	   	
}

//-----------------------------------------------------------------
Uint16 ethernet_receive(Uint8 *pBuffer)
{
	Uint16 i,length;
	Uint8 next_pkt,curr,bnry;
	// get packet
	i = rdport(net_inf.net_ifaddr+ISR_Add);
	i = rdport(net_inf.net_ifaddr+CR_Add);
	next_pkt = rdport(net_inf.net_ifaddr+BNRY_Add);
	next_pkt++;
	if(next_pkt>=PSTOP_data)
		next_pkt = PSTART_data;
	//Get curr
	wrport(net_inf.net_ifaddr+CR_Add,0x62);
	curr = rdport(net_inf.net_ifaddr+CURR_Add);	
	wrport(net_inf.net_ifaddr+CR_Add,0x22);	
	//If has not new packet
	if(next_pkt==curr){
		wrport(net_inf.net_ifaddr+ISR_Add,0x10);  	
		return 0;
	}
	//read header		
	wrport(net_inf.net_ifaddr+RSAR1_Add,next_pkt);
	wrport(net_inf.net_ifaddr+RSAR0_Add,0);
	wrport(net_inf.net_ifaddr+RBCR1_Add,0);
	wrport(net_inf.net_ifaddr+RBCR0_Add,4);
	wrport(net_inf.net_ifaddr+CR_Add,0x0a);
	bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
	bnry = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
	length = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
	i = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
	length |= i<<8;
	length=Min(length,ETHER_BUFFER_LEN);
	//read content
	wrport(net_inf.net_ifaddr+RSAR0_Add,4); 
	wrport(net_inf.net_ifaddr+RBCR1_Add,length>>8);
	wrport(net_inf.net_ifaddr+RBCR0_Add,length);
	wrport(net_inf.net_ifaddr+CR_Add,0x0a);
	for(i=0;i<length;i++){	
		*pBuffer++ = rdport(net_inf.net_ifaddr+REMOTE_DMA_PORT);
	}
	bnry--;
	if(bnry<PSTART_data)
		bnry=PSTOP_data;
	if(bnry>PSTOP_data)
		bnry=PSTOP_data;	
	wrport(net_inf.net_ifaddr+BNRY_Add,bnry);	
//	if(rdport(net_inf.net_ifaddr+ISR_Add)&0x10)
//		wrport(net_inf.net_ifaddr+ISR_Add,0x10);
	return length;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -