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

📄 dm9k.c

📁 ARP协议,含ARP
💻 C
字号:

#include "dm9k.h"

#define DM9K_RST_PIN                32
#define DM9K_LS_LMT                 10

#ifndef cbi                                //定义sbi和cbi 
#define cbi(reg,bit)   reg &= ~(_BV(bit))   
#endif   
#ifndef sbi   
#define sbi(reg,bit)   reg |= (_BV(bit))   
#endif

uc dm9k_rx_mode;
uc dm9k_lkchg_flag;
uc dm9k_lkchg_cnt;

void dm9k_init (void) {
    dm9k_rx_mode = DM9K_RX_INTR;
    dm9k_lkchg_flag = false;
    dm9k_lkchg_cnt = 0;

    init_pin (DM9K_RST_PIN, DIR_OUTPUT);
    dm9k_power_up ();
    enroll_tick (dm9k_tick);
}

void dm9k_power_up (void) {

    dm9k_lkchg_flag = false;
    dm9k_lkchg_cnt = 0;

    set_pin (DM9K_RST_PIN, 0);
    delay_1ms (1);
    set_pin (DM9K_RST_PIN, 1);
    delay_1ms (1);

    dm9k_init_mac_address ();
    dm9k_init_multicast_table ();

    dm9k_enable_phy ();
    dm9k_enable_rx_normal ();

    dm9k_set_tx_double ();
    dm9k_enable_chksum ();

	dm9k_write (IMR, 0x83);
}

void dm9k_power_down (void) {
    set_pin (DM9K_RST_PIN, 0);
    delay_1ms (1);
    set_pin (DM9K_RST_PIN, 1);
    delay_1ms (1);

    dm9k_rx_mode = DM9K_RX_INTR;
    dm9k_lkchg_flag = false;
    dm9k_lkchg_cnt = 0;
}

void dm9k_event (void) {
    struct _mem_block *p;
    us len;
    uc r=0, n;

    r = dm9k_isr;
    n = 0;

    if ((r & DM9K_PRS) && ((DM9K_RX_INTR == dm9k_rx_mode))) { //收到数据包
		
		
        while (dm9k_read_packet (&p, &len)) {

		   // print_msg(0x64,p);
            if (n++ > 10) {
                break; //防止消息冲击
            }
            if (NULL == p) {
                continue;
            }
            if (! dm9k_rx_mac (p->content)) {
                free_msg (p);
                continue;
            }
            eth_recv_message (p->content, len);
            free_msg (p);
        }
    }
    if (r & DM9K_PTS) { //发包结束
//        eth_tx_ok ();
    }
    if (r & DM9K_LNKCHG) { //链路状态变化
        dm9k_lkchg_flag = true;
        dm9k_lkchg_cnt = 0;
    }
	
}

void dm9k_tick (void) {
    static uc cnt = 0;

    cnt++;
    if (cnt >= 30) {
        cnt = 0;
    }

    if (dm9k_lkchg_flag) {
        dm9k_lkchg_cnt++;
        if (dm9k_lkchg_cnt > 100) {
         //   cfg_report_ip_update ();
            dm9k_lkchg_flag = false;
            dm9k_lkchg_cnt = 0;
        }
    } else {
        dm9k_lkchg_cnt = 0;
    }
}

void dm9k_set_rx_mode (uc mode) {
    dm9k_rx_mode = mode;
}


⌨️ 快捷键说明

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