📄 stk500.cpp
字号:
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadFlash (unsigned char *data)
{
unsigned char cmd[2];
if (protocol == 2) return false;
cmd[0] = 0x70;
cmd[1] = 0x20;
if (!DoCommand (cmd, 2, 2))
{
return false;
}
else
{
if (bytesrx < 4)
{
return false;
}
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[3] != STK_OK)
{
return false;
}
}
*(data++) = rxdata[1];
*data = rxdata[2];
return true;
}
//---------------------------------------------------------------------------
void __fastcall TSTK500::SetSCKLen (int len)
{
scklen = len;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ChangeSCKLen (void)
{
unsigned char cmd[4];
if (protocol == 2) return false;
cmd[0] = 0x40;
cmd[1] = 0x89;
cmd[2] = (unsigned char)scklen;
cmd[3] = 0x20;
if (!DoCommand (cmd, 4, 2)) return false;
else
{
if (rxdata[0] != STK_INSYNC) return false;
else if (rxdata[1] != STK_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ChangeSCKLenV2 (void)
{
unsigned char cmd[3];
cmd[0] = CMD_SET_PARAMETER;
cmd[1] = PARAM_SCK_DURATION;
switch (scklen)
{
case 2: cmd[2] = 1; // > 1843200 (2MHz)
break;
case 4:
case 8: cmd[2] = 2; // > 460800 (1MHz,500kHz)
break;
case 16: cmd[2] = 3; // > 115200 (250kHz)
break;
case 78: cmd[2] = 4; // 57600 (100kHz)
break;
default: cmd[2] = 10; // 31241 (32.7kHz)
}
if (!DoCommandV2 (cmd, 3, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_SET_PARAMETER) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadPage (unsigned char *data, int size, char type)
{
unsigned char cmd[5];
int i;
if (protocol == 2) return ReadPageV2 (data, size, type);
cmd[0] = 0x74;
cmd[1] = (size >> 8) & 0xff;
cmd[2] = size & 0xff;
cmd[3] = type;
cmd[4] = 0x20;
if (!DoCommand (cmd, 5, size + 2))
{
return false;
}
else
{
if (bytesrx < 4)
{
return false;
}
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[size + 1] != STK_OK)
{
return false;
}
}
for (i = 0;i < size;i++)
{
*(data + i) = rxdata[i + 1];
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadPageV2 (unsigned char *data, int size, char type)
{
unsigned char cmd[4];
int i;
if (ChipInfoV2.progtype == CHIP_PROGSPI)
{
if (type == 'F') cmd[0] = CMD_READ_FLASH_ISP;
else cmd[0] = CMD_READ_EEPROM_ISP;
cmd[1] = (unsigned char)((size >> 8) & 0xff);
cmd[2] = (unsigned char)(size & 0xff);
if (type == 'F') cmd[3] = 0x20; // First Cmd Byte of Read Program Memory
else cmd[3] = 0xA0; // First Cmd Byte of Read EEPROM Memory
if (!DoCommandV2 (cmd, 4, 3 + size)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FLASH_ISP &&
rxdata[STK500V2_OFFSET] != CMD_READ_EEPROM_ISP) return false;
}
else
{
if (type == 'F')
{
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_FLASH_HVSP;
else cmd[0] = CMD_READ_FLASH_PP;
}
else
{
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_EEPROM_HVSP;
else cmd[0] = CMD_READ_EEPROM_PP;
}
cmd[1] = (unsigned char)((size >> 8) & 0xff);
cmd[2] = (unsigned char)(size & 0xff);
if (!DoCommandV2 (cmd, 3, 3 + size)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FLASH_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_FLASH_HVSP &&
rxdata[STK500V2_OFFSET] != CMD_READ_EEPROM_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_EEPROM_HVSP) return false;
}
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
for (i = 0;i < size;i++)
{
*(data + i) = rxdata[STK500V2_OFFSET + 2 + i];
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ChipErase (void)
{
unsigned char cmd[2];
if (protocol == 2) return ChipEraseV2 ();
cmd[0] = 0x52;
cmd[1] = 0x20;
if (!DoCommand (cmd, 2, 2)) return false;
else
{
if (rxdata[0] != STK_INSYNC) return false;
else if (rxdata[1] != STK_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ChipEraseV2 (void)
{
unsigned char cmd[7];
if (ChipInfoV2.progtype == CHIP_PROGSPI)
{
cmd[0] = CMD_CHIP_ERASE_ISP;
cmd[1] = 500; // Delay in ms
cmd[2] = 0; // Poll Method (0=Delay,1=RDY/BSY Cmd)
cmd[3] = 0xac; // Chip Erase Cmd
cmd[4] = 0x80;
cmd[5] = 0;
cmd[6] = 0;
if (!DoCommandV2 (cmd, 7, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_CHIP_ERASE_ISP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
else
{
if (ChipInfoV2.hvserial)
{
cmd[0] = CMD_CHIP_ERASE_HVSP;
cmd[1] = 200; // Timeout period
cmd[2] = 200; // Delay
}
else
{
cmd[0] = CMD_CHIP_ERASE_PP;
cmd[1] = 0; // Pulse Width of WR
cmd[2] = 10; // Timeout period
}
if (!DoCommandV2 (cmd, 3, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_CHIP_ERASE_PP &&
rxdata[STK500V2_OFFSET] != CMD_CHIP_ERASE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WritePage (unsigned char *data, int size, char type)
{
unsigned char cmd[261];
int i;
if (protocol == 2) return WritePageV2 (data, size, type);
cmd[0] = 0x64;
cmd[1] = (size >> 8) & 0xff;
cmd[2] = size & 0xff;
cmd[3] = type;
for (i = 0;i < size;i++)
{
cmd[i + 4] = *(data + i);
}
cmd[i + 4] = 0x20;
if (!DoCommand (cmd, i + 5, 2))
{
return false;
}
else
{
if (bytesrx < 2)
{
return false;
}
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[1] != STK_OK)
{
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WritePageV2 (unsigned char *data, int size, char type)
{
unsigned char cmd[266];
int i;
if (ChipInfoV2.pagesize > 256) return false;
if (ChipInfoV2.progtype == CHIP_PROGSPI)
{
if (type == 'F') cmd[0] = CMD_PROGRAM_FLASH_ISP;
else cmd[0] = CMD_PROGRAM_EEPROM_ISP;
cmd[1] = (size >> 8) & 0xff;
cmd[2] = size & 0xff;
if (type == 'F')
{
if (ChipInfoV2.paged)
{ // Page Mode
cmd[3] = 1;
if (ChipInfoV2.selftimed) cmd[3] |= 0x20; // Use polling
else cmd[3] |= 0x10; // Use Delay
cmd[3] |= 0x80; // Set Write Page Bit
}
else
{
cmd[3] = 0; // Word Mode
if (ChipInfoV2.selftimed) cmd[3] |= 0x04; // Use polling
else cmd[3] |= 0x02; // Use Delay
}
cmd[4] = ChipInfoV2.WD_Flash; // Delay
cmd[5] = 0x40; // Load Page Cmd / Write Program Memory Cmd
cmd[6] = 0x4c; // Write Page Cmd
cmd[7] = 0x20; // Read Program Memory Cmd
cmd[8] = 0xff; // Poll Value 1
cmd[9] = 0; // Poll Value 2 (used for EEPROM)
}
else
{
cmd[3] = 0x02; // Timed Delay
cmd[4] = ChipInfoV2.WD_EEPROM;
cmd[5] = 0xc0; // Write EEPROM Memory Cmd
cmd[6] = 0;
cmd[7] = 0xa0; // Read EEPROM Memory Cmd
cmd[8] = 0xff; // Poll Value 1
cmd[9] = 0xff; // Poll Value 2
}
for (i = 0;i < size;i++)
{
cmd[10 + i] = *(data + i);
}
if (!DoCommandV2 (cmd, 10 + size, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FLASH_ISP &&
rxdata[STK500V2_OFFSET] != CMD_PROGRAM_EEPROM_ISP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
else
{
if (type == 'F')
{
if (ChipInfoV2.hvserial) cmd[0] = CMD_PROGRAM_FLASH_HVSP;
else cmd[0] = CMD_PROGRAM_FLASH_PP;
cmd[4] = ChipInfoV2.WD_Flash;
}
else
{
if (ChipInfoV2.hvserial) cmd[0] = CMD_PROGRAM_EEPROM_HVSP;
else cmd[0] = CMD_PROGRAM_EEPROM_PP;
cmd[4] = ChipInfoV2.WD_EEPROM;
}
cmd[1] = (size >> 8) & 0xff;
cmd[2] = size & 0xff;
if (!ChipInfoV2.paged || type == 'E') cmd[3] = 0; // Word Mode
else
{
switch (ChipInfoV2.pagesize) // Page Mode
{
case 2: cmd[3] = 0x03;
break;
case 4: cmd[3] = 0x05;
break;
case 8: cmd[3] = 0x07;
break;
case 16: cmd[3] = 0x09;
break;
case 32: cmd[3] = 0x0b;
break;
case 64: cmd[3] = 0x0d;
break;
case 128: cmd[3] = 0x0f;
break;
case 256: cmd[3] = 0x01;
break;
}
cmd[3] |= 0xc0;
}
for (i = 0;i < size;i++)
{
cmd[5 + i] = *(data + i);
}
if (!DoCommandV2 (cmd, 5 + size, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FLASH_PP &&
rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FLASH_HVSP &&
rxdata[STK500V2_OFFSET] != CMD_PROGRAM_EEPROM_PP &&
rxdata[STK500V2_OFFSET] != CMD_PROGRAM_EEPROM_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadVTarget (double *vtarget)
{
unsigned char cmd[3];
if (protocol == 2) return ReadVTargetV2 (vtarget);
cmd[0] = 0x41;
cmd[1] = 0x84;
cmd[2] = 0x20;
if (!DoCommand (cmd, 3, 3))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[2] != STK_OK)
{
return false;
}
}
*vtarget = (double)rxdata[1] / 10;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadVTargetV2 (double *vtarget)
{
unsigned char cmd[2];
cmd[0] = CMD_GET_PARAMETER;
cmd[1] = PARAM_VTARGET;
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_GET_PARAMETER) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*vtarget = (double)rxdata[STK500V2_OFFSET + 2] / 10;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadARef (double *aref)
{
unsigned char cmd[3];
if (protocol == 2) return ReadARefV2 (aref);
cmd[0] = 0x41;
cmd[1] = 0x85;
cmd[2] = 0x20;
if (!DoCommand (cmd, 3, 3))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[2] != STK_OK)
{
return false;
}
}
*aref = (double)rxdata[1] / 10;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadARefV2 (double *aref)
{
unsigned char cmd[2];
cmd[0] = CMD_GET_PARAMETER;
cmd[1] = PARAM_VADJUST;
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_GET_PARAMETER) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*aref = (double)rxdata[STK500V2_OFFSET + 2] / 10;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteVTarget (double vtarget)
{
unsigned char cmd[4];
if (protocol == 2) return WriteVTargetV2 (vtarget);
cmd[0] = 0x40;
cmd[1] = 0x84;
cmd[2] = vtarget * 10;
cmd[3] = 0x20;
if (!DoCommand (cmd, 4, 2))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[1] != STK_OK)
{
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteVTargetV2 (double vtarget)
{
unsigned char cmd[3];
cmd[0] = CMD_SET_PARAMETER;
cmd[1] = PARAM_VTARGET;
cmd[2] = vtarget * 10;
if (!DoCommandV2 (cmd, 3, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_SET_PARAMETER) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteARef (double aref)
{
unsigned char cmd[4];
if (protocol == 2) return WriteARefV2 (aref);
cmd[0] = 0x40;
cmd[1] = 0x85;
cmd[2] = aref * 10;
cmd[3] = 0x20;
if (!DoCommand (cmd, 4, 2))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[1] != STK_OK)
{
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteARefV2 (double aref)
{
unsigned char cmd[3];
cmd[0] = CMD_SET_PARAMETER;
cmd[1] = PARAM_VADJUST;
cmd[2] = aref * 10;
if (!DoCommandV2 (cmd, 3, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_SET_PARAMETER) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::StartComm (void)
{
if (!Comm->Open ()) return false;
if (protocol == 1) if (!GetSync ()) return false;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TSTK500::StopComm (void)
{
Comm->Close ();
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadOscValues (int *pre, int *comp)
{
unsigned char cmd[3];
if (protocol == 2) return ReadOscValuesV2 (pre, comp);
cmd[0] = 0x41;
cmd[1] = 0x86;
cmd[2] = 0x20;
if (!DoCommand (cmd, 3, 3))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -