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

📄 loop.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
字号:
#include <REG54.H>
#include "ep1k50.h"
#include "se0111.h"
#include "rc7820.h"
#include "f2rc7820.h"
#include "cmd_para_save.h"
#include "se0121.h"

extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void f2rc7820_wr(unsigned char f2addr,unsigned char value) large reentrant;

unsigned char xdata lparrayf[4]={0,0,0,0};                   //光口环回状态存储数组
unsigned char xdata lparray_EOS[3] = {0,0,0};
unsigned char xdata lparray2m[3][21]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};	//2M盘1的21路支路环回状态存储数组

extern void se0111_reg_wr(unsigned char Haddr,unsigned char Laddr,unsigned char value,unsigned char slot);
extern unsigned char se0111_reg_rd(unsigned char Haddr,unsigned char Laddr,unsigned char slot);
extern unsigned char se0121_reg_rd(unsigned char Laddr,unsigned char slot);
extern void se0121_reg_wr(unsigned char Laddr,unsigned char value,unsigned char slot);
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char xdata start_flg[4];
extern unsigned char xdata start_flg_EOS[4];
extern unsigned char xdata board_type[4][2];	//定义插盘类型数组,第一位表示槽号,第二位表示盘号
extern unsigned long int xdata commandid;                              //表示命令代码的变量
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;

unsigned char get_port_lpstat(struct cmd_para_save *get_portloop){
//C40读取环回状态函数,返回值0无环回、1近端环回、2远端环回、3以太网接口环回、4SDH接口环回、5命令无法执行
unsigned char xdata boardid;				//盘号
unsigned char xdata portid;					//端口号
unsigned char xdata timeid;					//时隙号
unsigned char xdata returnvalue;			//返回值
unsigned char xdata i;

	boardid = get_portloop -> lpget_stat_board;
	portid = get_portloop -> lpget_stat_port;
	timeid = get_portloop -> lpget_stat_slot;
	i = boardid;

	switch (boardid){
	case 1:
	case 2:
	case 3: if (start_flg[i] == 0){
				returnvalue = lparray2m[i-1][portid-1];			//得到2M盘的端口的环回状态
			}
			else if (start_flg_EOS[i] == 0){
				returnvalue = lparray_EOS[i-1];
			}
			else returnvalue = 5;
			break;
/*	case 1: if (start_flg[1] == 0){
				returnvalue = lparray2m[0][portid-1];			//得到2M盘1的端口的环回状态
			}
			else returnvalue = 5;
			break;
	case 2: if (start_flg[2] == 0){
				returnvalue = lparray2m[1][portid-1];
			}
			else returnvalue = 5;
			break;
	case 3: if (start_flg[3] == 0){
				returnvalue = lparray2m[2][portid-1];
			}
			else returnvalue = 5;
			break;
*/	case 4: if (start_flg[0] == 0){
				if (portid == 1){							//得到光分支盘光口1的环回状态
					returnvalue = lparrayf[2];
				}
				else if (portid == 2){						//得到光分支盘光口2的环回状态
					returnvalue = lparrayf[3];
				}
				else returnvalue = 3;
			}
			else returnvalue = 3;
			break;
	case 5: if (portid == 1){
			returnvalue = lparrayf[0];
			}
			else if (portid == 2){
			returnvalue = lparrayf[1];
			}
			else returnvalue = 5;
			break;
	default:returnvalue = 5;
			break;
	}
	if (!GetResRdyTbl(20))
		SetResRdyTbl(20); 
	return (returnvalue);
}

void report_port_lpstat(unsigned char lp_state){
//C40回应函数
    tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x34;
	tx_buf[5] = 0x30;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '2';
	if (lp_state >= 5){
		tx_buf[10] = '2';
	}
	else tx_buf[10] = '0';
	tx_buf[11] = lp_state + 0x30;
	tx_buf[12] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}


unsigned char set_port_loopback(struct cmd_para_save *set_portloop){
//C41配置端口环回函数
unsigned char xdata outporth;                       //Mapper中支路的高8位地址
unsigned char xdata outportl;                       //Mapper中支路的低8位地址
unsigned char xdata value;
unsigned char xdata boardid;						//盘号
unsigned char xdata board_type;						//盘类型
unsigned char xdata portid;							//端口号
unsigned char xdata timeid;							//时隙号
unsigned char xdata lpstat;							//设置环回类型值
unsigned char xdata returnvalue;					//返回值
unsigned char xdata i;

	commandid = 0x00433431;
	boardid = set_portloop -> lpset_stat_board;
	board_type = set_portloop -> lpset_stat_board_type;
	portid = set_portloop -> lpset_stat_port;
	timeid = set_portloop -> lpset_stat_slot;
	lpstat = set_portloop -> lpset_stat_type;
	i = boardid;

	switch (portid){                                //得出Mapper中的支路号
		case 1: outporth=0;               //??无法确定0050在新片中的地址
		        outportl=0x50;
				break;
		case 2: outporth=0;
		        outportl=0x80;
				break;
		case 3: outporth=0;
	    	    outportl=0xB0;
				break;
		case 4: outporth=0;
		        outportl=0xE0;
				break;
		case 5: outporth=0x08;
		        outportl=0x50;
				break;
		case 6: outporth=0x08;
		        outportl=0x80;
				break;
		case 7: outporth=0x08;
		        outportl=0xB0;
				break;
		case 8: outporth=0x08;
	    	    outportl=0xE0;
				break;
		case 9: outporth=0x10;
		        outportl=0x50;
				break;
		case 10: outporth=0x10;
		         outportl=0x80;
				 break;
		case 11: outporth=0x10;
		         outportl=0xB0;
				 break;
		case 12: outporth=0x10;
		         outportl=0xE0;
				 break;
		case 13: outporth=0x18;
	    	     outportl=0x50;
				 break;
		case 14: outporth=0x18;
		         outportl=0x80;
				 break;
		case 15: outporth=0x18;
		         outportl=0xB0;
				 break;
		case 16: outporth=0x18;
		         outportl=0xE0;
				 break;
		case 17: outporth=0x20;
		         outportl=0x50;
				 break;
		case 18: outporth=0x20;
		         outportl=0x80;
				 break;
		case 19: outporth=0x20;
		         outportl=0xB0;
				 break;
		case 20: outporth=0x20;
		         outportl=0xE0;
				 break;
		case 21: outporth=0x28;
		         outportl=0x50;
				 break;
	    default: break;
	}
	switch (boardid){
		case 1:
		case 2:
		case 3: if((start_flg[i] == 0) & (board_type == 2)){
					value = se0111_reg_rd(outporth,outportl,i);         //2M盘1
					value &= 0x3F;
					switch (lpstat){
						case 0: se0111_reg_wr(outporth,outportl,value,i);//??0050地址对应问题	//环回清除
								lparray2m[i-1][portid-1] = 0;
								returnvalue = 0;
								break;
						case 1: value |= 0x80;                               //近端环回
								se0111_reg_wr(outporth,outportl,value,i);
								lparray2m[i-1][portid-1] = 1;
								returnvalue = 0;
								break;
						case 2: value |= 0x40;								 //远端环回
								se0111_reg_wr(outporth,outportl,value,i);
								lparray2m[i-1][portid-1] = 2;
								returnvalue = 0;
								break;
						default:returnvalue = 2;
					 			break;
					}
				}
				else if ((start_flg_EOS[i] == 0) & (board_type == 3))
				{
					switch (lpstat){
						case 0: value = se0121_reg_rd(E_cortrol,i);		//取消以太网接口部分环回
								value &= 0xBF;
								se0121_reg_wr(E_cortrol,value,i);
								value = se0121_reg_rd(Eos_loop_AIS,i);	//取消SDH接口部分环回
								value &= 0xEF;
								se0121_reg_wr(Eos_loop_AIS,value,i);
								lparray_EOS[i-1] = 0;
								returnvalue = 0;
								break;
						case 3: value = se0121_reg_rd(E_cortrol,i);		//以太网接口部分环回
								value |= 0x40;
								se0121_reg_wr(E_cortrol,value,i);
								lparray_EOS[i-1] = 3;
								returnvalue = 0;
								break;
						case 4: value = se0121_reg_rd(Eos_loop_AIS,i);	//SDH接口部分环回
								value |= 0x10;
								se0121_reg_wr(Eos_loop_AIS,value,i);
								lparray_EOS[i-1] = 4;
								returnvalue = 0;
								break;
						default:returnvalue = 2;
								break;
					}
				}
				else returnvalue = 2;
				break;
/*		case 1: if (start_flg[1] ==0){
					value = se0111_reg_rd(outporth,outportl,1);         //2M盘1
					value &= 0x3F;
					switch (lpstat){
						case 0: //value &= 0x3F;								//环回清除
								se0111_reg_wr(outporth,outportl,value,1);
								lparray2m[0][portid-1] = 0;
								returnvalue = 0;
								break;
						case 1: value |= 0x80;                               //近端环回
								se0111_reg_wr(outporth,outportl,value,1);
								lparray2m[0][portid-1] = 1;
								returnvalue = 0;
								break;
						case 2: value |= 0x40;								 //远端环回
								se0111_reg_wr(outporth,outportl,value,1);
								lparray2m[0][portid-1] = 2;
								returnvalue = 0;
								break;
						default:returnvalue = 2;
					 			break;
					}
				}
				else returnvalue = 2;
				break;
		case 2: if (start_flg[2] ==0){
					value = se0111_reg_rd(outporth,outportl,2);
					value &= 0x3F;
					switch (lpstat){
						case 0: //value &= 0x3F;
								se0111_reg_wr(outporth,outportl,value,2);
								lparray2m[1][portid-1] = 0;
								returnvalue = 0;
								break;
						case 1: value |= 0x80;
								se0111_reg_wr(outporth,outportl,value,2);
								lparray2m[1][portid-1] = 1;
								returnvalue = 0;
								break;
						case 2: value |= 0x40;
								se0111_reg_wr(outporth,outportl,value,2);
								lparray2m[1][portid-1] = 2;
								returnvalue = 0;
								break;
						default:returnvalue = 2;
					 			break;
					}
				}
				else returnvalue = 2;
				break;
		case 3: if (start_flg[3] ==0){
					value = se0111_reg_rd(outporth,outportl,3);
					value &= 0x3F;
					switch (lpstat){
						case 0: //value &= 0x3F;
								se0111_reg_wr(outporth,outportl,value,3);
								lparray2m[2][portid-1] = 0;
								returnvalue = 0;
								break;
						case 1: value |= 0x80;
								se0111_reg_wr(outporth,outportl,value,3);
								lparray2m[2][portid-1] = 1;
								returnvalue = 0;
								break;
						case 2: value |= 0x40;
								se0111_reg_wr(outporth,outportl,value,3);
								lparray2m[2][portid-1] = 2;
								returnvalue = 0;
								break;
						default:returnvalue = 2;
					 			break;
					}
				}
				else returnvalue = 2;
				break;
*/		case 4: if (start_flg[0] ==0){
					if (portid == 1){							 //光分支盘
						switch (lpstat){
							case 0: if (lparrayf[2] == 2){
										for (value = 0; value <=62; value++){
											PTUN(2,value) = 0xFF;
										}
									}
									else {
										value = f2rc7820_rd(F2Loopback_reg) & 0x0F;
										f2rc7820_wr(F2Loopback_reg,value);
									}
									lparrayf[2] = 0;                 //保存环回类型为无环回
									returnvalue = 0;
									break;
							case 1: value = f2rc7820_rd(F2Loopback_reg) & 0x0F;
									value |= 0x30;
									f2rc7820_wr(F2Loopback_reg,value);
									lparrayf[2] = 1;                  //保存环回类型为近端环回 
									returnvalue = 0;
									break;
							case 2: for (value = 0; value <=62; value++){ //设置保存环回类型为远端环回
									PTUN(2,value) = 2;
									}
									lparrayf[2] = 2;
									returnvalue = 0;
									break;
							default:returnvalue = 2;	
	        			 			break;
						}
					}
					else if (portid == 2){
						switch (lpstat){
							case 0: if (lparrayf[3] == 2){
										for (value = 0; value <=62; value++){
											PTUN(3,value) = 0xFF;
										}
									}
									else {
										value = f2rc7820_rd(F2Loopback_reg) & 0xF0;
										f2rc7820_wr(F2Loopback_reg,value);
									}
									lparrayf[3] = 0;                 //保存环回类型为无环回
									returnvalue = 0;
									break;
							case 1: value = f2rc7820_rd(F2Loopback_reg) & 0xF0;
									value |= 0x03;
									f2rc7820_wr(F2Loopback_reg,value);
									lparrayf[3] = 1;                  //保存环回类型为近端环回 
									returnvalue = 0;
									break;
							case 2: for (value = 0; value <=62; value++){
									PTUN(3,value) = 3;
									}
									lparrayf[3] = 2;
									returnvalue = 0;
									break;
							default:returnvalue = 2;	
	        			 			break;
						}
					}
					else returnvalue = 2;
				}
				else returnvalue = 2;
				break;
		case 5: if (portid == 1){
					switch (lpstat){
						case 0: if (lparrayf[0] == 2){
									for (value = 0; value <=62; value++){
										PTUN(0,value) = 0xFF;
									}
								}
								else {
									value = Loopback_reg & 0x0F;
									Loopback_reg = value;
								}
								lparrayf[0] = 0;                 //保存环回类型为无环回
								returnvalue = 0;
								break;
						case 1: value = Loopback_reg & 0x0F;
								value |= 0x30;
								Loopback_reg = value;
								lparrayf[0] = 1;                  //保存环回类型为近端环回 
								returnvalue = 0;
								break;
						case 2: for (value = 0; value <=62; value++){
								PTUN(0,value) = 0;
								}
								lparrayf[0] = 2;
								returnvalue = 0;
								break;
						default: returnvalue = 2;	
	        					 break;
					}
				}
				else if (portid == 2){
					switch (lpstat){
						case 0: if (lparrayf[1] == 2){
									for (value = 0; value <=62; value++){
										PTUN(1,value) = 0xFF;
									}
								}
								else {
									value = Loopback_reg & 0xF0;
									Loopback_reg = value;
								}
								lparrayf[1] = 0;                 //保存环回类型为无环回
								returnvalue = 0;
								break;
						case 1: value = Loopback_reg & 0xF0;
								value |= 0x03;
								Loopback_reg = value;
								lparrayf[1] = 1;                  //保存环回类型为近端环回 
								returnvalue = 0;
								break;
						case 2: for (value = 0; value <=62; value++){
								PTUN(1,value) = 1;
								}
								lparrayf[1] = 2;
								returnvalue = 0;
								break;
						default:returnvalue = 2;	
	        			 		break;
					}
				}
				else returnvalue = 2;
				break;
		default:returnvalue = 2;
			 	break;
	}
	if (!GetResRdyTbl(1))
		SetResRdyTbl(1); 
	return (returnvalue);
}

⌨️ 快捷键说明

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