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

📄 net.c

📁 本人用avr 单片机atmega128开发控制产品的源码。
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <iom128v.h>
#include <net.h>
#include <control.h>
#include <macros.h>
//3100 address port
#define   iDM_OR     *(char*)(0x1140)  		  
#define   iDM_AR0   *(char*)(0x1144)  		
#define   iDM_AR1   *(char*)(0x1148)  		
#define   iDM_DR     *(char*)(0x114C) 		  
//3100 register
#define   C0_TA_PR  0x18  // Channel 0 Tx ACK Pointer Register
#define   C0_TW_PR  0x40  // Channel 0 Tx Write Pointer Register
#define   C0_TR_PR  0x44  // Channel 0 Tx Read Pointer Register
#define   C0_RR_PR  0x14  // Channel 0 Rx Read Pointer Register
#define   C0_RW_PR  0x10  // Channel 0 Rx Write Pointer Register

#define NET_GATE	0x0070     //0x0054-0x0057
#define NET_SUB		 0x0080      //0x0058-0x0061
#define NET_LIP		   0x0090     //0x0062-0x0065
#define NET_DIP		   0x00a0      //0x0066-0x0069
#define PASSWORD_ADD	0X0060    //0X0054-0X0059
#define COM_ADDR_H         0x0054
#define COM_ADDR_L          0x0055

const unsigned char pre_C0_TW_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_TA_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_TR_PR[4]={0x00,0x00,0x40,0x00};
const unsigned char pre_C0_RW_PR[4]={0x00,0x00,0x65,0x00};
const unsigned char pre_C0_RR_PR[4]={0x00,0x00,0x65,0x00};
const unsigned char C0SPR[2]={0x02,0xbc};               //source socket  700
const unsigned char C0DPR[2]={0x02,0xbc};     		   //destination scoket    700

extern unsigned char net_gatway[4],net_sub[4],net_lip[4],net_dip[4];
extern unsigned char w3100_shar[6];
extern const   unsigned char net_password[6];
extern const   unsigned char com_baud[8];
extern unsigned char net_password_ok;
extern unsigned char menu_password[6];
extern unsigned char time[7];
extern unsigned char restart;
extern unsigned int com_set;
extern unsigned char net_have_conect;
extern unsigned char have_connect;
extern unsigned char password_check_count;
extern unsigned char send_data[100];
extern unsigned char sound_type_saved;
extern unsigned char sound_swtich[4],sound_swtich_saved[4];
unsigned char TIME_DELAY_OK;
unsigned char TIME_1S_COUNTER;

unsigned char C0RR_PR[4],C0RW_PR[4];

unsigned int SDRAM_read_number;

unsigned char start;
unsigned char  buffer_in_data[32];     // 输入缓冲
unsigned char  have_get2[4];
unsigned char r_addr_h;
unsigned char r_addr_l;
unsigned int   W3100A_M;
unsigned int   receive_size;
unsigned int   length;



extern unsigned char power_on;
extern unsigned char qam_ch_position;
extern unsigned char qam_ch,center_frequency,qammode;
extern unsigned int    iSmbRatSaved[8],iSmbRat;
extern unsigned char ucMenuQModSubPosition[8],ucMenuIFSubPosition[8];
extern unsigned char temperature_h[2],temperature_l[2]; 
extern unsigned char password_saved[6],sound_swtich_saved[4];
extern unsigned char net_send_data[256];
extern unsigned char net_rx_buf[256],net_tx_buf[256];
extern unsigned char net_Rxin,net_Txin,net_Txout,net_Rxout,net_tx_empty; 
extern unsigned char com_Rxin,com_Txin,com_Txout,com_Rxout,com_tx_empty; 
extern unsigned char com_tx_buf[256],com_rx_buf[256];

//---------------------------------------------------------
// NAME:	ini_indirect_mood()
// ENTRY:	mode
// RETURN:	void
// FUNCTION:use indirect_mood1 or mode2
// MODIFY:	2004.2.3
//--------------------------------------------------------
void ini_indirect_mood(unsigned char mode)
{
	DDRA=0XFF;
	iDM_OR=mode;
}
//---------------------------------------------------------
// NAME:	W3100A_write_reg()
// ENTRY:	addr_h,addr_l
// RETURN:	void
// FUNCTION:write data to register
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_write_reg(unsigned char addr_h, unsigned char addr_l,unsigned char w_data)
{
	DDRA=0XFF;
	delayus(50);
	iDM_AR0 = addr_h;    //H_address_dat
	iDM_AR1 = addr_l;    //L_address_dat
	iDM_DR =w_data;      //reg_dat
}
//---------------------------------------------------------
// NAME:	read_reg()
// ENTRY:	addr_h,addr_l
// RETURN:	void
// FUNCTION:read data from register
// MODIFY:	2004.2.3
//---------------------------------------------------------
unsigned char read_reg(unsigned char addr_h,unsigned char addr_l)
{
	
	unsigned char r_data;
	DDRA=0Xff;
	delayus(50);
	iDM_AR0=addr_h;      //H_address_dat
	iDM_AR1=addr_l;       //L_address_dat
	DDRA=0X00;
	delayus(50);
	r_data=iDM_DR;       //dat
	return r_data;
}
//---------------------------------------------------------
// NAME:	W3100A_head_get()
// ENTRY:	void
// RETURN:	void
// FUNCTION:get the head length
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_head_get(void)
{
	unsigned int a;
	DDRA=0XFF;
	a=have_get2[2];
	a <<= 0x08;
	a=(a+have_get2[3]+W3100A_M)&0x07ff;
	length=0x800-a;
	iDM_AR0=0x40+a/256;      //addr_h;
	iDM_AR1=a%256;           //addr_l;
	ini_indirect_mood(MODE2);
}
//---------------------------------------------------------
// NAME:	W3100A_address_init()
// ENTRY:	void
// RETURN:	void
// FUNCTION:init the address at the begin position
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_address_init(void)
{
	iDM_AR0=0x40;
	iDM_AR1=0x00;
}
//---------------------------------------------------------
// NAME:	W3100A_write_data()
// ENTRY:	w_data1,w_data2
// RETURN:	void
// FUNCTION:write data to w3100a
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_write_data(unsigned char w_data1 ,unsigned char w_data2)
{
	DDRA=0XFF;
	//ini_indirect_mood2();
	delayus(50);
	iDM_DR=w_data1;
	iDM_DR=w_data2;
	W3100A_M+=2;
	//ini_indirect_mood1();
}
//---------------------------------------------------------
// NAME:	TCP_IP_Write_Data()
// ENTRY:	leng,*p
// RETURN:	void
// FUNCTION:write data to w3100a in the transmit buffer
// MODIFY:	2004.2.3
//---------------------------------------------------------
void TCP_IP_Write_Data(unsigned char leng,unsigned char*p)
{
	unsigned char i,j;
	unsigned char temp;
	temp=0;
	W3100A_head_get();
	DDRA=0XFF;
	WDR();
	if(length<leng)
	{
		for(i=0;i<length;i++)
		{
			WDR();
			temp=net_Txout+i;
			iDM_DR=*(p+temp);
		}
		W3100A_address_init();		
		j = leng-length;
		for(i=0;i<j;i++)
		{
			WDR();
			temp=net_Txout+i;
			iDM_DR=*(p+temp);
			W3100A_M+=1;
		}
		
	}
	else
	{
		for(i=0;i<leng;i++)
		{
			WDR();
			temp=net_Txout+i;
			iDM_DR=*(p+temp);
		}
		W3100A_M+=leng;
	}
	ini_indirect_mood(MODE1);
	W3100A_data_trans();
}
//---------------------------------------------------------
// NAME:	ini_T_ptr()
// ENTRY:	void
// RETURN:	void
// FUNCTION:preset  transfer_pointer to 0x4000
// MODIFY:	2004.2.3
//---------------------------------------------------------
void ini_T_ptr(void)
{
	unsigned char k;
	for(k=0;k<4;k++)
	{
		W3100A_write_reg(0x00,C0_TW_PR+k,pre_C0_TW_PR[k]);              //preset  transfer_pointer
		W3100A_write_reg(0x00,C0_TA_PR+k,pre_C0_TA_PR[k]);
		W3100A_write_reg(0x00,C0_TR_PR+k,pre_C0_TR_PR[k]);
	}
}
//---------------------------------------------------------
// NAME:	W3100A_socket_init()
// ENTRY:	void
// RETURN:	void
// FUNCTION:init the chip w3100a socket 
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_socket_init(void)
{
	unsigned char i;
	i=0;
	do
	{
		i++;
		if(i==20)  break;
		W3100A_write_reg(0x00,C0_CR,0x01);  //system_ini
		WDR();
	}
	while(read_reg(0x00,C0_SSR)!=0x00);
	i=0;
	do
	{
		i++;
		if(i==20)  break;
		W3100A_write_reg(0x00,C0_CR,0x02);  //socket_ini
		WDR();
	}
	while( read_reg(0x00,C0_SSR)!=0x0E);
	ini_T_ptr();
	//W3100A_write_reg(0x00,C0_CR,0x04); 	//connect command
	W3100A_write_reg(0x00,C0_CR,0x08);      //listen command
	//while(read_reg(0x00,C0_SSR)!=0x06);
	delayus(5000);
}
//---------------------------------------------------------
// NAME:	W3100A_data_trans()
// ENTRY:	void
// RETURN:	void
// FUNCTION:transmit the data 
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_data_trans(void)
{
	unsigned int ptr_temp=0;
	unsigned char a;    
	if( read_reg(0x00,C0_SSR)==0x06)
	{
		read_reg(0x01,0xe2);
		have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
		have_get2[3]=read_reg(0x00,C0_TA_PR + 3);
		a=read_reg(0x00,C0_CR)&0x20;       
		
		while(a!=0x00)
		{
			a=read_reg(0x00,C0_CR)&0x20;
			if(TIME_DELAY_OK==1)
			{
				TIME_DELAY_OK=0;
				goto wait;
			}
			WDR();
		}
		ptr_temp=W3100A_M+have_get2[2]*256+have_get2[3];
		W3100A_write_reg(0x00,C0_TW_PR+0,0x00);
		W3100A_write_reg(0x00,C0_TW_PR+1,0x00);
		W3100A_write_reg(0x00,C0_TW_PR+2,ptr_temp/256);
		W3100A_write_reg(0x00,C0_TW_PR+3,ptr_temp%256);
		W3100A_write_reg(0x00,C0_CR,0x20);                    //send   command
		W3100A_M=0;
		read_reg(0x01,0xe2);
		have_get2[0]=read_reg(0x00,C0_TA_PR);
		have_get2[1]=read_reg(0x00,C0_TA_PR + 1);
		have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
		have_get2[3]=read_reg(0x00,C0_TA_PR + 3);   			
		while((have_get2[2]!=ptr_temp/256)||(have_get2[3]!=ptr_temp%256))
		{
			read_reg(0x01,0xe2);
			have_get2[0]=read_reg(0x00,C0_TA_PR);
			have_get2[1]=read_reg(0x00,C0_TA_PR + 1);
			have_get2[2]=read_reg(0x00,C0_TA_PR + 2);
			have_get2[3]=read_reg(0x00,C0_TA_PR + 3);
			//system_dog();
		}
	}
	
	else
	{
wait:    w3100a_open();
	   SDRAM_read_number=0;
	   W3100A_M=1;
	}
}
//---------------------------------------------------------
// NAME:	W3100A_pre_receive()
// ENTRY:	void
// RETURN:	void
// FUNCTION:receiver buffer pointer count
// MODIFY:	2004.2.3
//---------------------------------------------------------
unsigned int W3100A_pre_receive(void)
{
	unsigned char shadow;
	unsigned char k;
	unsigned int  rrptr;
	unsigned int  rwptr;
	unsigned int  size;
	shadow=read_reg(0x01,0xe1);                          //access shadow
	for(k=0;k<4;k++)         			     //access C0_RR_PR
	{
		C0RR_PR[k]=read_reg(0x00,C0_RR_PR+k);
	}
	rrptr=(C0RR_PR[3])+( (C0RR_PR[2])*256 );                   // low 16 bits
	
	shadow=read_reg(0x01,0xe0);                          //access shadow
	for(k=0;k<4;k++)				      //access C0_RW_PR
	{
		C0RW_PR[k]=read_reg(0x00,C0_RW_PR+k);
	}
	rwptr=(C0RW_PR[3])+( C0RW_PR[2]*256 );                //low 16 bits
	
	if(rrptr!=rwptr)
	{
		if(rwptr>rrptr)
		{
			size=rwptr-rrptr;
		}
		else
		{
			size=2048-(rrptr-rwptr);
		}
		rrptr=rrptr&0x07ff;
		rrptr+=0x6000;
		r_addr_h=rrptr/256;
		r_addr_l=rrptr%256;
		//state_3100a=0xff;
	}
	else
	{
		//state_3100a=0x00;
		size=0;
	}
	receive_size=size;
	return receive_size;
}
unsigned char dat_net[10];
//---------------------------------------------------------
// NAME:	W3100A_data_receive()
// ENTRY:	void
// RETURN:	void
// FUNCTION:read the data from the receive buffer
// MODIFY:	2004.2.3
//---------------------------------------------------------
void W3100A_data_receive(void)
{
	unsigned char shadow;
	unsigned int k;
	//ENABLE_XM( );
	if(receive_size>50)
		receive_size=50;           //the number of received data if no more than 16.
	ini_indirect_mood(MODE2);//ini_indirect_mood2();
	iDM_AR0=r_addr_h;
	iDM_AR1=r_addr_l;
	for(k=0;k<receive_size;k++)
	{
		//dat_net[k]=iDM_DR;
		net_rx_buf[net_Rxin]=iDM_DR;
		net_Rxin++;
		com_Rxin &= DATA_LEN;
	}
	ini_indirect_mood(MODE1);//ini_indirect_mood1();
	shadow=read_reg(0x01,0xe0);                          //access shadow
	for(k=0;k<4;k++)				           //access C0_RW_PR
	{
		C0RW_PR[k]=read_reg(0x00,C0_RW_PR+k);
	}
	
	
	for(k=0;k<4;k++)
	{
		W3100A_write_reg(0x00,C0_RR_PR+k,C0RW_PR[k]);
	}
	do
	{
		W3100A_write_reg(0x00,C0_CR,0x40);                            //commond receive
		WDR();

⌨️ 快捷键说明

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