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

📄 xram.#1

📁 F020集成以太网接口核心模块SRAM例程源代码
💻 #1
📖 第 1 页 / 共 2 页
字号:
	{
		TI0=0;		
	}
	
}


//------------------------------------------------------------------
// 主函数开始
//-------------------------------------------------------------------
void main()
{
	Init_Device();        // 初始化系统
	InitVariable();       // 初始化变量
	
	EA=0;				  // 禁止看门狗
	WDTCN = 0xDE;	      // 实验中不使用看门狗
	WDTCN = 0xAD;	

	EA = 1;               // 打开中断
	 
    TR0  = 1;             // 启动定时器0

	SendString("C8051F02x core Module EC1,v1.0\r\n");
	SendString("XRAM with 62WV2568 Test\r\n");
	
	while(1)
	{

		if(g_cMainSignal&SECD_SIGNAL)
		{// 秒信号
			g_cMainSignal&=~SECD_SIGNAL;

			P_LED2=!P_LED2;
		}

		if(g_cMainSignal&MINU_SIGNAL)
		{// 分信号
			g_cMainSignal&=~MINU_SIGNAL;
		}

		if(g_cMainSignal&UART0RECV_SIGNAL)
		{// UART0接收完成信号
			g_cMainSignal&=~UART0RECV_SIGNAL;
			
			// 确保接收缓冲区内的字符串有结尾
			g_cRecvBuffer[RECVBUF_LEN-1] = 0;
			// 分析接收的命令
			CommandProc(g_cRecvBuffer);

		}

	}

}

//......................................
// 功能:分析接收的命令
// 输入参数:
//    pRecvString,char *:输入字符串
// 输出参数:无
// 命令格式说明:
// setled=灯序号,开关状态 \r
// 灯序号:   1,LED1;2,LED2
// 开关状态:ON,打开灯;OFF,关闭灯
// 命令字符不区分大小写
//.......................................
void CommandProc(char *pRecvString)
{
	BYTE cRet=0;
	int  iPos,i,readlen;
	BYTE cPage;
	BYTE xdata *pRam;
	
	if(strncmps("setled=",pRecvString,7)==0)
	{// 设置LED状态命令
		
		pRecvString+=7;
		
		iPos=strpos(pRecvString,',');

		if(iPos==-1)
		{// 无效命令
			cRet = 0;
		}
		else
		{
			if(strncmps(pRecvString,"2",1)==0)
			{// 控制LED2
				pRecvString+=2;

				if(strncmps(pRecvString,"on",2)==0)
				{// 打开LED
					P_LED2 = 1;

					cRet = 1;
				}
				else if(strncmps(pRecvString,"off",3)==0)
				{// 关闭LED
					P_LED2 = 0;

					cRet = 1;
				}
				else
				{
					cRet = 0;
				}
			}
		}

	}
	else if(strncmps(pRecvString,"testsram",8)==0)
	{
		// 测试62LV256	
		if(1==TestSRAM())
		{
			SendString("62LV256 Test OK!\r\n");

			cRet = 1;
		}
		else cRet = 0;
	}
	else if(strncmps(pRecvString,"testtram",8)==0)
	{// 测试62LV2567,测试的过程中TRAM中的数据会被修改
		if(1==TestTRAM())
		{
			SendString("62LV2568 Tesk OK!\r\n");

			cRet = 1;
		}
		else cRet = 0;

	}
	else if(strncmps(pRecvString,"writetram=",10)==0)
	{// 向指定的TRAM存储区域写数据
		pRecvString+=10;

		iPos=strpos(pRecvString,',');

		if(iPos==-1) cRet=0;
		else
		{// 查找扇区
			pRecvString[iPos]=0;
			cPage = atoi(pRecvString);
			
			if(cPage>=RAM_PAGE)
			{
				cRet = 0;
			}
			else
			{
				if(pRecvString[iPos+1]!=0)
				{
					pRecvString+=iPos+1;
			
					pRam = 0xC000;            // TRAM页内地址
	
					P4&=0xF0;
					P4|=cPage;               // 设置页

					while((*pRecvString)!=0)
					{// 写入TRAM中
						*pRam++=*pRecvString++;

					}

					cRet = 1;
				}
				else
				{
					cRet = 0;
				}
			}
		}
	}
	else if(strncmps(pRecvString,"readtram=",9)==0)
	{// 读取指定的页
		pRecvString+=9;

		iPos=strpos(pRecvString,',');

		if(iPos==-1) cRet=0;
		else
		{// 查找页面
			pRecvString[iPos]=0;
			cPage = atoi(pRecvString);
			
			if(cPage>=RAM_PAGE)
			{
				cRet = 0;
			}
			else
			{
				pRecvString+=iPos+1;

				readlen = atoi(pRecvString);
			
				pRam = 0xC000;            // TRAM页内地址

				P4&=0xF0;
				P4|=cPage;               // 设置页

				SendString("\r\nHex Value:\r\n");
			
				for(i=0;i<readlen;i++)
				{
					SendHex(*pRam);
					SendBuf('(');
					SendBuf(*pRam++);
					SendBuf(')');
				}
			
				cRet = 1;
			}
						
		}
	}
	else
	{// 无效命令
		cRet = 0;
	}
	
	// 向主机发送应答
	if(cRet)
	{
		SendString("\r\nOK\r\n");
	}
	else
	{
		SendString("\r\nError\r\n");
	}

}

//-----------------------------------------------------
// 函数功能:循环方式发送字符串
// 输出参数:pSendString,char*:欲发送的字符串的缓冲区
// 输出:无
//-----------------------------------------------------
void SendString(char *pSendString)
{
	
	// 循环发送,首先关闭中断
	ES0 =0;
	
	while(*pSendString!=0)
	{
		SBUF0 = *pSendString++;
		while(TI0==0);
		TI0=0;
	}

	ES0 = 1;
}

void SendBuf(BYTE buf)
{
	ES0 = 0;
	
	SBUF0 = buf;
	while(TI0==0){}
	TI0 = 0;
			
	ES0 = 1;
}

void SendHex(BYTE buf)
{
	ES0 = 0;
	
	SBUF0 = ASCII_CODE[(buf>>4)&0x0F];
	while(TI0==0){}
	TI0 = 0;
	
	SBUF0 = ASCII_CODE[(buf&0x0F)];
	while(TI0==0){}
	TI0 = 0;
	
	ES0 = 1;
}

//-----------------------------------------
// 功能:以16进制方式发送16位无符号数
// 参数:wData,WORD:要发送的数据
// 
//-----------------------------------------
void SendWordHex(WORD wData)
{
	SendHex(wData>>8);
	SendHex(wData&0xff);
}

//-----------------------------------------------------
// 功能:测试62LV256,地址范围为0x0000-0x7FFF,共32K
// 输入参数:无
// 输出:
//----------------------------------------------------
BYTE TestSRAM()
{
	int i;
	BYTE iRet=1;

	BYTE xdata *pSRAM;        // 定义指向外部RAM的指针

	SendString("\r\nTest 62LV256:\r\n");

	// 向RAM的0x0001,0x0003,0x0007等地址写入数据,然后分别读出
		
	pSRAM    = 0x0000;             // 指向外部RAM地址0

	for(i=0;i<16;i++)
	{
		*pSRAM = TESTDATA[i];

		pSRAM=((WORD)pSRAM<<1)|0x00001;
	}
	
	pSRAM = 0x0000;
	for(i=0;i<16;i++)
	{
		SendWordHex(pSRAM);
		SendString(":");

		if(*pSRAM!=TESTDATA[i])
		{
			SendString("Error,Write=");
			SendHex(TESTDATA[i]);
			SendString(",Read=");
			SendHex(*pSRAM);

			iRet = 0;              // 发现错误
		}
		else
		{
			SendString("OK\r\n");
		}

		pSRAM=((WORD)pSRAM<<1)|0x00001;
	}

	return iRet;
}

//-----------------------------------------------------
// 功能:测试62LV2568/1024,地址范围为0xC000-0xFFFF,共16K
//       并分别使用外部4条地址线来选择最多16个页面
// 输入参数:无
// 输出:
//----------------------------------------------------
BYTE TestTRAM()
{
	BYTE i,j;
	BYTE iRet=1;
	BYTE testdata;

	BYTE xdata *pSRAM;        // 定义指向外部RAM的指针

	SendString("\r\nTest 62LV2568:\r\n");

	
	testdata = 0;
	for(j=0;j<RAM_PAGE;j++)
	{	

		P4&=0xF0;
		P4|=j;                         // 选择页面

		pSRAM    = 0xC000;             // 指向外部RAM地址0

		for(i=0;i<15;i++)
		{
			*pSRAM = testdata;

			pSRAM=(((WORD)pSRAM<<1)|0xC001);

			testdata++;
		}
	}
	
	// 读,校验
	testdata = 0;

	for(j=0;j<RAM_PAGE;j++)
	{	

		P4&=0xF0;
		P4|=j;                         // 选择页面

		SendString("PAGE=");
		SendHex(j);
		SendString(":\r\n");


		pSRAM = 0xC000;
		for(i=0;i<15;i++)
		{
			SendWordHex(pSRAM);
			SendString(":");

			if(*pSRAM!=testdata)
			{
				SendString("Error,Write=");
				SendHex(testdata);
				SendString(",Read=");
				SendHex(*pSRAM);
				SendString("\r\n");

				iRet = 0;              // 发现错误
			}
			else
			{
				SendString("OK\r\n");
			}

			pSRAM=(((WORD)pSRAM<<1)|0xC001);

			testdata++;
		}

		SendString("\r\n");
	
	}

	return iRet;
}

//----------------------------------------------------------
// 功能:不区分大小写的字符串比较函数
// 参数:pString1,char*:字符串1
//       pString2,char*:字符串2
//       iLen,int:长度
// 返回值:-1:字符串相同;0:字符串不同
//-----------------------------------------------------------
char strncmps(char *pString1,char *pString2,int iLen)
{
	char cTemp;
	int  i;

	if(strlen(pString1)<iLen) return -1;

	if(strlen(pString2)<iLen) return -1;

	for(i=0;i<iLen;i++)
	{
		cTemp = pString1[i];

		if(cTemp!=pString2[i])
		{
			if((cTemp>='A')&&(cTemp<='Z'))
			{
				cTemp = cTemp-'A'+'a';

				if(cTemp!=pString2[i]) return -1;
			}
			else if((cTemp>='a')&&(cTemp<='z'))
			{
				cTemp = cTemp-'a'+'A';

				if(cTemp!=pString2[i]) return -1;
			}
			else return -1;
		}
	}

	return 0;
}

⌨️ 快捷键说明

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