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

📄 data.c

📁 mega88的无线bootload, 无线芯片cc1100,支持flash读写, eeprom读写, 编译环境IAR for AVR 4.20
💻 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 + -