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

📄 init.c

📁 用MCS51 单片机的TCIP协议的测试,很基本的程序,对新手可能有帮助!
💻 C
字号:
#include "config.h"
#include "eeprom.h"
#include "serial.h"
#include "socket.h"
#include "init.h"

extern u_char xdata Mac[6]; //

/*
	Verify mode of T89C51RC2
	If some error, correct it
*/
void Verify_RC2(void)
{
	u_char value;
	u_char error_flag = 0;
	
	//SBV
  	value = __api_rd_SBV();
	if (value != 0x60) {
		error_flag++;
	}
	
	// BLJB
	value = __api_rd_HSB();
	if (value & 0x40) {
		error_flag++;
	}
	
	//BSB
	value = __api_rd_BSB();
	if (value == 0x00) {
		error_flag++;
	}
	
	// SSB
	value = __api_rd_SSB();	
	if (value != 0xFE) {
		error_flag++;
	}
	
	// if some error, reboot
	if (error_flag > 0) {
		// re-program
	  __api_wr_SSB_NO_SECURITY(); // Level0
	  
	  __api_wr_SBV(0x60);
	  __api_set_BLJB();
	  __api_wr_BSB(0xff);
	  
	  __api_wr_SSB_WR_SECURITY(); // Level1
		
		((void (code *)(void)) BOOT_ADDR)();
		while (1);				  
	}
}

/*
	Verify EEPROM data
	If some error, restore it
*/
void Restore_EEPROM(void)
{
	u_char i;
	u_char val;
	
	val = EEP_Read(0xFF); // is backuped ?
	
	if (val == 0xAA) {
		for(i = BACKUP_OFFSET; i <= (BACKUP_OFFSET + EEPROMVALUE); i++) {
			val = EEP_Read(i);
			EEP_Write(i-BACKUP_OFFSET, val);
		}
	}
}


void Verify_EEPROM(void)
{
	u_char Error_flag = 0;
	u_char SW_flag = 0;
	u_char val;
	
	val = EEP_Read(EE_ERROR);
	
	if (val == 0x55) Error_flag++;
	
	//MAC
	val = EEP_Read(EE_MAC1);
	if (val != 0x00) Error_flag++;
	val = EEP_Read(EE_MAC2);
	if (val != 0x08) Error_flag++;
	val = EEP_Read(EE_MAC3);
	if (val != 0xDC) Error_flag++;
	
	//Kind
	val = EEP_Read(EE_KIND);
	if (val > 1) Error_flag++;
	
	// Debug
	val = EEP_Read(EE_DEBUG);
	if (val > 1) Error_flag++;
	
	// DHCP
	val = EEP_Read(EE_DEBUG);
	if (val > 1) Error_flag++;
	
	//	SW Version
	val = EEP_Read(EE_VER_H);
	if (val != SW_VERSION_H) SW_flag++;
	val = EEP_Read(EE_VER_L);
	if (val != SW_VERSION_L) SW_flag++;
	
	// correct 
	if (SW_flag > 0) {
		EEP_Write(EE_VER_H, SW_VERSION_H);	
		EEP_Write(EE_VER_L, SW_VERSION_L);	
	}
	
	// configmsg.s.SW_Ver = (SW_VERSION_H << 8) + SW_VERSION_L;	// SW Version
	
	
	if (Error_flag > 0) {
		PutString("\n\r> Config Error Recovery ");
		Restore_EEPROM();
		
		// write restore number
		val = EEP_Read(RESTORE_L);
		if (val > 0xFF) {
			val = EEP_Read(RESTORE_H);
			val++;
			EEP_Write(RESTORE_H, val);
			EEP_Write(RESTORE_L, 0x00);
		}
		else {
			val++;
			EEP_Write(RESTORE_L, val);
		}
			EEP_Write(EE_ERROR, 0xAA);
		
		//Update_ConfigMsg();
		// Jump Boot
		((void (code *)(void)) BOOT_ADDR)();
		while(1);
	}
}

/*
********************************************************************************
*    			8051 initialization function           
*
* Description :
* Arguments   : None
* Returns     : None
* Note        : 
********************************************************************************
*/
void Init_Interrupt(void)
{ 
	IT0 = 0;		// interrupt level trigger
	EX0 = 1;		// INT 0 enable
	EX1 = 0; 		// INT 1 disable
}

/*
********************************************************************************
*               8051 Timer0 initialization function
*
* Description :
* Arguments   : None
* Returns     : None
* Note        : 
********************************************************************************
*/
void Init_Timer0(void)
{
	EA = 0;
	TR0 = 0;
	TMOD &= ~0x0F;
	TMOD |= 0x01;

	TL0 = TIMER0_COUNT & 0x00FF;
	TH0 = TIMER0_COUNT >> 8;

	PT0 = 0;
	ET0 = 1;
	
	TR0 = 1;
	EA = 1;
}

/*
	Init Network as 0.0.0.0
*/

void Init_Net_Default(void)
{
	u_char i, ip[6];
	
	initW3100A(); // S/W RESET W3100A
	
	//MAC	
	setMACAddr(Mac);
	
	// GATEWAY
	for(i = 0; i < 4; i++)	ip[i] = 0;
	setgateway(ip);   
	
	// SUBNET MASK
	setsubmask(ip);
	
	// Local IP 
	setIP(ip);
	
	*(TIMEOUT_PTR + 2) = 0x03; // Retry Count Register : set timeout cnt
	sysinit(0x55,0x55);
}


void Init_Net(void)
{
	u_char i, ip[6];

	initW3100A();	// S/W RESET W3100A

	setMACAddr(Mac);						// MAC
	
	for (i = 0;i < 4; i++) ip[i] = EEP_Read(EE_GW1 + i);
	setgateway(ip);						// gateway address
	for (i = 0; i < 4; i++) ip[i] = EEP_Read(EE_SM1 + i);
	setsubmask(ip);						// subnet mask
	for (i = 0; i < 4; i++) ip[i] = EEP_Read(EE_IA1 + i);
	setIP(ip);							// source IP

	*(TIMEOUT_PTR + 2) = 0x03; // Retry Count Register : set timeout cnt
	sysinit(0x55,0x55);
}


void Send_KeepalivePacket(SOCKET s)
{
	u_char k;
	un_l2cval rd_ptr, ack_ptr;
	
	k = *SHADOW_TXRD_PTR(s);
	wait_1us(2);
	rd_ptr.cVal[0] = *TX_RD_PTR(s);
	rd_ptr.cVal[1] = *(TX_RD_PTR(s) + 1);
	rd_ptr.cVal[2] = *(TX_RD_PTR(s) + 2);
	rd_ptr.cVal[3] = *(TX_RD_PTR(s) + 3);
	wait_1us(2);

	rd_ptr.lVal -= 1;
	*TX_RD_PTR(s) = rd_ptr.cVal[0];
	*(TX_RD_PTR(s) + 1) = rd_ptr.cVal[1];
	*(TX_RD_PTR(s) + 2) = rd_ptr.cVal[2];
	*(TX_RD_PTR(s) + 3) = rd_ptr.cVal[3];
	wait_1us(2);

	k = *SHADOW_TXACK_PTR(s);
	wait_1us(2);
	ack_ptr.cVal[0] = *TX_ACK_PTR(s);
	ack_ptr.cVal[1] = *(TX_ACK_PTR(s) + 1);
	ack_ptr.cVal[2] = *(TX_ACK_PTR(s) + 2);
	ack_ptr.cVal[3] = *(TX_ACK_PTR(s) + 3);
	wait_1us(2);

	ack_ptr.lVal -= 1;
	*TX_ACK_PTR(s) = ack_ptr.cVal[0];
	*(TX_ACK_PTR(s) + 1) = ack_ptr.cVal[1];
	*(TX_ACK_PTR(s) + 2) = ack_ptr.cVal[2];
	*(TX_ACK_PTR(s) + 3) = ack_ptr.cVal[3];
	wait_1us(2);

	COMMAND(s) = CSEND;			/* SEND command */	
}


⌨️ 快捷键说明

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