📄 net_main.c.bak
字号:
//#include "excalibur.h"
//#include <stdio.h>
#include "net_main.h"
#include "net_arp.c" //ARP处理程序
#include "net_ping.c" //Ping回应处理程序
#include "net_head.c" //首部处理程序
#include "net_tcp.c" //tcp处理程序
#include "net_http.c" //http应用处理程序
#include "F2812_DataType.h"
#include "F2812_Reg.h"
#define DMA_DATA_BUF 1//1 0:8Bit 1:16Bit
//#include "DSP281x_Device.h" // DSP281x Headerfile Include File
//extern unsigned int *P_ext;
//#define NET_Write_Data(m_Addr,m_Data) P_ext[m_Addr+0x0300]=m_Data
//#define NET_Read_Data(m_Addr) (P_ext[m_Addr+0x0300]&0xff)
#define REVPAGE 0x4c
extern void ClearGpio(void);
extern void SetGpio(void);
int net_main(void)
{
//UINT i=0;
//UINT Coun_PACK=0;
//ClearGpio();
//SetGpio();
Init_system(); //系统初始化
Init_NET(); //8019初始化
//NET_CLEAR_Data(); //清除8019的原始数据
//SET_PAGE0; //停止8019的DMA操作,页面设置为0
NET_Write_Data(0x0000,0x00);
//printf("RTL8019AS ID0 is 0x%x\n",NET_ID(0)&0xff); //8019的ID
//printf("RTL8019AS ID1 is 0x%x\n",NET_ID(1)&0xff);
//NET_Send_Packet(TEST_ARP,sizeof(TEST_ARP)); //发送地址解析协议包
//printf("%d\n",sizeof(html_header));
//printf("%s\n",html_header);
//printf("复位完成,等待接收数据包\n");
while(1)
{
NET_Wait_PACK(); //等待收到新的数据
//printf("收到数据包 %d\n",++Coun_PACK);
//printf("BURY=%x CURR=%X\n",BURY_Data,CURR_Data);
//NET_Receive_PACK(); //接收一页数据包到缓冲区DMA_Buffer
/*
for(j=0;j<8;j++)
{
for(k=0;k<8;k++)
printf("%2d = %2x ",j*8+k,DMA_Buffer[j*8+k]);
printf("\n");
}
*/
//for(i=0;i<256-4;i++) //将一页数据写入接收缓冲区
//Receive_Buffer[i]=DMA_Buffer[i+4];
//PACK_Type=Receive_Buffer[12]*256+Receive_Buffer[13]; //数据包类型
//printf("数据包类型 %4x\n",PACK_Type);
if (PACK_Type==PACK_ARP) //ARP协议包
if(m_Data_Compare(Receive_Buffer,14+28-4,IP_Addr,0,4)==0) //目标地址是本地
{
printf("收到ARP包\n");
IP_ARP(); //返回ARP包
}
if (PACK_Type==PACK_IP) //IP协议包
if(m_Data_Compare(Receive_Buffer,0,MAC_Addr,0,6)==0) //目标MAC地址是本地
{
//printf("IP协议包\n");
if(Receive_Buffer[14+9]==1) //ICMP协议包
{
//printf("ICMP协议包\n");
if(Receive_Buffer[14+20+0]==8) //ICMP的请求回显(Ping请求)
{
//printf("ICMP的请求回显(Ping请求)数据包\n");
Revert_Ping();
}
}
if(Receive_Buffer[14+9]==6) //TCP协议数据包
{
//printf("收到TCP协议数据包\n");
IP_TCP();
}
}
}
}
void Delay(u16 m_Delay) //延时子程序
{
while(m_Delay--);
}
void NET_Write_Data(u16 m_Addr,u8 m_Data) //8019写一个数据的时序
{
P_ext[0x0300+m_Addr]=m_Data&0xff;
}
u8 NET_Read_Data(u16 m_Addr) //8019读一个数据的时序
{
u8 m_Data;
m_Data=P_ext[0x0300+m_Addr]&0xff;
return m_Data;
}
void NET_Page_Set(u16 m_Page) //设定当前页面
{
//页面寄存器 任何页 00单元(CR) 7,6位(PS1,PS0) 另 2位为‘0’
u16 Temp;
Temp=NET_Read_Data(0x0000);
Temp=Temp&0x003B; //注意不是0x3F ,TXP位在平时一定要置为0.
m_Page=m_Page<<6;
Temp=Temp|m_Page;
NET_Write_Data(0x0000,Temp);
}
u16 NET_ID(u8 m_Num) //获得8019的ID
{
//ID号在0页的,0x0A和0x0B两个单元 (8019ID0,8019ID1)这两个地址的读和写不是同一个寄存器
u16 m_ID;
NET_Page_Set(0);
//NET_Write_Data(0x0000,0x22); //start command;remote DMA
m_ID=NET_Read_Data(0x000a+m_Num);
return m_ID;
}
void Set_MAC_Addr(void) //设置8019网卡MAC地址
{
//MAC地址寄存器在页面2,0x01~06 (PAR0-PAR5)
u16 i;
NET_Page_Set(1);
for(i=0;i<6;i++)
NET_Write_Data(i+1,MAC_Addr[i]);
}
/*
void Read_Phy_ID(void) //获得网卡物理地址 该程序可能有点问题
{
//
u8 i;
// u8 Temp;
NET_Page_Set(0);
NET_Write_Data(0x0008,0x00);//RSAR0 dma read lowaddress=0;
NET_Write_Data(0x0009,0x00);//RSAR1 dma read highaddress=0
NET_Write_Data(0x000a,12); //RBCR0 count low
NET_Write_Data(0x000b,0x00);//RBCR1 read count high
NET_Write_Data(0x0000,0x0a);//dma read and start
//printf("\nPhysical Adress is:");
for (i=0;i<6;i++)
{
Temp=NET_Read_Data(0x0010+i);//读取一个字节
if(i<5)
;//printf("%x-",Temp);
else
;//printf("%x\n",Temp);
Temp=NET_Read_Data(0x0010+i);//读取一个重复的字节,这个字节被丢弃
}
}
*/
void NET_Hard_Reset(void) //8019硬复位
{
u16 Temp;
//通过对8019的复位Pin的控制来达到硬件复位的效果
/*
na_NET_RST->np_piodata=1; //8019模块复位
printf("等待复位过程完成,时间5秒\n");
nr_delay(5000);
na_NET_RST->np_piodata=0; //8019模块复位结束
*/
SetGpio();
for(Temp=0;Temp<1000;Temp++)
Delay(1000);
ClearGpio();
}
void NET_Soft_Reset(void) //8019软复位
{
//对复位地址写任意数据达到复位结果
//复位地址是任何页面的,0x18~0x1f单元
u16 Temp;
//Temp=NET_Read_Data(0x001f); //1F 是 Reset Port
//NET_Write_Data(0x001f,Temp);
Temp=NET_Read_Data(0x001f); //1F 是 Reset Port
NET_Write_Data(0x001f,Temp);
//nr_delay(100);
for(Temp=0;Temp<1000;Temp++)
Delay(1000);
}
/*
void NET_INT_ISR(int context) //中断服务子程序
{
DISABLE;
na_NET_INT->np_pioedgecapture=0; //清除中断标志
printf("Interrupt!!\n");
ENABLE;
}
*/
void Init_system(void) //系统初始化
{
/*
na_NET_AEN->np_piodata=1; //8019模块无效
na_NET_WR->np_piodata=1; //读、写信号无效
na_NET_RD->np_piodata=1;
*/
NET_Hard_Reset(); //硬件复位
NET_Soft_Reset(); //软件复位
/*
nr_installuserisr(na_NET_INT_irq,NET_INT_ISR,0); //分配中断服务程序
na_NET_INT->np_piodirection=0;
na_NET_INT->np_pioedgecapture=0;
ENABLE;
*/
}
void Init_NET(void) //8019初始化
{
NET_Write_Data(0x0000,0x21); //选择页0的寄存器,网卡停止运行,因为还没有初始化。TXP=0
//TXP在发送数据包时必须设置,当发送完毕或发送失败时会自动复位。为0时是没有发送。
//STA=0,STP=1,stop command.
NET_Write_Data(0x0001,0x4c); //寄存器Pstart 页面开始寄存器,设置为接收缓冲器的起始地址
NET_Write_Data(0x0002,0x80);//0x7f);//0x80); //Pstop 页面停止寄存器,设置为接收缓冲器的停止地址,一般使用8位时不超过60,使用16位时不超过80
NET_Write_Data(0x0003,0x4c); //BURY 边界寄存器,存放host读过的最后一个buffer的起始地址。 原有数据时0x4c
NET_Write_Data(0x0004,0x45);//0x4c-7);//0x45); //TPSR 发送页面起始地址,存放发送数据包的起始页面地址。
NET_Write_Data(0x0007,0xff); //ISR 清除中断标志位
NET_Write_Data(0x000c,0xde);//0xc6);//0xde); //RCR 接收结构寄存器 原来时CC
//7,6 =1;
//5.MON监控模式设置位=0;
//4.PRO=0,目标地址必须与PAR0-5相匹配;
//3.AM=1,数据包有多点传输目标地址
//2.AB=1,数据包是广播数据包
//1.AR=0,数据包长度必须大于64Bytes.
//0.SEP=0,收到的数据包没有错误检测。
NET_Write_Data(0x000d,0xe0); //TCR 发送结构寄存器。
//7.6.5=1,
//4.OFST=0 冲突偏移使能
//3.ATD=0 不使用自动传输
//2.1.LB1,LB0=0 正常操作
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -