📄 rtl8019as_m128.c
字号:
#include "Rtl8019as_M128.h"
//* Initialize the RTL8019AS
void Rtl8019_Init(void)
{
//地址端口初始化
RTL8019_ADDR_DDR = RTL8019_ADDR_PINS;
RTL8019_ADDR_PORT = 0;
//数据端口初始化
RTL8019_DATA_DDR = 0;
RTL8019_DATA_PORT = 0xff;
//中断端口初始化
RTL8019_INT_DDR &= ~(1<<INT0_PIN);
RTL8019_INT_PORT |= (1<<INT0_PIN);
//控制端口初始化
RTL8019_CTRL_DDR |= (1<<IORB_PIN) | (1<<IOWB_PIN);
RTL8019_CTRL_PORT |= (1<<IORB_PIN) | (1<<IOWB_PIN);
RTL8019_CTRL_DDR |= (1<<RSTDRV_PIN) ;
//硬复位RTL8019
RTL8019_CTRL_PORT |= (1<<RSTDRV_PIN) ;
Delay_nms_Preci(10);
RTL8019_CTRL_PORT &= ~(1<<RSTDRV_PIN) ;
Delay_nms_Preci(5); // Delay time > 1.6 ms
//软复位RTL8019 (这里注释掉, 再测试看)
Rtl8019_WriteData( RSTPORT, Rtl8019_ReadData(RSTPORT) )
Delay_nms_Preci(5); // Delay time > 1.6 ms
//检查复位是否成功
if ( !( Rtl8019_ReadData(RSTPORT) & RST) )
{
while (1)
{
//printf("RTL8019AS INIT FAILED!\r\n");
Delay_nms_Preci(1000);
}
}
//Rtl8019_WriteData( CR, 0x21 );
Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_STOP); //设置Page0, 结束DMA的读写操作,并使芯片处于停止模式,
//停止模式下,将不会发送和接收数据包
Delay_nms_Preci(5); // Delay time >= 2 ms
Rtl8019_WriteData(DCR, DCR_FT10 + DCR_ARM + DCR_BMS); //设置FIFO寄存器,设置数据传送方式
Rtl8019_WriteData(RBCR0, 0); //要读取的字节数的计数(低8位)
Rtl8019_WriteData(RBCR1, 0); //要读取的字节数的计数(高8位)
Rtl8019_WriteData(RCR, RCR_BCST); //接收寄存器配置,可接收广播地址的数据包
Rtl8019_WriteData(TPSR, TXSTART); //设置发送页的起始页地址0X40 (如果发送第2个缓冲区,则设TPSR为0x46)
//网卡有16K RAM,地址为0x4000-0x7fff,页地址为0x40--0x7f
Rtl8019_WriteData(TCR, TCR_LB01); //发送寄存器配置,Internal Lookback ,append crc
Rtl8019_WriteData(PSTART, RXSTART); //接收缓冲区起始页
Rtl8019_WriteData(BNRY, RXSTART); //下一次将要去读取的页
Rtl8019_WriteData(PSTOP, RXSTOP); //接收缓冲区结束页
Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_STOP); //设置Page0, 结束DMA的读写操作,并使芯片处于停止模式,
//停止模式下,将不会发送和接收数据包
Rtl8019_WriteData(CR, CR_PAGE1 + CR_NODMA + CR_STOP); //设置Page1
Rtl8019_WriteData(CURR, RXSTART); //当前要写入的页
for(i=0;i<6;++i)
Rtl8019_WriteData(PAR0+i, nodLoc.cMac[i]);
Rtl8019_WriteData(CR, CR_PAGE0 + CR_NODMA + CR_START); //设置Page0, 结束DMA的读写操作,并启动8019芯片
Rtl8019_WriteData(ISR,0xFF); //清除所有中断标志
Rtl8019_WriteData(IMR,ISR_ALL); //屏蔽所有中断
Rtl8019_WriteData(TCR, TCR_LB00); //Normal Operation
}
void Rtl8019_SetPage(unsigned char cPage)
{
unsigned char cTemp;
cTemp = CR;
cTemp = cTemp & 0x3B; //注意不是0x3F ,TXP位在平时一定要置为0.
cTemp = cTemp | (cPage << 6);
CR = cTemp;
}
/*
//******************************************************************
//* Write to NIC Control Register
//******************************************************************
void write_rtl(unsigned int regaddr, unsigned int regdata)
{
rtladdr = regaddr;
rtldata = regdata;
tortl;
nop;
clr_iow_pin;
nop;
set_iow_pin;
nop;
fromrtl;
PORTA = 0xFF;
}
//******************************************************************
//* Read From NIC Control Register
//******************************************************************
void read_rtl(unsigned int regaddr)
{
fromrtl;
PORTA = 0xFF;
rtladdr = regaddr;
clr_ior_pin;
nop;
byte_read = PINA;
nop;
set_ior_pin;
nop;
}
//******************************************************************
//* Handle Receive Ring Buffer Overrun
//* No packets are recovered
//******************************************************************
void overrun()
{
read_rtl(CR);
data_L = byte_read;
write_rtl(CR,0x21);
delay_ms(2);
write_rtl(RBCR0,0x00);
write_rtl(RBCR1,0x00);
if(!(data_L & 0x04))
resend = 0;
else if(data_L & 0x04)
{
read_rtl(ISR);
data_L = byte_read;
if((data_L & 0x02) || (data_L & 0x08))
resend = 0;
else
resend = 1;
}
write_rtl(TCR,0x02);
write_rtl(CR,0x22);
write_rtl(BNRY,rxstart);
write_rtl(CR,0x62);
write_rtl(CURR,rxstart);
write_rtl(CR,0x22);
write_rtl(ISR,0x10);
write_rtl(TCR,tcrval);
}
//******************************************************************
//* Echo Packet Function
//* This routine does not modify the incoming packet size and
//* thus echoes the original packet structure.
//******************************************************************
void SendNetPacket()
{
write_rtl(CR,0x22);
write_rtl(TPSR,txstart);
write_rtl(RSAR0,0x00);
write_rtl(RSAR1,0x40);
write_rtl(ISR,0xFF);
write_rtl(RBCR0,pageheader[enetpacketLenL] - 4 );
write_rtl(RBCR1,pageheader[enetpacketLenH]);
write_rtl(CR,0x12);
txlen = make16(pageheader[enetpacketLenH],pageheader[enetpacketLenL]) - 4;
for(i=0;i<txlen;++i)
write_rtl(RDMAPORT,packet[enetpacketDest0+i]);
byte_read = 0;
while(!(byte_read & RDC))
read_rtl(ISR);
write_rtl(TBCR0,pageheader[enetpacketLenL] - 4);
write_rtl(TBCR1,pageheader[enetpacketLenH]);
write_rtl(CR,0x24);
}
//******************************************************************
//* 功能:从以太网络取得数据包 ()
//* 包括UDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -