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

📄 myapp.c

📁 SM5964在系统编程的源代码,通过COMM串行口进行程序下载,方便嵌入式系统开发
💻 C
字号:
#include "main.h"
#include "myApp.h"
#include "isp.h"
#include "comm.h"

#include <absacc.h>

/*
unsigned char Asc2Hex(unsigned char *strData);
void Hex2Asc(unsigned char ch,unsigned char *strOut);
*/


unsigned char CheckAppPrg();
void IspServer();
unsigned char CheckPcCmd();

void CMD_CHIPERASEf();
void CMD_PAGEERASEf();
void CMD_CHIPREADf();
void CMD_CHIPWRITEf();
void CMD_SETPROTECTf();
void CMD_CLRPROTECTf();
void CMD_VERIFYf();
void CMD_GETMACHINEf();
void CMD_ENDCOMf();
void ErrCmd();
void CMD_READRAMf();




/*
************************************
**检测PC发送的信息
************************************
*/
unsigned char CheckPcCmd()
{
	unsigned char ch;	
	unsigned char num=0;


	for(i=0;i<10;i++)
	{
		WatchDog();
		if(ReadComm1(&ch)!=ID_OK)break;

		if(ch==0x55)num++;
	}

	if(num<5)return ID_ERR;
	else   
	{
		PIN_TXEN=RS485_COMM_ENABLE;//允许发送
		WriteComm(0xaa);
		WriteComm(0xaa);
		PIN_TXEN=RS485_COMM_DISENABLE;//不允许发送
		return ID_OK;
	}

}

/*
************************************
**检查程序的完整性
************************************
*/
unsigned char CheckAppPrg()
{
	unsigned char xorcode;
	unsigned char ch;
	


	//1.由并行编程器写入的,检查开始字节是否是0x02,
	ch=ChipRead(0x0000);
	if(ch==0x02)return ID_OK;

	//2.连续100个字节0xff判断,表示根本没有下载成功
	for(i=0;i<100;i++)
	{
		WatchDog();
		if(ChipRead(i)!=0xff)break;	
	}
	if(i>=100)return ID_ERR;

	//3.校验码判断,校验码错,则肯定下载失败
	//0xf7ff字节位置为0XFF-没有产生校验码,否则有校验码
	ch=ChipRead(0xf7ff);

	if(ch!=0xff)
	{
		xorcode=0;
		for(i=0;i<0xf800;i++)
		{
			WatchDog();
			ch=ChipRead(i);
			xorcode ^= ch;
		}
	
		if(xorcode!=0x00 && xorcode!=0xff)
		{
			return ID_ERR;
		}
	}

	//4.错误跳转,或者0xff,真的为空

	i=ChipRead(0x0001);
	i<<=8;
	i+=ChipRead(0x0002);

	if(i>0xf800)return ID_ERR;


	//都没有错误	
	return ID_OK;

}
/*
************************************
**isp 服务程序
************************************
*/
void IspServer()
{

	unsigned char status;

	while(1)
	{
	
		
		//接收PC机发来的命令
		status=ReceiveData();
		WatchDog();		

		//命令的处理
		if(status)SendResponse(status,g_CommBuffer,0x00);
		else
		{
			
			//地址出现错误,则不返回信息
			WatchDog();

			//if(g_CommBuffer[1]!=0x00 && g_CommBuffer[1]!=0xff)
			//{
			//	if(g_CommBuffer[1]!=g_MachineNo)//判断地址错误
			//	{
			//		InitParameter();
			//		continue;
            //  
			//	}
			//}

			
			switch(g_CommBuffer[2])
			{
			case CMD_CHIPERASE://  	0Xa0//擦除芯片
				CMD_CHIPERASEf();
				break;
			case CMD_PAGEERASE://  	0Xa1//页擦除
				CMD_PAGEERASEf();
				break;
			case CMD_CHIPREAD://   	0Xa2//读
				CMD_CHIPREADf();
				break;
			case CMD_CHIPWRITE://  	0Xa3//写
				CMD_CHIPWRITEf();
				break;
			case CMD_SETPROTECT://    	0Xa4//保护
				CMD_SETPROTECTf();
				break;		
			case CMD_VERIFY:	//a5校验
				CMD_VERIFYf();
				break;				
			case CMD_GETMACHINE:	//a7获取机号
				CMD_GETMACHINEf();
				break;
			case CMD_ENDCOM:	//a8结束通讯
				CMD_ENDCOMf();				
				break;

			case CMD_READRAM:
				CMD_READRAMf();
				break;
		
			default:
				ErrCmd();
				

			}

			if(g_CommBuffer[2]==CMD_ENDCOM)break;
			InitParameter();

		}


	}


}


void CMD_CHIPERASEf()
{
	unsigned char status;
	unsigned char ch;


	WatchDog();
	ChipErase();


	ch=ChipRead(0);
	if(ch!=0xff)status=ID_ERR;
	else        
	{
		MyIspFlag=0x00;//不再唤醒
		status=ID_OK;
	}

	SendResponse(status,g_CommBuffer,0x00);
	
}

//in g_CommBuffer[3]
void CMD_PAGEERASEf()
{
	unsigned char status;
	unsigned char ch;


	WatchDog();
	PageErase( g_CommBuffer[5]);

	ch=ChipRead(g_CommBuffer[5]*512);
	if(ch!=0xff)status=ID_ERR;
	else		status=ID_OK;

	if(g_CommBuffer[5]==0X00 && status==ID_OK)MyIspFlag=0x00;//不再唤醒


	SendResponse(status,g_CommBuffer,0x00);

}
//addr len
//ret: data
void CMD_CHIPREADf()
{
	
	unsigned int addr;
	unsigned int len;
	unsigned int i;


	WatchDog();

	addr = g_CommBuffer[5];
	addr <<= 8;
	addr += g_CommBuffer[6];

	len  = g_CommBuffer[7];
	len <<= 8;
	len  += g_CommBuffer[8];



	for(i=0;i<len;i++)
	{
		WatchDog();
		g_CommBuffer[i]=ChipRead(addr+i);
	}

	WatchDog();
	SendResponse(0x00,g_CommBuffer,len);

}
void CMD_READRAMf()
{
	unsigned char ch;

	WatchDog();

	ch= (g_CommLen>>8);
	g_CommBuffer[0]=ch;

	ch= (g_CommLen&0xff);
	g_CommBuffer[1]=ch;

	SendResponse(0x00,g_CommBuffer,2);

}

//addr len data

void CMD_CHIPWRITEf()
{
	unsigned int addr;
	unsigned int len;
	

	unsigned char status=ID_OK;
	unsigned char ch;

	WatchDog();

	addr = g_CommBuffer[5];
	addr <<= 8;
	addr += g_CommBuffer[6];

	len  = g_CommBuffer[7];
	len <<= 8;
	len  += g_CommBuffer[8];


	
	
	if(addr==0x00)
	{
		g_CommBuffer[9]=0xff;//把最开始 0x00,设置为FF

	}


	for(i=0;i<len;i++)
	{		
		
		WatchDog();
		ch=g_CommBuffer[9+i];
		ChipWrite(addr+i,ch);
		WatchDog();
		WatchDog();
		
		if(ch!=ChipRead(addr+i))
		{
			status=ID_ERR;
			break;//写的不对
		}
		

	}

	SendResponse(status,g_CommBuffer,0x00);

}


void CMD_SETPROTECTf()
{

	WatchDog();
	SetChipProtect();

	SendResponse(ID_OK,g_CommBuffer,0x00);

}

//addr len  xor
void CMD_VERIFYf()
{
	
	unsigned int addr;
	unsigned int len;
	

	unsigned char status;
	unsigned char xorcode;
	unsigned char ch;
	unsigned char temp;



	WatchDog();

	addr = g_CommBuffer[5];
	addr <<= 8;
	addr += g_CommBuffer[6];

	len  = g_CommBuffer[7];
	len <<= 8;
	len  += g_CommBuffer[8];

	
	
	temp=g_CommBuffer[9];

	xorcode=temp;
	for(i=0;i<len;i++)
	{
		WatchDog();
		ch=ChipRead(addr+i);
		xorcode ^=ch;		
	}

	if(xorcode==0)status=ID_OK;
	else          status=ID_ERR;


	g_CommBuffer[0]=xorcode;
	g_CommBuffer[1]=temp;

	SendResponse(status,g_CommBuffer,2);

}

//get machineno
void CMD_GETMACHINEf()
{
	WatchDog();
	g_CommBuffer[0]=g_MachineNo;	
	SendResponse(ID_OK,g_CommBuffer,0x01);
}
//结束通讯
void CMD_ENDCOMf()
{
	WatchDog();
	SendResponse(ID_OK,g_CommBuffer,0x00);
}
void ErrCmd()
{
	WatchDog();	
	SendResponse(COMM_CMD_ERR,g_CommBuffer,0x00);
}


/*
unsigned char asctohex1(unsigned char ch)
{
	if(ch>='0' && ch <= '9')return (ch-0x30);
	if(ch>='A' && ch <= 'F')return (ch-0x37);
	if(ch>='a' && ch <= 'f')return (ch-0x57);

}

unsigned char Asc2Hex(unsigned char *strData)
{
	unsigned char ch;

	ch 	 =  asctohex1(strData[0]);
	ch <<=  4;
	ch +=	asctohex1(strData[1]);

	return (ch);

}

unsigned char hextoasc1(unsigned char ch)
{
	if(ch>=0 && ch <= 9)return (ch+0x30);
	else				return (ch+0x37);	

}

void Hex2Asc(unsigned char ch,unsigned char *strOut)
{
	unsigned char temp;
	
	temp=(ch>>4)& 0x0f;
	strOut[0]=hextoasc1(temp);

	temp=(ch)& 0x0f;
	strOut[1]=hextoasc1(temp);

}
*/

⌨️ 快捷键说明

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