📄 uart.lis
字号:
01BC ; if(EEPROMread(EEP_SCK_DURATION)!=clockSpeed)
01BC ; EEPROMwrite(EEP_SCK_DURATION,clockSpeed);
01BC ; //spi_set_speed(clock_speed); //因为我这里不用硬件SPI
01BC ; break;
01BC ; case PARAM_RESET_POLARITY: //区分51和AVR用的,1表示AVR 0表示AT89C
01BC ; if(resetPolarity != msg_buffer[2])
01BC ; {
01BC ; resetPolarity = msg_buffer[2];
01BC ; EEPROMwrite(EEP_RESET_POLARITY,resetPolarity);
01BC ; }
01BC ; break;
01BC ; case PARAM_CONTROLLER_INIT:
01BC ; paramControllerInit = msg_buffer[2];
01BC ; break;
01BC ; case PARAM_VADJUST:
01BC ; vAdjust = msg_buffer[2];
01BC ; EEPROMwrite(EEP_VOL_ADJUST,vAdjust);
01BC ; break;
01BC ; case PARAM_VTARGET:
01BC ; vTarget = msg_buffer[2];
01BC ; EEPROMwrite(EEP_VOL_TARGET,vTarget);
01BC ; asm("jmp 0x17FF");
01BC ; break;
01BC ; default:break;
01BC ; }
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_SET_PARAMETER;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_GET_PARAMETER
01BC ; else if(cmd==CMD_GET_PARAMETER)
01BC ; {
01BC ; switch(msg_buffer[1])
01BC ; {
01BC ; case PARAM_BUILD_NUMBER_LOW:
01BC ; tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
01BC ; break;
01BC ; case PARAM_BUILD_NUMBER_HIGH:
01BC ; tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
01BC ; break;
01BC ; case PARAM_HW_VER:
01BC ; tmp = CONFIG_PARAM_HW_VER;
01BC ; break;
01BC ; case PARAM_SW_MAJOR:
01BC ; tmp = CONFIG_PARAM_SW_MAJOR;
01BC ; break;
01BC ; case PARAM_SW_MINOR:
01BC ; tmp = CONFIG_PARAM_SW_MINOR;
01BC ; break;
01BC ; case PARAM_SCK_DURATION:
01BC ; tmp = clockSpeed;
01BC ; break;
01BC ; case PARAM_RESET_POLARITY:
01BC ; tmp = resetPolarity;
01BC ; break;
01BC ; case PARAM_CONTROLLER_INIT:
01BC ; tmp = paramControllerInit;
01BC ; break;
01BC ; case PARAM_VTARGET: //目标电压
01BC ; tmp = vTarget;
01BC ; break;
01BC ; case PARAM_VADJUST:
01BC ; tmp = vAdjust; //参考电压
01BC ; break;
01BC ; case PARAM_TOPCARD_DETECT:
01BC ; tmp = TOP_CARD_STK520;
01BC ; break;
01BC ; }
01BC ; num_bytes = 3;
01BC ; msg_buffer[0] = CMD_GET_PARAMETER;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; msg_buffer[2] = tmp;
01BC ; }
01BC ; //命令CMD_OSCCAL
01BC ; else if(cmd==CMD_OSCCAL)
01BC ; {
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_OSCCAL;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_LOAD_ADDRESS
01BC ; else if(cmd==CMD_LOAD_ADDRESS)
01BC ; {
01BC ; address = ((unsigned long)msg_buffer[1])<<24;
01BC ; address |= ((unsigned long)msg_buffer[2])<<16;
01BC ; address |= ((unsigned long)msg_buffer[3])<<8;
01BC ; address |= ((unsigned long)msg_buffer[4]);
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_LOAD_ADDRESS;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_FIRMWARE_UPGRADE
01BC ; else if(cmd==CMD_FIRMWARE_UPGRADE)
01BC ; {
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_FIRMWARE_UPGRADE;
01BC ; //msg_buffer[1] = STATUS_CMD_OK;
01BC ; msg_buffer[1] = STATUS_CMD_FAILED;
01BC ; asm("jmp 0x17FF");
01BC ; //进入Firmware upgrade模式
01BC ; }
01BC ; //命令CMD_ENTER_PROGMODE_ISP
01BC ; else if(cmd == CMD_ENTER_PROGMODE_ISP)
01BC ; {
01BC ; prgMode=1;
01BC ; spiEnable();
01BC ; msDelay(msg_buffer[2]);
01BC ; LED_ON2;
01BC ; for(i=0;i<msg_buffer[4];i++)
01BC ; {
01BC ; SPIWrite(msg_buffer[8]);
01BC ; msDelay(msg_buffer[5]);
01BC ; SPIWrite(msg_buffer[9]);
01BC ; msDelay(msg_buffer[5]);
01BC ; if(msg_buffer[7]==3) //AVR
01BC ; {
01BC ; tmp=SPIWrite(msg_buffer[10]);
01BC ; msDelay(msg_buffer[5]);
01BC ; SPIWrite(msg_buffer[11]);
01BC ; msDelay(msg_buffer[5]);
01BC ; }
01BC ; else //AT89S
01BC ; {
01BC ; SPIWrite(msg_buffer[10]);
01BC ; msDelay(msg_buffer[5]);
01BC ; tmp=SPIWrite(msg_buffer[11]);
01BC ; msDelay(msg_buffer[5]);
01BC ; }
01BC ; if((tmp==msg_buffer[6])||(msg_buffer[7]==0))
01BC ; {
01BC ; i=0xFF;
01BC ; LED_OFF2;
01BC ; break;
01BC ; }
01BC ; else
01BC ; {
01BC ; spiEnable();
01BC ; msDelay(msg_buffer[2]);
01BC ; }
01BC ; }
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
01BC ; if(i==0xFF)
01BC ; {
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; else
01BC ; {
01BC ; msg_buffer[1] = STATUS_CMD_FAILED;
01BC ; }
01BC ; }
01BC ; //命令 CMD_LEAVE_PROGMODE_ISP
01BC ; else if(cmd==CMD_LEAVE_PROGMODE_ISP)
01BC ; {
01BC ; prgMode=0;
01BC ; spiDisable();
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_CHIP_ERASE_ISP
01BC ; else if(cmd==CMD_CHIP_ERASE_ISP)
01BC ; {
01BC ; universalComm(msg_buffer[3],msg_buffer[4],msg_buffer[5],msg_buffer[6]);
01BC ; //Newer AVR's seems to have a busy bit
01BC ; //cant test this because I don't have any of these new chips
01BC ; if(msg_buffer[2]==0)
01BC ; {
01BC ; msDelay(msg_buffer[1]);
01BC ; }
01BC ; else //if(msg_buffer[2]==1)
01BC ; {
01BC ; while(universalComm(0xF0,0x00,0x00,0x00)&1);
01BC ; }
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_CHIP_ERASE_ISP;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_PROGRAM_FLASH_ISP
01BC ; else if(cmd==CMD_PROGRAM_FLASH_ISP)
01BC ; {
01BC ; block_size = ((unsigned int)msg_buffer[1])<<8;
01BC ; block_size |= msg_buffer[2];
01BC ; mode = msg_buffer[3];
01BC ; LED_FLASH2;
01BC ; //如果是字写模式
01BC ; if((mode&1) == 0)
01BC ; {
01BC ; for(i=0;i<block_size;i++)
01BC ; {
01BC ; //If we have an uneven byte programm the
01BC ; //high byte
01BC ; if(i&1)
01BC ; {
01BC ; SPIWrite(msg_buffer[5]|(1<<3));
01BC ; }
01BC ; else
01BC ; {
01BC ; SPIWrite(msg_buffer[5]);
01BC ; }
01BC ; SPIWrite16(address);
01BC ; SPIWrite(msg_buffer[i+10]);
01BC ; //Check if we can do polling
01BC ; if(msg_buffer[8]!=msg_buffer[i+10])
01BC ; {
01BC ; polling_address = address&0xFFFF;
01BC ; }
01BC ; //If not switch the mode hard waiting
01BC ; else
01BC ; {
01BC ; mode = (mode&(~0x0E)) | 0x02;
01BC ; }
01BC ; //Different polling methods
01BC ; //Hard waiting
01BC ; if((mode&0x0E) == 0x02)
01BC ; {
01BC ; msDelay(msg_buffer[4]);
01BC ; }
01BC ; //Data polling
01BC ; else if((mode&0x0E) == 0x04)
01BC ; {
01BC ; do{
01BC ; //If we have an uneven byte read the
01BC ; //high byte
01BC ; if(i&1)
01BC ; {
01BC ; SPIWrite(msg_buffer[7]|(1<<3));
01BC ; }
01BC ; else
01BC ; {
01BC ; SPIWrite(msg_buffer[7]);
01BC ; }
01BC ; SPIWrite16(polling_address);
01BC ; tmp=SPIWrite(0x00);
01BC ; }while(tmp==msg_buffer[8]);
01BC ; }
01BC ; //RDY/BSY polling
01BC ; else if((mode&0x0E) == 0x08)
01BC ; {
01BC ; while(universalComm(0xF0,0x00,0x00,0x00)&1);
01BC ; }
01BC ; //If something was not correct with the given mode do
01BC ; //hard waiting. Should never reach this point
01BC ; else
01BC ; {
01BC ; msDelay(msg_buffer[4]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -