📄 main.c
字号:
break;
default:
tx_buf[7] = 0x00; // send dummy value for not supported parameters
break;
}
}
void cmdSetParameter(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
SetParameter(); //set selected parameter
tx_buf[5] = CMD_SET_PARAMETER;
tx_buf[6] = STATUS_CMD_OK;
}
void cmdReadSignatureIsp(void)
{
tx_buf[5] = CMD_READ_SIGNATURE_ISP;
ReadfusebitIsp();
}
void cmdEnterProgmodeIsp(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
EnterProgmodeIsp();
}
void cmdLeaveProgmodeIsp(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
DDRB&=31; //leave spi pins High ampedance
reset_DDR&=~_BV(reset);
PORTB&=31; //leave spi pins High ampedance
reset_PORT&=~_BV(reset);
tx_buf[5] = CMD_LEAVE_PROGMODE_ISP;
tx_buf[6] = STATUS_CMD_OK;
}
void cmdreadosccalisp(void)
{
tx_buf[5] = CMD_READ_OSCCAL_ISP; //read osccal byte
ReadfusebitIsp();
}
void cmdreadlockisp(void)
{
tx_buf[5] = CMD_READ_LOCK_ISP; //read lock bits
ReadfusebitIsp();
}
void cmdreadfuseisp(void)
{
tx_buf[5] = CMD_READ_FUSE_ISP; //read fuse bits
ReadfusebitIsp();
}
void cmdprogramlockisp(void)
{
programfuseisp(); //program lock bits
tx_buf[5] =CMD_PROGRAM_LOCK_ISP;
}
void cmdprogramfuseisp(void)
{
programfuseisp();
tx_buf[5] = CMD_PROGRAM_FUSE_ISP; //program fuse bits
}
void cmdspimulti(void)
{
int j;
tx_buf[messagesize1]=rx_buf[7]/256; // set message length
tx_buf[messagesize0]=rx_buf[7]+3;
tx_buf[5] = CMD_SPI_MULTI;
tx_buf[6] = STATUS_CMD_OK;
for(j=0;j<rx_buf[7];j++)
{
tx_buf[j+7]=0x22; //data send back
}
tx_buf[rx_buf[7]+7] = STATUS_CMD_OK;
}
void cmdchiperaseisp(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
tx_buf[5] = CMD_CHIP_ERASE_ISP;
tx_buf[6] = STATUS_CMD_OK;
spi(rx_buf[8]); //erase dvice
spi(rx_buf[9]);
spi(rx_buf[10]);
spi(rx_buf[11]);
delay_ms(rx_buf[6]);
}
void cmdprogramflashisp(void)
{
int a,b;
long add;
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
tx_buf[5] = CMD_PROGRAM_FLASH_ISP;
tx_buf[6] = STATUS_CMD_OK;
if(extended_address) //flash with large memory
{
spi(0x4d);
spi(0);
spi(address_flash>>16);
spi(0);
}
b=rx_buf[6]*256+rx_buf[7];
add=address_flash;
for(a=0;a<b;a+=2)
{
spi(rx_buf[10]); //load Program Memory
spi(address_flash>>8);
spi(address_flash);
spi(rx_buf[a+15]);
spi(rx_buf[10]|8); //load Program Memory
spi(0);
spi(address_flash);
spi(rx_buf[a+16]);
address_flash++;
}
if(rx_buf[8]&0x80)
{
spi(rx_buf[11]); //write program memory
spi(add>>8);
spi(add);
spi(0);
delay_ms(rx_buf[9]);
}
}
void cmdloadaddress(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
address_eeprom = rx_buf[8]*256+rx_buf[9]; //set eeprom address
address_flash = (rx_buf[7]*65536+rx_buf[8]*256+rx_buf[9])*2; //set flash word address
if(rx_buf[6]&0x80)
extended_address=1; //bit 31 is true so extended read should executed
tx_buf[5] = CMD_LOAD_ADDRESS;
tx_buf[6] = STATUS_CMD_OK;
}
void cmdreadflashisp(void)
{
int j,k;
k=rx_buf[6]*256+rx_buf[7];
j=k+3;
tx_buf[messagesize1]=(unsigned char) (j >> 8); // set message length
tx_buf[messagesize0]=(unsigned char) (j & 0xFF);
tx_buf[5] = CMD_READ_FLASH_ISP;
tx_buf[6] = STATUS_CMD_OK;
if(extended_address) //flash with large memory
{
spi(0x4d);
spi(0);
spi(address_flash>>16);
spi(0);
}
for(j=0;j<k;j+=2)
{
spi(rx_buf[8]);
spi(address_flash>>8);
spi(address_flash);
tx_buf[j+7]=spi(0xff);
spi(rx_buf[8]|8);
spi(address_flash>>8);
spi(address_flash);
tx_buf[j+8]=spi(0xff);
address_flash++;
}
tx_buf[k+7] = STATUS_CMD_OK;
}
void cmdprogrameepromisp(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
tx_buf[5] = CMD_PROGRAM_EEPROM_ISP;
tx_buf[6] = STATUS_CMD_OK;
int a,b;
unsigned char c,d;
b=rx_buf[6]*256+rx_buf[7]; //eeprom nData bytes
for(a=0;a<b;a++)
{
spi(0xa0); //read eeprom if differ then write
spi(address_eeprom>>8);
spi(address_eeprom);
c=spi(0xff);
d=rx_buf[a+15]^c;
if(d)
{
spi(rx_buf[10]); //write Program Memory
spi(address_eeprom>>8);
spi(address_eeprom);
spi(rx_buf[a+15]);
delay_ms(rx_buf[9]);
}
address_eeprom++;
}
}
void cmdreadeepromisp(void)
{
int j,k;
k=rx_buf[6]*256+rx_buf[7];
j=k+3;
tx_buf[messagesize1]=(unsigned char) (j >> 8); // set message length
tx_buf[messagesize0]=(unsigned char) (j & 0xFF);
tx_buf[5] = CMD_READ_EEPROM_ISP;
tx_buf[6] = STATUS_CMD_OK;
k=rx_buf[6]*256+rx_buf[7];
for(j=0;j<k;j++)
{
spi(rx_buf[8]);
spi(address_eeprom>>8);
spi(address_eeprom);
tx_buf[j+7]=spi(0xff);
address_eeprom++;
}
tx_buf[k+7] = STATUS_CMD_OK;
}
void cmdosccal(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=2;
tx_buf[5] = CMD_OSCCAL;
tx_buf[6] = STATUS_CMD_OK;
}
void delay_ms(int time)
{
while(time--)
_delay_ms(1);
}
char spi(char data)
{
SPDR = data;
/* Wait for transmission complete */
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
/* Return data register */
return SPDR;
}
void EnterProgmodeIsp(void)
{
char tmp;
tx_buf[5] = CMD_ENTER_PROGMODE_ISP;
DDRB|=0xB0; //set spi pins out put
reset_DDR|=_BV(reset);
sck_port &=~_BV(sck); //clear sck
delay_ms(rx_buf[7]+rx_buf[8]);
if(rx_buf[11]==0x53) //this is avr set reset
{
reset_PORT &= ~_BV(reset); //reset 0
delay_ms(rx_buf[8]);
delay_ms(10);
spi(rx_buf[13]);
delay_ms(rx_buf[10]);
spi(rx_buf[14]);
delay_ms(rx_buf[10]);
tmp=spi(rx_buf[15]);
delay_ms(rx_buf[10]);
spi(rx_buf[16]);
if(tmp==0x53)
{
tx_buf[6] = STATUS_CMD_OK;
}
else tx_buf[6] = STATUS_CMD_FAILED;
}
if(rx_buf[11]==0x69) //this is 89s51 set reset
{
reset_PORT |= _BV(reset); //reset 1
delay_ms(rx_buf[8]);
delay_ms(10);
spi(rx_buf[13]);
delay_ms(rx_buf[10]);
spi(rx_buf[14]);
delay_ms(rx_buf[10]);
spi(rx_buf[15]);
delay_ms(rx_buf[10]);
tmp=spi(rx_buf[16]);
if(tmp==0x69)
{
tx_buf[6] = STATUS_CMD_OK;
}
else tx_buf[6] = STATUS_CMD_FAILED;
}
}
void ReadfusebitIsp(void)
{
char k[4];
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=4;
tx_buf[6] = STATUS_CMD_OK;
k[0]=spi(rx_buf[7]);
k[1]=spi(rx_buf[8]);
k[2]=spi(rx_buf[9]);
k[3]=spi(rx_buf[10]);
tx_buf[7]=k[rx_buf[6]-1];
tx_buf[8] = STATUS_CMD_OK;
}
void programfuseisp(void)
{
tx_buf[messagesize1]=0; // set message length
tx_buf[messagesize0]=3;
spi(rx_buf[6]);
spi(rx_buf[7]);
spi(rx_buf[8]);
spi(rx_buf[9]);
tx_buf[6] = STATUS_CMD_OK;
tx_buf[7] = STATUS_CMD_OK;
}
void SetParameter(void)
{
switch(rx_buf[6])
{
case PARAM_OSC_PSCALE:
{
TCCR1B=0x08|(0x03&rx_buf[7]);
pscalefsys=rx_buf[7]; // Set timer operation mode and prescaler
}
break;
case PARAM_OSC_CMATCH:
{
OCR1AL=rx_buf[7];
cmatchdef=rx_buf[7]; //Set compare match value
}
break;
case PARAM_SCK_DURATION:
{
SPCR=0x50;
SPCR|=(0x3&rx_buf[7]); //set spi clock
sckdurationdef=(0x3&rx_buf[7]);
}
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -