⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 此文档为采用FPGA实现的以太网MAC层
💻 C
字号:
#include "ntp.h"#include "serial.h"#include "sys.h"#include "proc_tsk3000.h"#include "mac.h"#include "mac_low.h"#include "ip.h"#include "dhcp.h"#define INIT_INTERVAL 20    //Interval before starting ethernet modulevolatile Uint8 x = 0;volatile Uint16 cnt1 = 0;volatile Uint8 init_counter = INIT_INTERVAL;volatile Uint8 dhcp_getip_flag = 0;extern volatile Uint16 dhcp_timer;extern Uint8 flags[];extern Uint32 rxcounter;extern Uint32 txcounter;extern Uint8 rxbdindex;extern Uint8 txbdindex;extern Uint8 rxbdindex_rd;extern Uint16 crc_counter;extern ARP_TABLE arptable;extern IP_TABLE iptable;extern IP_SETTINGS ipsettings;/*extern ARPFRAME arp_frame;extern ICMPHEADER icmp_header;extern IPHEADER ip_header; */void interrupt_init(void){    tsk3000_disable_interrupts();    tsk3000_set_vectored_interrupts    (1);    tsk3000_set_interrupt_mode         (0x2);    tsk3000_clear_interrupt_edge_flags (0x2);    tsk3000_set_enabled_interrupts     (0x3);    //Setup interval timer    //Disable timer    tsk3000_set_status_reg(tsk3000_get_status_reg() & ~TSK3000_Status_IntervalTimerEnable);    //Reset timer    tsk3000_reset_interval_timer();    //Set timer register    tsk3000_set_interval_timer(0xc350);    //Enable timer    tsk3000_set_status_reg(tsk3000_get_status_reg() | TSK3000_Status_IntervalTimerEnable);    tsk3000_enable_interrupts();}void mac_handler(){    volatile Uint32 *wordptr;    //tsk3000_disable_interrupts();    //x ^= 0x44;    //LEDS ^= 0x80;    flags[rxbdindex] |= NOOP_RDY;    //Increment rxbdindex - will point to next free slot after incrementing    rxbdindex++;    if (rxbdindex == RXBDCOUNT)    {       rxbdindex=0;    }    //tsk3000_enable_interrupts();}void __interrupt( 1 ) mac_isr(void){    tsk3000_clear_interrupt_edge_flags (tsk3000_get_pending_interrupts() | 0x2);    //Check if MAC fired interrupt       mac_clr_rxint();       mac_handler();}void __interrupt( 0 ) timer_isr(void){    //tsk3000_clear_interrupt_edge_flags (tsk3000_get_pending_interrupts() | 0x1);    //Reset interrupt       //Timer interrupt       cnt1++;       if (cnt1 == 1000)       {          //LEDS ^= 1;          dhcp_timer--;          if (dhcp_timer == 0)          {             dhcp_timer = DHCP_REFRESH_INTERVAL;             //Grab DHCP IP             //dhcp_getip();             dhcp_getip_flag = 1;          }          cnt1 = 0;       }    tsk3000_reset_interval_timer();}void main(void){    Uint16 x;    Uint16 intbuf[50];    Uint16 tmpint, *intptr;    volatile Uint8 tmpchar,*charptr;    Uint32 *wordptr,word;    BD_TYPE *bdptr;    LEDS = 1;    interrupt_init();    //Init serial ports    dbg_init();    dbg(0xeeef);    mac_init();    while (1)    {       if (flags[rxbdindex_rd])       {          rxcounter++;          mac_process(rxbdindex_rd);          //completed processing, reset bd          mac_clr_rxbd(rxbdindex_rd);          flags[rxbdindex_rd]=0;          rxbdindex_rd++;          if (rxbdindex_rd == RXBDCOUNT)          {             rxbdindex_rd = 0;             //Reset the WR bit             //mac_setwr(RXBDCOUNT-1);          }       }       //Check if DHCP update requried       if (dhcp_getip_flag)       {          dhcp_getip();          dhcp_getip_flag = 0;       }       //dbg_char(LEDS);       //LEDS = tmpchar;       if (DBG_RXI)       {          dbg(0xffff);          DBG_SCON &= ~1;          switch (DBG_SBUF)          {             case 'a':                  dbg_string((Uint16 *) &iptable,sizeof(IP_TABLE)/2);                  break;             case 'b':                 dbg_string((Uint16 *) &ipsettings,sizeof(IP_SETTINGS)/2);                   break;              case 'c':                   dbg_char(rxbdindex);                   dbg_char(rxbdindex_rd);                   dbg(crc_counter);                   dbg_string((Uint16 *) &rxcounter,2);                   dbg_string((Uint16 *) &txcounter,2);                   break;              case 'd':                   dhcp_getip();                   //tsk3000_disable_interrupts();                   break;              case 'e':                   dbg_string((Uint16 *) EMAC_TX_PTR,200);                   break;              case 'f':                   dbg_string((Uint16 *) &arptable,sizeof(ARP_TABLE)/2);                   break;              case 'g':                   wordptr = (Uint32 *) EMAC_RXBD_PTR;                   for (x=0;x<RXBDCOUNT;x++,wordptr++)                   {                      word = *wordptr;                      dbg_string((Uint16 *) &(word),2);                      wordptr++;                      word = *wordptr;                      dbg_string((Uint16 *) &(word),2);                   }                   break;              case 'h':                   for (x=0;x<RXBDCOUNT;x++)                       dbg_char(flags[x]);                   break;              case 'i':                   ntp_get_time();                   break;              case 'j':                   dbg(dhcp_timer);                   break;             default:                     break;          }       }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -