📄 main.c
字号:
if(i&1)
{
spi_transfer_8(msg_buffer[7]|(1<<3));
}
else
{
spi_transfer_8(msg_buffer[7]);
}
spi_transfer_16(polling_address);
tmp=spi_transfer_8(0x00);
}while(tmp==msg_buffer[8]);
}
//RDY/BSY polling
else if((mode&0x0E) == 0x08)
{
while(spi_transfer_32(0xF0000000)&1);
}
//If something was not correct with the given mode do
//hard waiting. Should never reach this point
else
{
wait_ms(msg_buffer[4]);
}
//increment (word) address only when we have an uneven (byte) address
if(i&1) address++;
}
}
//Page Mode
else
{
for(i=0;i<block_size;i++)
{
//If we have an uneven byte programm the
//high byte
if(i&1)
{
spi_transfer_8(msg_buffer[5]|(1<<3));
}
else
{
spi_transfer_8(msg_buffer[5]);
}
spi_transfer_16(address&0xFFFF);
spi_transfer_8(msg_buffer[i+10]);
//Check if we can do polling
if(msg_buffer[8]!=msg_buffer[i+10])
{
//We have to check if we have an uneven byte.
//Set the polling address to a byte address
//so that we can poll the right location
polling_address = (address&0xFFFF)*2;
if(i&1) polling_address++;
}
//increment (word) address only when we have an uneven (byte) address
if(i&1) address++;
}
//If this page is complete the bit 7 of mode will be set and we programm the page
if(mode&0x80)
{
spi_transfer_8(msg_buffer[6]);
spi_transfer_16(start_address&0xFFFF);
spi_transfer_8(0);
//If we have no valid polling address switch to simple wait mode
if(polling_address==0)
{
mode = (mode&(~0x70)) | 0x10;
}
//Different polling methods
//Hard waiting
if((mode&0x70) == 0x10)
{
wait_ms(msg_buffer[4]);
}
//Data polling
else if((mode&0x70) == 0x20)
{
do{
//If we have an uneven byte read the
//high byte
if(polling_address%2)
{
spi_transfer_8(msg_buffer[7]|(1<<3));
}
else
{
spi_transfer_8(msg_buffer[7]);
}
spi_transfer_16(polling_address/2);
tmp=spi_transfer_8(0x00);
}while(tmp==msg_buffer[8]);
}
//RDY/BSY polling
else if((mode&0x70) == 0x40)
{
while(spi_transfer_32(0xF0000000)&1);
}
//If something was not correct with the given mode do
//hard waiting. Should never reach this point
else
{
wait_ms(msg_buffer[4]);
}
}
}
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_FLASH_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_FLASH_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
tmp = msg_buffer[3];
for(i=0;i<block_size;i++)
{
//Select Low or High-Byte
if(i&1)
{
spi_transfer_8(tmp|(1<<3));
}
else
{
spi_transfer_8(tmp);
}
spi_transfer_16(address&0xFFFF);
msg_buffer[i+2] = spi_transfer_8(0);
//increment (word) address only when we have an uneven (byte) address
if(i&1) address++;
}
num_bytes = block_size+3;
msg_buffer[0] = CMD_READ_FLASH_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[block_size+2] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_PROGRAM_EEPROM_ISP
//////////////////////////////////////
else if(cmd==CMD_PROGRAM_EEPROM_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
mode = msg_buffer[3];
//Byte Mode
if((mode&1) == 0)
{
for(i=0;i<block_size;i++)
{
spi_transfer_8(msg_buffer[5]);
spi_transfer_16(address&0xFFFF);
spi_transfer_8(msg_buffer[i+10]);
//Check if we can do polling
if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
{
polling_address = address&0xFFFF;
}
//If not switch the mode hard waiting
else
{
mode = (mode&(~0x0E)) | 0x02;
}
//Different polling methods
//Hard waiting
if((mode&0x0E) == 0x02)
{
wait_ms(msg_buffer[4]);
}
//Data polling
else if((mode&0x0E) == 0x04)
{
do{
spi_transfer_8(msg_buffer[7]);
spi_transfer_16(polling_address);
tmp=spi_transfer_8(0x00);
}while((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
}
//RDY/BSY polling
else if((mode&0x0E) == 0x08)
{
while(spi_transfer_32(0xF0000000)&1);
}
//If something was not correct with the given mode do
//hard waiting. Should never reach this point
else
{
wait_ms(msg_buffer[4]);
}
//increment address
address++;
}
}
//Page Mode
else
{
for(i=0;i<block_size;i++)
{
spi_transfer_8(msg_buffer[5]);
spi_transfer_16(address&0xFFFF);
spi_transfer_8(msg_buffer[i+10]);
//Check if we can do polling
if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
{
polling_address = address&0xFFFF;
}
//increment (word) address only when we have an uneven (byte) address
address++;
}
//If this page is complete the bit 7 of mode will be set and we programm the page
if(mode&0x80)
{
spi_transfer_8(msg_buffer[6]);
spi_transfer_16(start_address&0xFFFF);
spi_transfer_8(0);
//If we have no valid polling address switch to simple wait mode
if(polling_address==0)
{
mode = (mode&(~0x70)) | 0x10;
}
//Different polling methods
//Hard waiting
if((mode&0x70) == 0x10)
{
wait_ms(msg_buffer[4]);
}
//Data polling
else if((mode&0x70) == 0x20)
{
do{
//If we have an uneven byte read the
//high byte
if(i&1)
{
spi_transfer_8(msg_buffer[7]|(1<<3));
}
else
{
spi_transfer_8(msg_buffer[7]);
}
spi_transfer_16(polling_address);
tmp=spi_transfer_8(0x00);
}while(tmp==msg_buffer[8]);
}
//RDY/BSY polling
else if((mode&0x70) == 0x40)
{
while(spi_transfer_32(0xF0000000)&1);
}
//If something was not correct with the given mode do
//hard waiting. Should never reach this point
else
{
wait_ms(msg_buffer[4]);
}
}
}
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_EEPROM_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_EEPROM_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_EEPROM_ISP)
{
block_size = ((unsigned int)msg_buffer[1])<<8;
block_size |= msg_buffer[2];
tmp = msg_buffer[3];
for(i=0;i<block_size;i++)
{
//Select Low or High-Byte
spi_transfer_8(tmp);
spi_transfer_16(address&0xFFFF);
msg_buffer[i+2] = spi_transfer_8(0);
//increment address
address++;
}
num_bytes = block_size+3;
msg_buffer[0] = CMD_READ_EEPROM_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[block_size+2] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_PROGRAM_FUSE_ISP
//////////////////////////////////////
else if(cmd==CMD_PROGRAM_FUSE_ISP)
{
tmp = spi_transfer_8(msg_buffer[1]);
tmp = spi_transfer_8(msg_buffer[2]);
tmp = spi_transfer_8(msg_buffer[3]);
tmp = spi_transfer_8(msg_buffer[4]);
num_bytes = 3;
msg_buffer[0] = CMD_PROGRAM_FUSE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_FUSE_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_FUSE_ISP)
{
tmp = spi_transfer_8(msg_buffer[2]);
if(msg_buffer[1] == 1) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[3]);
if(msg_buffer[1] == 2) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[4]);
if(msg_buffer[1] == 3) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[5]);
if(msg_buffer[1] == 4) msg_buffer[2] = tmp;
num_bytes = 4;
msg_buffer[0] = CMD_READ_FUSE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_PROGRAM_LOCK_ISP
//////////////////////////////////////
else if(cmd==CMD_PROGRAM_LOCK_ISP)
{
tmp = spi_transfer_8(msg_buffer[1]);
tmp = spi_transfer_8(msg_buffer[2]);
tmp = spi_transfer_8(msg_buffer[3]);
tmp = spi_transfer_8(msg_buffer[4]);
num_bytes = 3;
msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_LOCK_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_LOCK_ISP)
{
tmp = spi_transfer_8(msg_buffer[2]);
if(msg_buffer[1] == 1) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[3]);
if(msg_buffer[1] == 2) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[4]);
if(msg_buffer[1] == 3) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[5]);
if(msg_buffer[1] == 4) msg_buffer[2] = tmp;
num_bytes = 4;
msg_buffer[0] = CMD_READ_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_SIGNATURE_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_SIGNATURE_ISP)
{
tmp = spi_transfer_8(msg_buffer[2]);
if(msg_buffer[1] == 1) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[3]);
if(msg_buffer[1] == 2) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[4]);
if(msg_buffer[1] == 3) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[5]);
if(msg_buffer[1] == 4) msg_buffer[2] = tmp;
num_bytes = 4;
msg_buffer[0] = CMD_READ_SIGNATURE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//////////////////////////////////////
//CMD_READ_OSCCAL_ISP
//////////////////////////////////////
else if(cmd==CMD_READ_OSCCAL_ISP)
{
tmp = spi_transfer_8(msg_buffer[2]);
if(msg_buffer[1] == 1) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[3]);
if(msg_buffer[1] == 2) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[4]);
if(msg_buffer[1] == 3) msg_buffer[2] = tmp;
tmp = spi_transfer_8(msg_buffer[5]);
if(msg_buffer[1] == 4) msg_buffer[2] = tmp;
num_bytes = 4;
msg_buffer[0] = CMD_READ_OSCCAL_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//Transmission of the result
if(num_bytes>0)
{
interface_putc(MESSAGE_START);
interface_putc(seq_num);
interface_put16(num_bytes);
interface_putc(TOKEN);
for(i=0;i<num_bytes;i++)
{
interface_putc(msg_buffer[i]);
}
interface_send_check();
}
}
/**
Hardware initialization
Timer
ADC
*/
void chip_init(void)
{
PORTC=0;
DDRB=(1<<2); //LED_RT, LED_GN
DDRC=(1<<0)|(1<<1);
//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
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -