📄 dm9k.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 + -