📄 uart.lis
字号:
01BC ; }
01BC ; //increment (word) address only when we have an uneven (byte) address
01BC ; if(i&1) address++;
01BC ; }
01BC ; }
01BC ; //Page Mode
01BC ; else
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 ; //We have to check if we have an uneven byte.
01BC ; //Set the polling address to a byte address
01BC ; //so that we can poll the right location
01BC ; polling_address = (address&0xFFFF)*2;
01BC ; if(i&1) polling_address++;
01BC ; }
01BC ;
01BC ; //increment (word) address only when we have an uneven (byte) address
01BC ; if(i&1) address++;
01BC ; }
01BC ; //If this page is complete the bit 7 of mode will be set and we programm the page
01BC ; if(mode&0x80) //页编程,并且选择等待的方式
01BC ; {
01BC ; SPIWrite(msg_buffer[6]);
01BC ; SPIWrite16(start_address);
01BC ; SPIWrite(0x00);
01BC ; //If we have no valid polling address switch to simple wait mode
01BC ; if(polling_address==0)
01BC ; {
01BC ; mode = (mode&(~0x70)) | 0x10;
01BC ; }
01BC ; //Different polling methods
01BC ; //Hard waiting
01BC ; if((mode&0x70) == 0x10)
01BC ; {
01BC ; msDelay(msg_buffer[4]);
01BC ; }
01BC ; //Data polling
01BC ; else if((mode&0x70) == 0x20)
01BC ; {
01BC ; do{
01BC ; //If we have an uneven byte read the
01BC ; //high byte
01BC ; if(polling_address%2)
01BC ; {
01BC ; SPIWrite(msg_buffer[7]|(1<<3));
01BC ; }
01BC ; else
01BC ; {
01BC ; SPIWrite(msg_buffer[7]);
01BC ; }
01BC ; SPIWrite16(polling_address/2);
01BC ; tmp=SPIWrite(0x00);
01BC ; }while(tmp==msg_buffer[8]);
01BC ; }
01BC ; //RDY/BSY polling
01BC ; else if((mode&0x70) == 0x40)
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]);
01BC ; }
01BC ; }
01BC ; }
01BC ; num_bytes = 2;
01BC ; msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
01BC ; }
01BC ; //命令CMD_READ_FLASH_ISP
01BC ; else if(cmd==CMD_READ_FLASH_ISP)
01BC ; {
01BC ; LED_FLASH2;
01BC ; block_size = ((unsigned int)msg_buffer[1])<<8;
01BC ; block_size |= msg_buffer[2];
01BC ; tmp = msg_buffer[3];
01BC ;
01BC ; for(i=0;i<block_size;i++)
01BC ; {
01BC ; //Select Low or High-Byte
01BC ; if(i&1)
01BC ; {
01BC ; SPIWrite(tmp|(1<<3));
01BC ; }
01BC ; else
01BC ; {
01BC ; SPIWrite(tmp);
01BC ; }
01BC ;
01BC ; SPIWrite16(address&0xFFFF);
01BC ; msg_buffer[i+2] = SPIWrite(0);
01BC ; //increment (word) address only when we have an uneven (byte) address
01BC ; if(i&1) address++;
01BC ; }
01BC ;
01BC ; num_bytes = block_size+3;
01BC ; msg_buffer[0] = CMD_READ_FLASH_ISP;
01BC ; msg_buffer[1] = STATUS_CMD_OK;
01BC ; msg_buffer[block_size+2] = STATUS_CMD_OK;
01BC ; }
01BC ; //命令CMD_PROGRAM_EEPROM_ISP
01BC ; else if(cmd==CMD_PROGRAM_EEPROM_ISP)
01BC ; {
01BC ; block_size = ((unsigned int)msg_buffer[1])<<8;
01BC ; block_size |= msg_buffer[2];
01BC ; mode = msg_buffer[3];
01BC ;
01BC ; //Byte Mode
01BC ; if((mode&1) == 0)
01BC ; {
01BC ; for(i=0;i<block_size;i++)
01BC ; {
01BC ; LED_FLASH2;
01BC ; SPIWrite(msg_buffer[5]);
01BC ; SPIWrite16(address&0xFFFF);
01BC ; SPIWrite(msg_buffer[i+10]);
01BC ;
01BC ; //Check if we can do polling
01BC ; if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
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 ;
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 ; SPIWrite(msg_buffer[7]);
01BC ; SPIWrite16(polling_address);
01BC ; tmp=SPIWrite(0x00);
01BC ; }while((tmp==msg_buffer[8])||(tmp==msg_buffer[9]));
01BC ; }
01BC ; //RDY/BSY polling
01BC ; else if((mode&0x0E) == 0x08)
01BC ; {
01BC ; while(universalComm(0xF0,0x00,0x00,0x00)&1);
01BC ; //while(spi_transfer_32(0xF0000000)&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]);
01BC ; }
01BC ;
01BC ; //increment address
01BC ; address++;
01BC ; }
01BC ; }
01BC ; //Page Mode
01BC ; else
01BC ; {
01BC ;
01BC ; for(i=0;i<block_size;i++)
01BC ; {
01BC ; LED_FLASH2;
01BC ; SPIWrite(msg_buffer[5]);
01BC ; SPIWrite16(address&0xFFFF);
01BC ; SPIWrite(msg_buffer[i+10]);
01BC ; //Check if we can do polling
01BC ; if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
01BC ; {
01BC ; polling_address = address&0xFFFF;
01BC ; }
01BC ;
01BC ; //increment (word) address only when we have an uneven (byte) address
01BC ; address++;
01BC ; }
01BC ;
01BC ; //If this page is complete the bit 7 of mode will be set and we programm the page
01BC ; if(mode&0x80)
01BC ; {
01BC ; SPIWrite(msg_buffer[6]);
01BC ; SPIWrite16(start_address&0xFFFF);
01BC ; SPIWrite(0);
01BC ;
01BC ; //If we have no valid polling address switch to simple wait mode
01BC ; if(polling_address==0)
01BC ; {
01BC ; mode = (mode&(~0x70)) | 0x10;
01BC ; }
01BC ;
01BC ; //Different polling methods
01BC ; //Hard waiting
01BC ; if((mode&0x70) == 0x10)
01BC ; {
01BC ; msDelay(msg_buffer[4]);
01BC ; }
01BC ; //Data polling
01BC ; else if((mode&0x70) == 0x20)
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&0x70) == 0x40)
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]);
01BC ; }
01BC ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -