基于51單片機(jī)RTL8019AS的網(wǎng)卡驅(qū)動(dòng)程序
page(0);本文引用地址:http://www.ex-cimer.com/article/172229.htm
reg0a=0x00;
reg0b=0x00;
reg0c=0xE0; //monitor mode (no packet receive)
reg0d=0xE2; //loop back mode
//使用0x40-0x4B為網(wǎng)卡的發(fā)送緩沖區(qū),共12頁,剛好可以存儲2個(gè)最大的以太網(wǎng)包。
//使用0x4c-0x7f為網(wǎng)卡的接收緩沖區(qū),共52頁。
reg01=0x4C; //Pstart 接收緩沖區(qū)范圍
reg02=0x80; //Pstop
reg03=0x4C; //BNRY
reg04=0x40; //TPSR 發(fā)送緩沖區(qū)范圍
reg07=0xFF;/*清除所有中斷標(biāo)志位*/
reg0f=0x00;//IMR disable all interrupt
reg0e=0xC8; //DCR byte dma 8位dma方式
page(1); //選擇頁1的寄存器
reg07=0x4D; //CURR
reg08=0x00; //MAR0
reg09=0x41; //MAR1
reg0a=0x00; //MAR2
reg0b=0x80; //MAR3
reg0c=0x00; //MAR4
reg0d=0x00; //MAR5
reg0e=0x00; //MAR6
reg0f=0x00; //MAR7
initNIC(); //初始化MAC地址和網(wǎng)絡(luò)相關(guān)參數(shù)
//將網(wǎng)卡設(shè)置成正常的模式,跟外部網(wǎng)絡(luò)連接
page(0);
reg0c=0xCC; //RCR
reg0d=0xE0; //TCR
reg00=0x22; //這時(shí)讓芯片開始工作?
reg07=0xFF; //清除所有中斷標(biāo)志位
}
void send_packet(union netcard *txdnet,unsigned int length)//ne2000發(fā)包子程序
{//發(fā)送一個(gè)數(shù)據(jù)包的命令,長度最小為60字節(jié),最大1514字節(jié)需要發(fā)送的數(shù)據(jù)包要先存放在txdnet緩沖區(qū)
unsigned char i;
unsigned int ii;
page(0);
if(length60) length=60;
for(i=0;i3;i++)
txdnet->etherframe.sourcenodeid[i]=my_ethernet_address.words[i];
txd_buffer_select=!txd_buffer_select;
if(txd_buffer_select)
reg09=0x40 ; //txdwrite highaddress
else
reg09=0x46 ; //txdwrite highaddress
reg08=0x00; //read page address low
reg0b=length>>8; //read count high
reg0a=length0xFF; //read count low;
reg00=0x12; //write dma, page0
for(ii=4;ii reg10=txdnet->bytes.bytebuf[ii];
for(i=0;i6;i++){ //最多重發(fā)6次
for(ii=0;ii1000;ii++) //檢查txp為是否為低
if((reg000x04)==0) break;
if((reg040x01)!=0) break; //表示發(fā)送成功
reg00=0x3E;
評論