📄 main.c
字号:
{
tmp=block_size/page_size; //计算有多少页
for(tmp2=0;tmp2<tmp;tmp2++) //页写数次
{
loadCMD(CMD_LOAD_WRITE_EEPROM);
loadAddH((address>>8)&0x00ff);
for(i=0;i<page_size;i++)
{
loadAddL(address&0x00ff);
loadDataL(msg_buffer[i+5+tmp2*page_size]);
dataLatch();
address++;
}
writeEep2Page();
}
}
else
{
if(msg_buffer[3]&0b10000000) //
{
;
}
}
}
else //byte Mode
{
;
}
LED_FLASH_2;
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_EEPROM_PP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_READ_EEPROM_PP
else if(cmd==CMD_READ_EEPROM_PP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
for(i=0;i<block_size;i++)
{
tmp = address&0x00ff;
tmp2 = (address>>8)&0x00ff;
msg_buffer[i+2]=readEepromData(tmp2,tmp);
address++;
}
num_bytes = block_size+3;
msg_buffer[0] = CMD_READ_EEPROM_PP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[block_size+2] = STATUS_CMD_OK;
LED_FLASH_2;
}
//命令CMD_PROGRAM_FUSE_PP
else if(cmd==CMD_PROGRAM_FUSE_PP)
{
if(msg_buffer[1]==0x00)
tmp=writeFuseLow(msg_buffer[2]);
else if(msg_buffer[1]==0x01)
tmp=writeFuseHig(msg_buffer[2]);
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_FUSE_PP;
if(tmp)
msg_buffer[1] = STATUS_CMD_OK;
else
msg_buffer[1] = STATUS_RDY_BSY_TOUT;
}
//命令CMD_READ_FUSE_PP
else if(cmd==CMD_READ_FUSE_PP)
{
tmp = readFuseLock(msg_buffer[1]);
num_bytes = 3;
msg_buffer[0] = CMD_READ_FUSE_PP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = tmp;
}
//命令CMD_PROGRAM_LOCK_PP
else if(cmd==CMD_PROGRAM_LOCK_PP)
{
tmp=writeLockByte(msg_buffer[2]);
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_LOCK_PP;
if(tmp)
msg_buffer[1] = STATUS_CMD_OK;
else
msg_buffer[1] = STATUS_RDY_BSY_TOUT;
}
//命令CMD_READ_LOCK_PP
else if(cmd==CMD_READ_LOCK_PP)
{
tmp = readFuseLock(0x02);
num_bytes = 3;
msg_buffer[0] = CMD_READ_LOCK_PP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = tmp;
}
//命令CMD_READ_SIGNATURE_PP
else if(cmd==CMD_READ_SIGNATURE_PP)
{
tmp = readIDByte(msg_buffer[1]);
num_bytes = 3;
msg_buffer[0] = CMD_READ_SIGNATURE_PP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = tmp;
}
//命令CMD_READ_OSCCAL_PP
else if(cmd==CMD_READ_OSCCAL_PP)
{
tmp = readOSCCAL(msg_buffer[1]);
num_bytes = 3;
msg_buffer[0] = CMD_READ_OSCCAL_PP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = tmp;
}
//命令CMD_SET_CONTROL_STACK
else if(cmd==CMD_SET_CONTROL_STACK) //我不知道这些数做什么,没有详细的描述
{
for(tmp=0;tmp<32;tmp++)
{
control_stack[tmp]=msg_buffer[1+tmp];
}
num_bytes = 2;
msg_buffer[0] = CMD_SET_CONTROL_STACK;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_ENTER_PROGMODE_HVSP
else if(cmd==CMD_ENTER_PROGMODE_HVSP)
{
num_bytes = 2;
msg_buffer[0] = CMD_ENTER_PROGMODE_PP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_LEAVE_PROGMODE_HVSP
else if(cmd==CMD_LEAVE_PROGMODE_HVSP)
{
;
}
//命令CMD_CHIP_ERASE_HVSP
else if(cmd==CMD_CHIP_ERASE_HVSP)
{
;
}
//命令CMD_PROGRAM_FLASH_HVSP
else if(cmd==CMD_PROGRAM_FLASH_HVSP)
{
;
}
//命令CMD_READ_FLASH_HVSP
else if(cmd==CMD_READ_FLASH_HVSP)
{
;
}
//命令CMD_PROGRAM_EEPROM_HVSP
else if(cmd==CMD_PROGRAM_EEPROM_HVSP)
{
;
}
//命令CMD_READ_EEPROM_HVSP
else if(cmd==CMD_READ_EEPROM_HVSP)
{
;
}
//命令CMD_PROGRAM_FUSE_HVSP
else if(cmd==CMD_PROGRAM_FUSE_HVSP)
{
;
}
//命令CMD_READ_FUSE_HVSP
else if(cmd==CMD_READ_FUSE_HVSP)
{
;
}
//命令CMD_PROGRAM_LOCK_HVSP
else if(cmd==CMD_PROGRAM_LOCK_HVSP)
{
;
}
//命令CMD_READ_LOCK_HVSP
else if(cmd==CMD_READ_LOCK_HVSP)
{
;
}
//命令CMD_READ_SIGNATURE_HVSP
else if(cmd==CMD_READ_SIGNATURE_HVSP)
{
;
}
//命令CMD_READ_OSCCAL_HVSP
else if(cmd==CMD_READ_OSCCAL_HVSP)
{
;
}
//命令CMD_ENTER_PROGMODE_ISP
else if(cmd == CMD_ENTER_PROGMODE_ISP)
{
prgMode=1;
enterProgMode();
msDelay(msg_buffer[2]); //进入编程模式
LED_ON_1;
LED_ON_2;
LED_OFF_3;
num_bytes = 2;
msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令 CMD_LEAVE_PROGMODE_ISP
else if(cmd==CMD_LEAVE_PROGMODE_ISP)
{
pageProgEnd(); //
prgMode=0;
exitProgMode();
LED_OFF_1;
LED_OFF_2;
LED_ON_3;
num_bytes = 2;
msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_CHIP_ERASE_ISP
else if(cmd==CMD_CHIP_ERASE_ISP)
{
tmp=eraseChip();
if(msg_buffer[2]==0)
{
msDelay(msg_buffer[1]);
}
else
{
msDelay(20); //本来是ISP的硬件查询
}
num_bytes = 2;
msg_buffer[0] = CMD_CHIP_ERASE_ISP;
if(tmp)
{
msg_buffer[1] = STATUS_CMD_OK;
}
else
{
msg_buffer[1] = STATUS_CMD_TOUT;
}
}
//命令CMD_PROGRAM_FLASH_ISP
else if(cmd==CMD_PROGRAM_FLASH_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
mode = msg_buffer[3];
if(!(mode&0x01)) //字写模式
{
for(i=0;i<block_size;i++)
{
; //字节模式调过
}
}
else //页写模式
{
loadCMD(CMD_LOAD_WRITE_FLASH);
start_address=address;
for(i=0;i<block_size;i+=2)
{
tmp = address&0x00ff;
flashDataLoad(tmp,msg_buffer[i+11],msg_buffer[i+10]);
address++;
}
if(mode&0x80) //如果页写
{
tmp = (start_address>>8)&0x00ff;
loadAddH(tmp);
if(pageProg())
{
msg_buffer[1] = STATUS_CMD_OK;
}
else
{
msg_buffer[1] = STATUS_RDY_BSY_TOUT;
}
}
LED_FLASH_2;
}
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
}
//命令CMD_READ_FLASH_ISP
else if(cmd==CMD_READ_FLASH_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
//tmp = msg_buffer[3];
for(i=0;i<block_size;i+=2)
{
tmp = address&0x00ff;
tmp2 = (address>>8)&0x00ff;
tmp16=flashDataRead(tmp2,tmp);
tmp = tmp16&0x00ff;
tmp2 = (tmp16>>8)&0x00ff;
msg_buffer[i+2] = tmp;
msg_buffer[i+3] = tmp2;
address++;
}
num_bytes = block_size+3;
msg_buffer[0] = CMD_READ_FLASH_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[block_size+2] = STATUS_CMD_OK;
LED_FLASH_2;
}
//命令CMD_PROGRAM_EEPROM_ISP
else if(cmd==CMD_PROGRAM_EEPROM_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
mode = msg_buffer[3];
//始终是字节写模式
for(i=0;i<block_size;i++)
{
tmp=(address>>8)&0x00ff;
tmp2=address&0x00ff;
loadCMD(CMD_LOAD_WRITE_EEPROM);
loadAddH(tmp);
writeEep(tmp2,msg_buffer[10+i]);
writeEep2Page();
address++;
LED_FLASH_2;
}
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_EEPROM_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_READ_EEPROM_ISP
else if(cmd==CMD_READ_EEPROM_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
for(i=0;i<block_size;i++)
{
tmp = address&0x00ff;
tmp2 = (address>>8)&0x00ff;
msg_buffer[i+2]=readEepromData(tmp2,tmp);
address++;
}
num_bytes = block_size+3;
msg_buffer[0] = CMD_READ_EEPROM_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[block_size+2] = STATUS_CMD_OK;
}
//命令CMD_PROGRAM_FUSE_ISP
else if(cmd==CMD_PROGRAM_FUSE_ISP)
{
//msg_buffer[4]为熔丝位的内容
if(msg_buffer[2]==0xA0) //写低位熔丝位
{
writeFuseLow(msg_buffer[4]);
}
else if(msg_buffer[2]==0xA8) //写高位熔丝位
{
writeFuseHig(msg_buffer[4]);
}
num_bytes = 3;
msg_buffer[0] = CMD_PROGRAM_FUSE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = STATUS_CMD_OK;
}
//命令CMD_READ_FUSE_ISP
else if(cmd==CMD_READ_FUSE_ISP)
{
switch(msg_buffer[2])
{
case 0x50:
msg_buffer[2] = readFuseLock(0); //读熔丝位
break;
case 0x58:
msg_buffer[2] = readFuseLock(1); //读高熔丝位
break;
default:
break;
}
num_bytes = 4;
msg_buffer[0] = CMD_READ_FUSE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//命令CMD_PROGRAM_LOCK_ISP
else if(cmd==CMD_PROGRAM_LOCK_ISP)
{
writeLockByte(msg_buffer[4]|0xC0);
num_bytes = 3;
msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = STATUS_CMD_OK;
}
//命令CMD_READ_LOCK_ISP
else if(cmd==CMD_READ_LOCK_ISP)
{
msg_buffer[2] = readFuseLock(2);
num_bytes = 4;
msg_buffer[0] = CMD_READ_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//命令CMD_READ_SIGNATURE_ISP
else if(cmd==CMD_READ_SIGNATURE_ISP)
{
tmp=msg_buffer[4]&0x03;
msg_buffer[2] = readIDByte(tmp);
num_bytes = 4;
msg_buffer[0] = CMD_READ_SIGNATURE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//命令CMD_READ_OSCCAL_ISP
else if(cmd==CMD_READ_OSCCAL_ISP)
{
tmp=msg_buffer[4]&0x03;
msg_buffer[2]= readOSCCAL(tmp);
num_bytes = 4;
msg_buffer[0] = CMD_READ_OSCCAL_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
else
{
num_bytes = 1;
msg_buffer[0] = STATUS_CMD_UNKNOWN;
}
//传送缓冲区数据
if(num_bytes>0)
{
putChar(MESSAGE_START);
checkSum=MESSAGE_START;
putChar(seqNum);
checkSum^=seqNum;
tmp=(num_bytes&0xFF00)>>8;
putChar(tmp);
checkSum^=tmp;
tmp=num_bytes&0x00FF;
putChar(tmp);
checkSum^=tmp;
putChar(TOKEN);
checkSum^=TOKEN;
for(i=0;i<num_bytes;i++)
{
putChar(msg_buffer[i]);
checkSum^=msg_buffer[i];
}
putChar(checkSum);
checkSum=0x00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -