📄 main.c
字号:
//ICC-AVR application builder : 2002-1-1 7:57:28
// Target : M64
// Crystal: 12.000Mhz
#include "main.h"
#include "rtl8019as.h"
#include "arp.h"
#include "ip.h"
#include "icmp.h"
#include "udp.h"
extern unsigned int curr;//网卡RAM页指针
extern unsigned int curr_temp;
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
//////////////////////////////////////////////////////
unsigned char rtl_isr_status=0;
void main(void)
{
unsigned char rtl8019status=0;
unsigned char udptest1=0;
unsigned char udptest2=0;
key1_ok=0;
init_devices();
LED1_ON;
udp_init();
curr=0x4d00;
curr_temp=0;
delay_100ms();
rtl8019_reset();
rtl8019_init();
rtl8019_writemynodeid();
LED1_OFF;
while(1)
{
WDR();
uartsenddata();
if(key1_ok)
{
udpsendbuffer_ex[0]=udptest1;
udpsendbuffer_ex[1]=udptest2;
send_ippack(44,0x0800,17);
key1_ok=0;
udptest1++;
udptest2+=2;
}
//rtl_errchk();
switch(rtl_isr_status&0x03)
{//收发数据包事件处理
case 0x01://接收到有效数据包
//isr_ok=0;
rtl8019_read(curr,1536);
rtl_packhandle();//数据包处理
curr_temp=curr;
curr=rtl_readcurr();
curr<<=8;
if(curr<curr_temp){rtl_setcurr();}//如果接收缓冲满,则重置
rtl_isr_status=0;
break;
case 0x02://数据包已正确发送
//isr_ok=0;
rtl_setcurr();
rtl_isr_status=0;
break;
}
}
}
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
//uart has received a character in UDR
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
rtl_isr_status=rtl_isrstatus();
//isr_ok=1;
}
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
{
key1_ok=1;//external interupt on INT1
}
//////////////////////////////////////////////////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x02;
DDRD = 0x30;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x08;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x04; //external memory
mapping_init();
port_init();
uart1_init();
MCUCR = 0x80;
EICRA = 0x0b; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x03;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay_100ms(void)
{
unsigned int i=0;
unsigned int k=0;
for(;i<1000;i++)
{
for(k=0;k<100;k++)
{
WDR();
}
}
}
void rtl_errchk(void)
{
if(rtl_isrstatus()&0x04) //异常状态监视
{
if(rtl_isrstatus()&0x04)
{
rtl8019_hotreset(); //网卡芯片热复位
rtl8019_init(); //重新初始化
curr_temp=0x0000;
}
}
}
//UART1 initialize
// desired baud rate:19200
// actual baud rate:19200 (0.0%)
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x06;
UBRR1L = 0x26; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x98;
}
void uartsenddata(void)
{
unsigned int udpdata=0;
if(UCSR1A&0x20)
{
udpdata=udp_readdata();
}
if(udpdata&0x8000) //有新的UDP数据到达
{
UDR1=(udpdata&0x00FF); ///////////////////////////////////////
udpdata=0;
}
}
void led_cont(unsigned char data)
{
LEDPORT=(data&0x30)|0xCF;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//define mappings
void mapping_init(void)
{
asm( ".area memory(abs)\n"
".org 0x01F0\n"
" _key1_ok:: .blkb 1\n"
);
asm( ".area memory(abs)\n"
".org 0x01F4\n"
" _udpbuffer_in_rp:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x01F6\n"
" _udpbuffer_in_p:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x01F8\n"
" _udpdatalen:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x01FA\n"
" _to_udpport:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x01FC\n"
" _curr_temp:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x01FE\n"
" _curr:: .blkb 2\n"
);
asm( ".area memory(abs)\n"
".org 0x0200\n"
" _ip_id:: .blkb 2\n"
);
asm(".area memory(abs)\n"
".org 0x0202\n"
" _buffer:: .blkb 1536\n"
);
asm( ".area memory(abs)\n"
".org 0x08FF\n"
" _udpbuffer_in:: .blkb 1024\n"
);
asm( ".area memory(abs)\n"
".org 0x1100\n"
" _udpbuffer_ex:: .blkb 8192\n"
);
asm( ".area memory(abs)\n"
".org 0x3100\n"
" _udpsendbuffer_ex:: .blkb 2048\n"
)
asm(".area memory(abs)\n"
".org 0xC000\n"
" _reg_00:: .blkb 1\n"
".org 0xC100\n"
" _reg_01:: .blkb 1\n"
".org 0xC200\n"
" _reg_02:: .blkb 1\n"
".org 0xC300\n"
);
asm(
" _reg_03:: .blkb 1\n"
".org 0xC400\n"
" _reg_04:: .blkb 1\n"
".org 0xC500\n"
" _reg_05:: .blkb 1\n"
".org 0xC600\n"
" _reg_06:: .blkb 1\n"
".org 0xC700\n"
);
asm(
" _reg_07:: .blkb 1\n"
".org 0xC800\n"
" _reg_08:: .blkb 1\n"
".org 0xC900\n"
" _reg_09:: .blkb 1\n"
".org 0xCA00\n"
" _reg_0a:: .blkb 1\n"
".org 0xCB00\n"
);
asm(
" _reg_0b:: .blkb 1\n"
".org 0xCC00\n"
" _reg_0c:: .blkb 1\n"
".org 0xCD00\n"
" _reg_0d:: .blkb 1\n"
".org 0xCE00\n"
" _reg_0e:: .blkb 1\n"
".org 0xCF00\n"
);
asm(
" _reg_0f:: .blkb 1\n"
".org 0xD000\n"
" _reg_10:: .blkb 1\n"
".org 0xD100\n"
" _reg_11:: .blkb 1\n"
".org 0xD200\n"
" _reg_12:: .blkb 1\n"
".org 0xD300\n"
);
asm(
" _reg_13:: .blkb 1\n"
".org 0xD400\n"
" _reg_14:: .blkb 1\n"
".org 0xD500\n"
" _reg_15:: .blkb 1\n"
".org 0xD600\n"
" _reg_16:: .blkb 1\n"
".org 0xD700\n"
);
asm(
" _reg_17:: .blkb 1\n"
".org 0xD800\n"
" _reg_18:: .blkb 1\n"
".org 0xD900\n"
" _reg_19:: .blkb 1\n"
".org 0xDA00\n"
" _reg_1a:: .blkb 1\n"
".org 0xDB00\n"
);
asm(
" _reg_1b:: .blkb 1\n"
".org 0xDC00\n"
" _reg_1c:: .blkb 1\n"
".org 0xDD00\n"
" _reg_1d:: .blkb 1\n"
".org 0xDE00\n"
" _reg_1e:: .blkb 1\n"
".org 0xDF00\n"
" _reg_1f:: .blkb 1\n"
".text\n"
);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -