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