?? exp13.c
字號:
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "stdio.h"
#include "system.h"
#include "exp13.h"
#include "net_arp.c"
#include "net_ping.c" //Ping回應處理程序
#include "net_head.c" //首部處理程序
#include "net_tcp.c" //tcp處理程序
#include "net_http.c" //http應用處理程序
volatile int edge_capture;
void NET_INT_ISR(void * context,alt_u32 id) //中斷服務子程序
{
volatile int* edge_captureptr=(volatile int*)context;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(NET_INT_BASE,0); //禁止中斷
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(NET_INT_BASE,0);//清除中斷標志
printf("Interrupt!!\n");
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(NET_INT_BASE,1);//使能中斷
}
int main(void)
{
UINT i=0;
UINT Coun_PACK=0;
Init_system(); //系統初始化
Init_NET(); //8019初始化
//NET_CLEAR_Data(); //清除8019的原始數據
SET_PAGE0; //停止8019的DMA操作,頁面設置為0
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(UINT m_Delay) //延時子程序
{
while(m_Delay--);
}
void NET_Write_Data(UINT m_Addr,UCHAR m_Data) //8019寫一個數據的時序
{
IOWR_ALTERA_AVALON_PIO_DATA(NET_ADDR_BASE,0X300+m_Addr); //地址輸出
IOWR_ALTERA_AVALON_PIO_DIRECTION(NET_DB_BASE,0XFFFF);//數據總線方向:輸出
IOWR_ALTERA_AVALON_PIO_DATA(NET_AEN_BASE,0);//地址片選拉低
IOWR_ALTERA_AVALON_PIO_DATA(NET_WR_BASE,0);//寫信號有效
IOWR_ALTERA_AVALON_PIO_DATA(NET_DB_BASE,m_Data);//數據輸出
IOWR_ALTERA_AVALON_PIO_DATA(NET_WR_BASE,1);//寫信號無效
IOWR_ALTERA_AVALON_PIO_DATA(NET_AEN_BASE,1); //地址片選無效
}
UCHAR NET_Read_Data(UINT m_Addr) //8019讀一個數據的時序
{
UCHAR m_Data;
IOWR_ALTERA_AVALON_PIO_DATA(NET_ADDR_BASE,0X300+m_Addr);//地址輸出
IOWR_ALTERA_AVALON_PIO_DIRECTION(NET_DB_BASE,0X0000);//數據總線方向:輸入
IOWR_ALTERA_AVALON_PIO_DATA(NET_AEN_BASE,0);//片選拉低
IOWR_ALTERA_AVALON_PIO_DATA(NET_RD_BASE,0);//讀信號有效
m_Data=IORD_ALTERA_AVALON_PIO_DATA(NET_DB_BASE);//獲取數據
IOWR_ALTERA_AVALON_PIO_DATA(NET_RD_BASE,1);//讀信號無效
IOWR_ALTERA_AVALON_PIO_DATA(NET_AEN_BASE,1);//片選無效
return m_Data;
}
void NET_Page_Set(UINT m_Page) //設定當前頁面
{
//頁面寄存器 任何頁 00單元(CR) 7,6位(PS1,PS0) 另 2位為‘0’
UINT 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);
}
UINT NET_ID(UCHAR m_Num) //獲得8019的ID
{
//ID號在0頁的,0x0A和0x0B兩個單元 (8019ID0,8019ID1)這兩個地址的讀和寫不是同一個寄存器
UINT 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)
UINT i;
NET_Page_Set(1);
for(i=0;i<6;i++)
NET_Write_Data(i+1,MAC_Addr[i]);
}
void Read_Phy_ID(void) //獲得網卡物理地址 該程序可能有點問題
{
//
UCHAR i,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硬復位
{
//通過對8019的復位Pin的控制來達到硬件復位的效果
IOWR_ALTERA_AVALON_PIO_DATA(NET_RST_BASE,1); //8019模塊復位,高電平復位
printf("等待復位過程完成,時間5秒\n");
Delay(1000); //800ns以下忽略不記,高電平必須保持800ns以上
IOWR_ALTERA_AVALON_PIO_DATA(NET_RST_BASE,0); //8019模塊復位結束
}
void NET_Soft_Reset(void) //8019軟復位
{
//對復位地址寫任意數據達到復位結果
//復位地址是任何頁面的,0x18~0x1f單元
UINT Temp;
Temp=NET_Read_Data(0x001f); //1F 是 Reset Port
NET_Write_Data(0x001f,Temp);
Delay(1000); //高電平復位 必須保持800ns以上
}
void Init_system(void) //系統初始化
{
void* edge_captureptr=(void*)&edge_capture;
IOWR_ALTERA_AVALON_PIO_DATA(NET_AEN_BASE,1);//8019模塊無效
IOWR_ALTERA_AVALON_PIO_DATA(NET_WR_BASE,1);//讀、寫信號無效
IOWR_ALTERA_AVALON_PIO_DATA(NET_RD_BASE,1);
NET_Hard_Reset(); //硬件復位
NET_Soft_Reset(); //軟件復位
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -