📄 data.c
字号:
/*
*********************************************************************************************************
* Atmega88
*
* File : UART.C
* Data : March 20, 2007
*********************************************************************************************************
*/
#include "bootloader.h"
BYTE RfBuf[RF_DATA_SIZE+8];
BYTE DataBuf[SPM_PAGESIZE];
//==============================================================================
char DataPrc(void)
{
WORD tmp;
BYTE cmd;
BYTE *p,*q;
WORD addr;
BYTE num;
BYTE i;
BYTE length;
BYTE fill;
BYTE fctcmd;
Led_Idle();
// received data
SpiStrobe(CCxxx0_SFRX);
SpiStrobe(CCxxx0_SRX);
while(!READ_GDO2){
if(Wait && (TIMER_OVERFLOW)){
TIMER_CLEAR;
if(--Wait == 0) return 0;
}
Check_key_break();
}
while(READ_GDO2);
if(SpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO) {
length = SpiReadReg(CCxxx0_RXFIFO);
if (length <= RF_DATA_MAX) {
p = RfBuf+1; // length has read out
SpiHead(CCxxx0_RXFIFO | READ_BURST); // read burst
for (i = 0; i < length; i++) {
SpiPut(0);
*p++ = SPDR;
}
SET_CSN;
}else{
goto Error;
}
}else{
goto Error;
}
Led_Active();
// unpackage data
p = RfBuf + ST_fctcmd;
fctcmd= *p++;
cmd = *p++;
addr = *p++;
addr += *p++ <<8;
num = *p++;
fill = *p++;
if( (Wait && (fctcmd & 0xf0)) ||
((fctcmd & 0x0f) != CMD_TYPE_R_CONFIG)
)
goto Error;
length = 7;
if(cmd == SLIP_START){
*p++ = BOOT_CTRL0;
*p++ = BOOT_CTRL1;
length = 9;
Wait = 0;
}else if(cmd == SLIP_FINISH){
;
}else if(cmd == SLIP_W_FLASH){
q = DataBuf + (addr & (SPM_PAGESIZE-1));
for(i=0; i<num; i++) *q++ = *p++;
if(fill){
q = DataBuf;
Spm_page_erase(addr); // erase one page
for(i=0 ; i<SPM_PAGESIZE; i+=2){ // write data to flash buffer
tmp = *q++;
tmp += *q++ <<8;
Spm_page_fill(i, tmp);
}
Spm_page_write(addr); // write flash buffer to flash
}
}else if(cmd == SLIP_W_EEPROM) { // SLIP_W_EEPROM
for(i=0; i<num; i++)
EEPPUT(addr+i, *p++);
#if(EN_FUSE_WRITE == 1)
}else if(cmd == SLIP_W_FUSE) {
for(i=0; i<num; i++)
Spm_fuse_write(i, *p++);
#endif
}else { // read and unknow packages
for(i=0; i<num; i++){
if ( cmd == SLIP_R_FLASH) *p++ = Read_flash(addr+i);
else if( cmd == SLIP_R_EEPROM) *p++ = EEPGET(addr+i);
#if(EN_FUSE_READ == 1)
else if( cmd == SLIP_R_FUSE) *p++ = Read_fuse(addr+i);
#endif
else goto Error;
}
length = 7 + num;
}
RfBuf[ST_length] = length;
RfBuf[ST_addr] = 0xff; // broad cast
SpiStrobe(CCxxx0_SFTX);
SpiHead(CCxxx0_TXFIFO | WRITE_BURST); // write burst
for (i = 0; i <= length; i++) {
SpiPut(RfBuf[i]);
}
SET_CSN;
SpiStrobe(CCxxx0_STX);
while(!READ_GDO2);
while(READ_GDO2);
if(cmd == SLIP_FINISH) Goto_app();
Error:
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -