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

📄 rtl8019.c

📁 51单片机下的RTL8019网络芯片的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:

	/* wait for last time trasmition to complete */
	while((ReadReg(CR) & CR_TXP) == CR_TXP);

	/* write trasmit start page and size */
	RTLPage(0);
	WriteReg(TPSR_WPAGE0,StartPage);	/* TPSR */
	WriteReg(TBCRL_WPAGE0,(unsigned char)size);/*low */
	WriteReg(TBCRH_WPAGE0,(unsigned char)((size>>8)&0x00ff));	/*high*/
	WriteReg(CR,((PrePage&0xC0) | CR_ABORT_COMPLETE_DMA | CR_TXP | CR_START_COMMAND));

	InSending = FALSE;
	return TRUE;
}

/* call this function to receive a ethernet packet from RTL8019.
return value:
	NULL: no packet can receive yet.
	not NULL:
		a address point to MemHead. This Head contain merory
		Imformation(memory start address, memory end address ...) of
		received packet. Memory is allocated by function 'MemAllocate(unsigned int size)'.
		a example of struct SMemHead is:

		struct SMemHead
		{
			unsigned char used;						// if in using
			unsigned char xdata *pStart;			// the start address of memory
			unsigned char xdata *pEnd;
		};

		You can use your own struct SMemHead and MemAllocat function in your project.
*/
struct SMemHead xdata * RTLReceivePacket() reentrant
{
	unsigned char curr,bnry;
	unsigned int address;
	unsigned int PacketSize;
	struct SMemHead xdata *MemHead;

	/* if send is running don't crrupt RTL register*/
	if(InSending == TRUE)
		return NULL;

	MemHead = NULL;

	RTLPage(1);
	curr = ReadReg(CURR_RPAGE1);
	RTLPage(0);

	/* check if startpage exceed range becasue of unknow error */
	if(StartPageOfPacket >= RECEIVE_STOP_PAGE || StartPageOfPacket < RECEIVE_START_PAGE)
	{
		/* use curr as the StartPageOfPacket in this case */
		StartPageOfPacket = curr;
		return NULL;
	}

	/* check if there is packets to read */
	if(StartPageOfPacket == curr)
		return NULL;

	/*
	 * read a packet
	 */

	/* read packet head imformation */
	address = ((unsigned int)StartPageOfPacket)<<8;
	RTLReadRam(address,4,Head);

	/* check rsr, if isn't a good packet no read */
	if(Head[0] & RSR_RECEIVE_NO_ERROR)
	{
		/* this is a good packet */

		/* packet size, sub 4 bytes, this 4 byte is MAC checksum */
		PacketSize = ((unsigned int)Head[3])*256 + Head[2] - 4;

		/* allocate buffer and read packet into buffer */
		if((MemHead = MemAllocate(PacketSize)) != NULL)
		{
			/* if packet is put from bnry+1 to receive_stop_page and receive
			   start page to next packet startpage, that is if bnry+1 > next
			   packet start page and next start page != receive_start_page,
			   we need read by two times. the first time from bnry+1 to receive
			   _stop_page, the second time from receive start page to next packet
			   startpage.
			*/
			address += 4;
			if(StartPageOfPacket > Head[1] && Head[1] != RECEIVE_START_PAGE)
			{
				RTLReadRam(address,(unsigned int)((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address),MemHead->pStart);	/* read from rtl */
				RTLReadRam((unsigned int)(((unsigned int)RECEIVE_START_PAGE)<<8),(unsigned int)(PacketSize - ((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address)),
					MemHead->pStart + ((((unsigned int)RECEIVE_STOP_PAGE)<<8) - address));	/* read from rtl */
			}
			else
			{
				RTLReadRam(address,PacketSize,MemHead->pStart);	/* read from rtl */
			}

		}
	}

	/* get next packet start page */
	StartPageOfPacket = Head[1];

	/* reset bnry */
	bnry = StartPageOfPacket - 1;
	if(bnry < RECEIVE_START_PAGE)
		bnry = RECEIVE_STOP_PAGE - 1;
	WriteReg(BNRY_WPAGE0,bnry);

	return MemHead;
}

//ARP Test
unsigned char xdata TestPacket[42];
void RTL8019SendPacketTest()
{
/* send a arp request packet, src ip = 192.168.2.13, dest ip = 192.168.2.14,
if you config your computer's ip as 192.168.2.14, then after run this function,
your computer will receive the packet, and when you type "arp -a" in windows
command window(dos window) you will see a arp entry of 52 54 4c 30 2e 2f.
this indicate a packet has been successful sent
*/
        /* this is a arp broad cast packet */
        //Dest MAC
        TestPacket[0] = 0xff;
        TestPacket[1] = 0xff;
        TestPacket[2] = 0xff;
        TestPacket[3] = 0xff;
        TestPacket[4] = 0xff;
        TestPacket[5] = 0xff;
        //Scr MAC
        TestPacket[6] = 0x52;
        TestPacket[7] = 0x54;
        TestPacket[8] = 0x4c;
        TestPacket[9] = 0x30;
        TestPacket[10] = 0x2e;
        TestPacket[11] = 0x2f;
        //Type:arp
        TestPacket[12] = 0x08;
        TestPacket[13] = 0x06;

        TestPacket[14] = 0x00;
        TestPacket[15] = 0x01;
        TestPacket[16] = 0x08;
        TestPacket[17] = 0x00;
        TestPacket[18] = 0x06;
        TestPacket[19] = 0x04;
        TestPacket[20] = 0x00;
        TestPacket[21] = 0x01;

        /* ARPPacket->IPDestAddr = DestIP:192.168.1.62;*/
        TestPacket[22] = 0xc0;
        TestPacket[23] = 0xa8;
        TestPacket[24] = 0x01;
        TestPacket[25] = 0x3d;

        /* ARPPacket->IPScrAddr = NetIf->IPAddr:192.168.1.3; */
        TestPacket[26] = 0xc0;
        TestPacket[27] = 0xa8;
        TestPacket[28] = 0x01;
        TestPacket[29] = 0x03;

        /* MemCopy(ARPPacket->EtherDestAddr,EtherAddrAny,ETHER_ADDR_LEN); */
        TestPacket[30] = 0xFF;
        TestPacket[31] = 0xFF;
        TestPacket[32] = 0xFF;
        TestPacket[33] = 0xFF;
        TestPacket[34] = 0xFF;
        TestPacket[35] = 0xFF;

        TestPacket[36] = 0x52;
        TestPacket[37] = 0x54;
        TestPacket[38] = 0x4c;
        TestPacket[39] = 0x30;
        TestPacket[40] = 0x2e;
        TestPacket[41] = 0x2f;
        RTLSendPacket(TestPacket, 64);
}



void RTL8019RegTest()
{
        //unsigned char tmp;
        unsigned char i = 0;
        unsigned char chTmp = 0;

        //unsigned char xdata buff1[20] = "abcdefghijklmnopqrs";
        //xdata unsigned char buff2[20];


        //测试对RTL8019内部RAM读写是否正常
        //RTLWriteRam((unsigned int)(((unsigned int)SEND_START_PAGE0)<<8),20,buff1);
        //RTLReadRam(SEND_START_PAGE0 ,20,buff2);


        P35 = 1;
	//for(i = 0;i < 40000;i++);
	P35 = 0;
	delay(100);//for(i = 0;i < 4000;i++);

	/* reset: write to reset prot */
        WriteReg(0x1f,0xdd);
        //chRTLInitTmp = ReadReg(0x1f);
        delay(100);//for(i = 0;i < 2000;i++);

	/* init RTL registers*/
	WriteReg(0x00,0x21);
        //chRTLInitTmp = ReadReg(0x00);




         //测试对RTL8019内部寄存器的读写是否正常
         while(chTmp <= 0xff)
         {
              //1
              for(i = 0;i < 6;i ++)
              {
                XBYTE[0x7a00 + chTmp + i] = 0;
                XBYTE[0x7a00 + chTmp + i + 1] = 0;
                XBYTE[0x7a00 + chTmp + i + 2] = 0;
                XBYTE[0x7a00 + chTmp + i + 3] = 0;
                XBYTE[0x7a00 + chTmp + i + 4] = 0;
                XBYTE[0x7a00 + chTmp + i + 5] = 0;
                RTLPage(1);
                WriteReg(0x01,0x4c);
                WriteReg(0x02,0x54);
	        WriteReg(0x03,0x52);
                WriteReg(0x04,0x4c);
                WriteReg(0x05,0x54);
	        WriteReg(0x06,0x52);
                XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
                XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
                XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
                XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
                XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
                XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
                chTmp ++;
               }

               //2
              for(i = 0;i < 6;i ++)
              {
                XBYTE[0x7a00 + chTmp + i] = 0;
                XBYTE[0x7a00 + chTmp + i + 1] = 0;
                XBYTE[0x7a00 + chTmp + i + 2] = 0;
                XBYTE[0x7a00 + chTmp + i + 3] = 0;
                XBYTE[0x7a00 + chTmp + i + 4] = 0;
                XBYTE[0x7a00 + chTmp + i + 5] = 0;
                RTLPage(1);
                WriteReg(0x01,0x4c);
                WriteReg(0x02,0x54);
	        WriteReg(0x03,0x52);
                WriteReg(0x04,0x4c);
                WriteReg(0x05,0x54);
	        WriteReg(0x06,0x52);
                XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
                XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
                XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
                XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
                XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
                XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
                chTmp ++;
               }

               //3
              for(i = 0;i < 6;i ++)
              {
                XBYTE[0x7a00 + chTmp + i] = 0;
                XBYTE[0x7a00 + chTmp + i + 1] = 0;
                XBYTE[0x7a00 + chTmp + i + 2] = 0;
                XBYTE[0x7a00 + chTmp + i + 3] = 0;
                XBYTE[0x7a00 + chTmp + i + 4] = 0;
                XBYTE[0x7a00 + chTmp + i + 5] = 0;
                RTLPage(1);
                WriteReg(0x01,0x4c);
                WriteReg(0x02,0x54);
	        WriteReg(0x03,0x52);
                WriteReg(0x04,0x4c);
                WriteReg(0x05,0x54);
	        WriteReg(0x06,0x52);
                XBYTE[0x7a00 + chTmp + i] = ReadReg(0x01);
                XBYTE[0x7a00 + chTmp + i + 1] = ReadReg(0x02);
                XBYTE[0x7a00 + chTmp + i + 2] = ReadReg(0x03);
                XBYTE[0x7a00 + chTmp + i + 3] = ReadReg(0x04);
                XBYTE[0x7a00 + chTmp + i + 4] = ReadReg(0x05);
                XBYTE[0x7a00 + chTmp + i + 5] = ReadReg(0x06);
                chTmp ++;
               }





           }
}

⌨️ 快捷键说明

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