📄 myapp.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 + -