我改进过的RTL8019AS部分,你可以看看
#include "config.h"<br />#include "LPC2294.h"<br />#include "general.h"<br /><br />#define INT_N 0x00000080<br />#define NET_RST 0x00000040<br />#define NET_BASE_ADDR 0x83400000<br /><br />//{0x52,0x54,0x4c,0x19,0xf7,0x42}<br /><br />#define The_PAR0 0x52<br />#define The_PAR1 0x54<br />#define The_PAR2 0x4C<br />#define The_PAR3 0x19<br />#define The_PAR4 0xF7<br />#define The_PAR5 0x42<br /><br />uint8 Tx_Buff_Page = 0x46;<br /><br />void WriteToNet(uint8 ADDR_16, uint16 WRITEDATA)<br />{<br /> (*((volatile unsigned short *)NET_BASE_ADDR + ADDR_16)) = WRITEDATA; //0x83400000<br /> <br /> return; <br />}<br /><br />uint16 ReadFromNet(uint8 ADDR_16)<br />{<br /> uint16 temp_uint16;<br /><br /> temp_uint16 = (*((volatile unsigned short *)NET_BASE_ADDR + ADDR_16)); //0x83400000<br /><br /> return temp_uint16;<br />}<br /><br />void SetPage(uint8 pagenumber) <br />{<br /> uint8 temp_uint8;<br /><br /> temp_uint8 = ReadFromNet(0); //command register<br /> temp_uint8 = temp_uint8 & 0x3B; //注意txp位不能要<br /> pagenumber = pagenumber << 6;<br /> temp_uint8 = temp_uint8 | pagenumber;<br /> WriteToNet(0, temp_uint8);<br /><br /> return;<br />}<br /><br />void InitNic(void) <br />{<br /> int temp_i;<br /> <br /> PINSEL0 = PINSEL0 & ~0x0000F000;<br /> IO0DIR = (IO0DIR & ~INT_N) | NET_RST;<br /> <br /> IO0CLR = NET_RST;<br /> for (temp_i = 0; temp_i < 40000; temp_i++);<br /><br /> IO0SET = NET_RST;<br /> for (temp_i = 0; temp_i < 40000; temp_i++);<br /><br /> IO0CLR = NET_RST;<br /> for (temp_i = 0; temp_i < 40000; temp_i++);<br /><br /> //WriteToNet(0x1F, 0x00); <br /> //for (temp_i = 0; temp_i < 40000; temp_i++);<br /> <br /> WriteToNet(0x00, 0x21); //使芯片处于停止模式,这时进行寄存器设置 <br /> for (temp_i = 0; temp_i < 40000; temp_i++);<br /><br /> SetPage(0);<br /> /////////////////////////////////////////////<br /> WriteToNet(0x0F, 0x00);<br /> WriteToNet(0x07, 0xFF);<br /> ///////////////////////////////////<br /> WriteToNet(0x0E, 0xCB); //DCR ???<br /> WriteToNet(0x0C, 0xE0); //RCR ???<br /> WriteToNet(0x0D, 0xE0); //TCR ???<br /> ///////////////////////////////////<br /> WriteToNet(0x01, 0x4C);<br /> WriteToNet(0x02, 0x80);<br /> WriteToNet(0x03, 0x4C);<br /><br /> WriteToNet(0x09, 0x40);<br /> WriteToNet(0x08, 0x00);<br /> WriteToNet(0x0B, 0x00);<br /> WriteToNet(0x0A, 0x00);<br /><br /> WriteToNet(0x04, 0x40);<br /> WriteToNet(0x06, 0x00);<br /> WriteToNet(0x05, 0x00);<br /> /////////////////////////////////////////////<br /> SetPage(1);<br /> /////////////////////////////////////////////<br /> WriteToNet(0x07, 0x4D);<br /> ///////////////////////////////////<br /> WriteToNet(0x01, The_PAR0);<br /> WriteToNet(0x02, The_PAR1);<br /> WriteToNet(0x03, The_PAR2);<br /> WriteToNet(0x04, The_PAR3);<br /> WriteToNet(0x05, The_PAR4);<br /> WriteToNet(0x06, The_PAR5);<br /> ///////////////////////////////////<br /> WriteToNet(0x08, 0x00);<br /> WriteToNet(0x09, 0x00);<br /> WriteToNet(0x0A, 0x00);<br /> WriteToNet(0x0B, 0x00);<br /> WriteToNet(0x0C, 0x00);<br /> WriteToNet(0x0D, 0x00);<br /> WriteToNet(0x0E, 0x00);<br /> WriteToNet(0x0F, 0x00);<br /> /////////////////////////////////////////////<br /> SetPage(0);<br /> WriteToNet(0x0C, 0xC4); //RCR ???<br /> WriteToNet(0x07, 0xFF);<br /> WriteToNet(0x00, 0x22);<br /><br /> Tx_Buff_Page = 0x46;<br /><br /> return; <br />}<br /><br />void Send_Packet(uint16 * buf, uint32 len) <br />{<br /> uint32 temp_len;<br /> int temp_i, temp_j;<br /><br /> if (len < 60)<br /> len = 60;<br /> if (len & 1)<br /> len++;<br /> temp_len = len >> 1;<br /> if (Tx_Buff_Page == 0x40)<br /> Tx_Buff_Page = 0x46;<br /> else<br /> Tx_Buff_Page = 0x40;<br /><br /> SetPage(0); //切换至第0页<br /><br /> WriteToNet(0x09, Tx_Buff_Page); //设置发送页地址 <br /> WriteToNet(0x08, 0x00); //写入RSAR0<br /> WriteToNet(0x0b, len >> 8); //写入RSCR1<br /> WriteToNet(0x0a, len & 0xFF); //写入RSCR0<br /> WriteToNet(0x00, 0x12); //启动DMA写write dma, page0<br /><br /> for (temp_i = 0; temp_i < temp_len; temp_i++)<br /> WriteToNet(0x10, *buf++);<br /> <br /> WriteToNet(0x0b, 0x00); <br /> WriteToNet(0x0a, 0x00);<br /> WriteToNet(0x00, 0x22); //结束或放弃DMA操作<br /> <br /> WriteToNet(0x04, Tx_Buff_Page); //txd packet start; <br /> WriteToNet(0x06, len >> 8); //high byte counter<br /> WriteToNet(0x05, len & 0xFF); //low byte counter<br /><br /> WriteToNet(0x07, 0xFF);<br /> WriteToNet(0x00, 0x3E); //to sendpacket;<br /> <br /> for (temp_i = 0; temp_i < 6; temp_i++) //最多重发6次<br /> {<br /> for (temp_j = 0; temp_j < 1000; temp_j++)<br /> {<br /> if ((ReadFromNet(0) & 0x04) == 0) //检查CR寄存器的txp位是否为低,为1说明正在发送,为0说明发完或出错放弃 <br /> break;<br /> }<br /><br /> if (ReadFromNet(0x04) & 0x01) //表示发送成功,判断发送状态寄存器TSR,决定是否出错<br /> break;<br /><br /> WriteToNet(0x00,0x3E); //to sendpacket;<br /> }<br /> <br /> WriteToNet(0x07, 0xFF);<br /> <br /> return;<br />}<br /><br />int Rec_Packet(uint16 * buf) <br />{<br /> uint8 temp_BNRY, temp_CURR;<br /> uint16 temp_buf0, temp_buf1;<br /> uint32 temp_len;<br /> uint8 temp_uint8;<br /> int temp_i;<br /><br /> SetPage(0);<br /> <br /> /*<br /> temp_uint8 = ReadFromNet(0x07); //读取中断状态<br /> if (temp_uint8 & 0xAC)<br /> {<br /> InitNic();<br /> return -1;<br /> }<br /> */<br /><br /> temp_BNRY = ReadFromNet(0x03); //bnry page have read 读页指针<br /> SetPage(1);<br /> temp_CURR = ReadFromNet(0x07); //curr writepoint 8019写页指针<br /> SetPage(0);<br /><br /> temp_BNRY++; //bnry++;<br /> if (temp_BNRY > 0x7F)<br /> temp_BNRY = 0x4C;<br /> <br /> if (temp_BNRY != temp_CURR) //此时表示有新的数据包在缓冲区里<br /> {<br /> WriteToNet(0x09, temp_BNRY); //RSAR1写入读页地址的高字节<br /> WriteToNet(0x08, 0x00); //RSAR0写入读页地址的低字节<br /> WriteToNet(0x0b, 0x00); //RSCR1写入读取字节计数高字节<br /> WriteToNet(0x0a, 0x04); //RSCR0写入读取字节计数低字节<br /> WriteToNet(0x00, 0x0a); //启动Remote DMA读操作<br /><br /> temp_buf0 = ReadFromNet(0x10);<br /> temp_buf1 = ReadFromNet(0x10);<br /><br /> WriteToNet(0x0b,0x00); //RSCR1写入读取字节计数高字节<br /> WriteToNet(0x0a,0x00); //RSCR0写入读取字节计数高字节<br /> WriteToNet(0x00,0x22); //结束或放弃DMA操作<br /><br /> temp_buf1 = temp_buf1 - 4;<br /> if (((temp_buf0 & 0x0001) == 0) || <br /> ((temp_buf0 & 0xFF00) < 0x4C00) ||<br /> ((temp_buf0 & 0xFF00) > 0x7F00) ||<br /> ( temp_buf1 > 0x0600))<br /> {<br /> SetPage(1);<br /> temp_CURR = ReadFromNet(0x07); //page1读取CURR的值<br /> SetPage(0); //切换回page0<br /> temp_BNRY = temp_CURR - 1; //把bnry恢复为下16K中的空余部分<br /> if (temp_BNRY < 0x4C) <br /> temp_BNRY = 0x7F;<br /> WriteToNet(0x03, temp_BNRY); //把BNRY恢复到指向下一帧write to bnry <br /> WriteToNet(0x07, 0xFF); //清除中断标志<br /><br /> return -1;<br /> }<br /> else //表示数据包是完好的.读取剩下的数据<br /> {<br /> WriteToNet(0x09, temp_BNRY); //RSAR1写入读页地址的高字节//read page address high<br /> WriteToNet(0x08, 0x04); //RSAR0写入读页地址的低字节//read page address low<br /> WriteToNet(0x0b, temp_buf1 >> 8); //RSCR1写入读取字节计数高字节//read count high<br /> WriteToNet(0x0a, temp_buf1 & 0xFF); //RSCR0写入读取字节计数低字节//read count low;<br /> WriteToNet(0x00, 0x0a); //启动Remote DMA读操作<br /> <br /> temp_len = temp_buf1 / 2;<br /> for (temp_i = 0; temp_i < temp_len; temp_i++)<br /> *buf++ = ReadFromNet(0x10);<br /><br /> WriteToNet(0x0b,0x00); //RSCR1写入读取字节计数高字节//read count high <br /> WriteToNet(0x0a,0x00); //RSCR0写入读取字节计数高字节//read count low;<br /> WriteToNet(0x00,0x22); //结束或放弃DMA操作//结束或放弃DMA<br /><br /> temp_BNRY = (temp_buf0 >> 8) - 1;<br /> if (temp_BNRY < 0x4C)<br /> temp_BNRY = 0x7F;<br /> WriteToNet(0x03, temp_BNRY);<br /> WriteToNet(0x07, 0xFF);<br /><br /> return temp_buf1;<br /> }<br /> }<br /> else<br /> return 0;<br />}<br />
|
|