📄 main.c
字号:
}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 address
spi_transfer_16(j);
dat_buf[i]=spi_transfer_8(0x00);
spi_transfer_8(0x28); //High-Byte in address
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 address
else spi_transfer_8(0x28); //High-Byte in address
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!!! Cmnd_STK_UNIVERSAL is used while ISP
//////////////////////////////////////
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!!! Cmnd_STK_UNIVERSAL is used while ISP
//////////////////////////////////////
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!!! Cmnd_STK_UNIVERSAL is used while ISP
//////////////////////////////////////
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);
//Try 32 times to comunicate with the chip (for all 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 requests special care
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_FAILED);
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);
}
//////////////////////////////////////
// Reception of a byte block
// input parameter
//
// Is n positive n byte are read an put into dat_buf. j has to be 0 before reading (used as index)
// After reception of n bytes n_state is written into state.
//
// If n is negative abs(n) bytes are read to determine the packet length
// The result is stored in n_tmp
// If the packet length is read n_tmp is copied into n, j will be added to n and j is set to 0.
// With this you can regard fixed parameters.
//
//////////////////////////////////////
else if(state==FILL_BUFFER)
{
if(n>0) //read fixed packet length
{
dat_buf[j++]=t;
n--;
if(!n) state=n_state;
}
else //determine length from command
{
dat_buf[j++]=t;
n_tmp<<=8;
n_tmp|=t&0xFF;
n++;
if(!n) n=n_tmp+n_add;
}
}
}//if(rec...
}//while(2)
return 0;
}
/**
Hardware initialization
Timer
ADC
*/
void chip_init(void)
{
DDRB=(1<<0)|(1<<1)|(1<<2); //LED_RT, LED_GN
DDRC=(1<<1)|(1<<2); //USB_RD, USB_WR
//ADC
ADMUX=0x60; //Avcc=Aref, Left Adjusted (8Bit-Aufl鰏ung aus ADCH)
ADCSRA = 0xC6; //ADC Enable, Init, 125kHz (bei 8MHz Clock)
//Timer 1 (Systemint 1ms)
TCCR1B=0x09; //CTC-Mode /1
OCR1A=8000; //8MHz / 8000 = 1kHz
TIMSK|=(1<<OCIE1A); //enable OC-INT
}
/**
Returns the value of the selected adc channel
@param n Number of ADC channel
@return Value of ADC channel
*/
unsigned char adc_get(char n)
{
ADMUX&=0xF0;
ADMUX|=n&0x7;
while(ADCSRA&0x40);
ADCSRA|=(1<<ADSC);
while(ADCSRA&0x40);
return ADCH;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -