📄 main.c
字号:
{
tmp1=avr_dev.flashpollval1;
tmp2=avr_dev.flashpollval2;
//High und Low-Byte
for(j=0;j<0x09;j+=0x08)
{
tmp=dat_buf[i+3+(j>>3)];
spi_transfer_8(0x40|j);
spi_transfer_16(address);
spi_transfer_8(tmp);
if(avr_dev.devicecode==AT90S1200)
{
wait_ms(20);
}
else
{
//Polling oder hartes warten?
if((tmp!=tmp1)&&(tmp!=tmp2))
{
do{
spi_transfer_8(0x20|j);
spi_transfer_16(address);
tmp=spi_transfer_8(0x00);
}while((tmp==tmp1)||(tmp==tmp2));
}
else wait_ms(9);
}
}
address++;
}
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
}
else //EEPROM
{
for(i=0;i<n_tmp;i++)
{
tmp=dat_buf[i+3];
tmp1=avr_dev.eeprompollval1;
tmp2=avr_dev.eeprompollval2;
if((tmp!=tmp1)&&(tmp!=tmp2))
{
spi_transfer_8(0xC0);
spi_transfer_16(address);
spi_transfer_8(tmp);
do{
spi_transfer_8(0xA0);
spi_transfer_16(address);
tmp=spi_transfer_8(0x00);
}while((tmp==tmp1)||(tmp==tmp2));
}
else
{
spi_transfer_8(0xC0);
spi_transfer_16(address);
spi_transfer_8(tmp);
wait_ms(9);
}
address++;
}
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
LED_GN_TOG;
}
//////////////////////////////////////
//Cmnd_STK_PROG_FLASH !!!DUMMY!!!
//////////////////////////////////////
else if(state==Cmnd_STK_PROG_FLASH)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_PROG_DATA !!!DUMMY!!!
//////////////////////////////////////
else if(state==Cmnd_STK_PROG_DATA)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_PROG_FUSE !!!DUMMY!!!
//////////////////////////////////////
else if(state==Cmnd_STK_PROG_FUSE)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_PROG_LOCK !!!DUMMY!!!
//////////////////////////////////////
else if(state==Cmnd_STK_PROG_LOCK)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_PROG_FUSE_EXT !!!DUMMY!!!
//////////////////////////////////////
else if(state==Cmnd_STK_PROG_FUSE_EXT)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_SIGN
//////////////////////////////////////
else if(state==Cmnd_STK_READ_SIGN)
{
if(t==Sync_CRC_EOP) state = READY;
for(i=0;i<3;i++)
{
spi_transfer_16(0x3000);
spi_transfer_8(i);
dat_buf[i]=spi_transfer_8(0x00);
}
usb_putc(Resp_STK_INSYNC);
for(i=0;i<3;i++) usb_putc(dat_buf[i]);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_PAGE
//////////////////////////////////////
else if(state==Cmnd_STK_READ_PAGE)
{
if(t==Sync_CRC_EOP) state = READY;
n_tmp=dat_buf[0]*256+dat_buf[1];
//Flash
if(dat_buf[2]=='F')
{
for(i=0;i<n_tmp;i+=2)
{
j=address+i/2;
spi_transfer_8(0x20); //Low-Byte in Addresse
spi_transfer_16(j);
dat_buf[i]=spi_transfer_8(0x00);
spi_transfer_8(0x28); //High-Byte in Addresse
spi_transfer_16(j);
dat_buf[i+1]=spi_transfer_8(0x00);
}
address+=n_tmp/2;
}
else //EEPROM
{
for(i=0;i<n_tmp;i++)
{
spi_transfer_8(0xA0);
spi_transfer_16(address);
dat_buf[i]=spi_transfer_8(0x00);
address++;
}
}
LED_GN_TOG;
usb_putc(Resp_STK_INSYNC);
for(i=0;i<n_tmp;i++) usb_putc(dat_buf[i]);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_FLASH
//////////////////////////////////////
else if(state==Cmnd_STK_READ_FLASH)
{
if(t==Sync_CRC_EOP) state = READY;
for(i=0;i<2;i++)
{
if(!i) spi_transfer_8(0x20); //Low-Byte in Addresse
else spi_transfer_8(0x28); //High-Byte in Addresse
spi_transfer_16(address);
dat_buf[i]=spi_transfer_8(0x00);
}
address++;
usb_putc(Resp_STK_INSYNC);
for(i=0;i<2;i++) usb_putc(dat_buf[i]);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_DATA
//////////////////////////////////////
else if(state==Cmnd_STK_READ_DATA)
{
if(t==Sync_CRC_EOP) state = READY;
spi_transfer_8(0xA0);
spi_transfer_16(address);
tmp=spi_transfer_8(0x00);
address++;
usb_putc(Resp_STK_INSYNC);
usb_putc(tmp);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_FUSE !!!DUMMY!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
//////////////////////////////////////
else if(state==Cmnd_STK_READ_FUSE)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(0x00);
usb_putc(0x00);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_LOCK !!!DUMMY!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
//////////////////////////////////////
else if(state==Cmnd_STK_READ_LOCK)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(0x00);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_OSCCAL
//////////////////////////////////////
else if(state==Cmnd_STK_READ_OSCCAL)
{
if(t==Sync_CRC_EOP) state = READY;
tmp=spi_transfer_32(0x38000000);
usb_putc(Resp_STK_INSYNC);
usb_putc(tmp);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_FUSE_EXT !!!DUMMY!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
//////////////////////////////////////
else if(state==Cmnd_STK_READ_FUSE_EXT)
{
if(t==Sync_CRC_EOP) state = READY;
usb_putc(Resp_STK_INSYNC);
usb_putc(0x00);
usb_putc(0x00);
usb_putc(0x00);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_READ_OSCCAL_EXT
//////////////////////////////////////
else if(state==Cmnd_STK_READ_OSCCAL_EXT)
{
if(t==Sync_CRC_EOP) state = READY;
spi_transfer_16(0x3800);
spi_transfer_8(dat_buf[0]);
tmp=spi_transfer_8(0x00);
usb_putc(Resp_STK_INSYNC);
usb_putc(tmp);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_UNIVERSAL
//////////////////////////////////////
else if(state==Cmnd_STK_UNIVERSAL)
{
if(t==Sync_CRC_EOP) state = READY;
for(i=0;i<4;i++) tmp=spi_transfer_8(dat_buf[i]);
usb_putc(Resp_STK_INSYNC);
usb_putc(tmp);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
//Cmnd_STK_UNIVERSAL_MULTI
//////////////////////////////////////
else if(state==Cmnd_STK_UNIVERSAL_MULTI)
{
if(t==Sync_CRC_EOP) state = READY;
n_tmp=dat_buf[0];
for(i=0;i<n_tmp;i++) spi_transfer_8(dat_buf[i+1]);
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
/////////////////////////////////////
//Cmnd_STK_ENTER_PROGMODE
//////////////////////////////////////
else if(state==Cmnd_STK_ENTER_PROGMODE)
{
if(t==Sync_CRC_EOP) state = READY;
prgmode=1;
spi_enable();
wait_ms(30);
//32 Versuche mit dem Chip Kontakt aufzunehmen (f黵 alle excl. AT90S1200)
if(avr_dev.devicecode!=AT90S1200)
{
for(i=0;i<32;i++)
{
spi_transfer_16(0xAC53);
tmp=spi_transfer_8(0x00);
spi_transfer_8(0x00);
if(tmp==0x53)
{
LED_GN_OFF;
LED_RT_ON;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
i=0xFF;
break;
}
spi_clock_pulse();
}
}
//90S1200 will ne extra Behandlung
else
{
spi_transfer_32(0xAC530000);
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
i=0xFF;
}
if(i!=0xFF)
{
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_NODEVICE);
spi_disable();
}
}
//////////////////////////////////////
//Cmnd_STK_LEAVE_PROGMODE
//////////////////////////////////////
else if(state==Cmnd_STK_LEAVE_PROGMODE)
{
if(t==Sync_CRC_EOP) state = READY;
prgmode=0;
spi_disable();
LED_RT_OFF;
LED_GN_ON;
usb_putc(Resp_STK_INSYNC);
usb_putc(Resp_STK_OK);
}
//////////////////////////////////////
// Empfang von einem Byte-Block
// Eingabeparameter:
//
// Ist n positiv werden n Bytes gelesen und in dat_buf geschrieben. j mu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -