📄 stk500.cpp
字号:
return false;
}
else if (rxdata[2] != STK_OK)
{
return false;
}
}
*pre = rxdata[1];
cmd[0] = 0x41;
cmd[1] = 0x87;
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;
}
}
*comp = rxdata[1];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadOscValuesV2 (int *pre, int *comp)
{
unsigned char cmd[2];
cmd[0] = CMD_GET_PARAMETER;
cmd[1] = PARAM_OSC_PSCALE;
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;
*pre = rxdata[STK500V2_OFFSET + 2];
cmd[1] = PARAM_OSC_CMATCH;
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;
*comp = rxdata[STK500V2_OFFSET + 2];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteOscValues (int pre, int comp)
{
unsigned char cmd[4];
if (protocol == 2) return WriteOscValuesV2 (pre, comp);
cmd[0] = 0x40;
cmd[1] = 0x86;
cmd[2] = (unsigned char)pre;
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;
}
}
cmd[0] = 0x40;
cmd[1] = 0x87;
cmd[2] = (unsigned char)comp;
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::WriteOscValuesV2 (int pre, int comp)
{
unsigned char cmd[3];
cmd[0] = CMD_SET_PARAMETER;
cmd[1] = PARAM_OSC_PSCALE;
cmd[2] = pre;
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;
cmd[1] = PARAM_OSC_CMATCH;
cmd[2] = comp;
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::UniversalCmd (unsigned char *tx, unsigned char *rx)
{
unsigned char cmd[6];
if (protocol == 2) return UniversalCmdV2 (tx, rx);
cmd[0] = 0x56;
cmd[1] = *tx;
cmd[2] = *(tx + 1);
cmd[3] = *(tx + 2);
cmd[4] = *(tx + 3);
cmd[5] = 0x20;
if (!DoCommand (cmd, 6, 3))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[2] != STK_OK)
{
return false;
}
}
*rx = cmd[2];
*(rx + 1) = cmd[3];
*(rx + 2) = cmd[4];
*(rx + 3) = rxdata[1];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::UniversalCmdV2 (unsigned char *tx, unsigned char *rx)
{
unsigned char cmd[8];
cmd[0] = CMD_SPI_MULTI;
cmd[1] = 4; // Number of Bytes to Tx
cmd[2] = 4; // Number of Bytes to Rx
cmd[3] = 0; // Rx Byte Start Address
cmd[4] = *tx; // SPI Cmd
cmd[5] = *(tx + 1);
cmd[6] = *(tx + 2);
cmd[7] = *(tx + 3);
if (!DoCommandV2 (cmd, 8, 7)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_SPI_MULTI) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*rx = rxdata[STK500V2_OFFSET + 2];
*(rx + 1) = rxdata[STK500V2_OFFSET + 3];
*(rx + 2) = rxdata[STK500V2_OFFSET + 4];
*(rx + 3) = rxdata[STK500V2_OFFSET + 5];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadFuseBits (unsigned char *low, unsigned char *hi)
{
unsigned char cmd[2];
if (protocol == 2) return ReadFuseBitsV2 (low, hi);
cmd[0] = 0x72;
cmd[1] = 0x20;
if (!DoCommand (cmd, 2, 4))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[3] != STK_OK)
{
return false;
}
}
*low = rxdata[1];
*hi = rxdata[2];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadFuseBitsV2 (unsigned char *low, unsigned char *hi)
{
unsigned char cmd[2];
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_FUSE_HVSP;
else cmd[0] = CMD_READ_FUSE_PP;
cmd[1] = 0; // Read Low Fuse Byte
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*low = rxdata[STK500V2_OFFSET + 2];
if (ChipInfoV2.fusebytes > 1)
{
cmd[1] = 1; // Read High Fuse Byte
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*hi = rxdata[STK500V2_OFFSET + 2];
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadLockBits (unsigned char *lock)
{
unsigned char cmd[2];
if (protocol == 2) return ReadLockBitsV2 (lock);
cmd[0] = 0x73;
cmd[1] = 0x20;
if (!DoCommand (cmd, 2, 3))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[2] != STK_OK)
{
return false;
}
}
*lock = rxdata[1];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadLockBitsV2 (unsigned char *lock)
{
unsigned char cmd[2];
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_LOCK_HVSP;
else cmd[0] = CMD_READ_LOCK_PP;
cmd[1] = 0;
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_LOCK_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_LOCK_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*lock = rxdata[STK500V2_OFFSET + 2];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadFuseBitsEx (unsigned char *low, unsigned char *hi,
unsigned char *ext)
{
unsigned char cmd[2];
if (protocol == 2) return ReadFuseBitsExV2 (low, hi, ext);
cmd[0] = 0x77;
cmd[1] = 0x20;
if (!DoCommand (cmd, 2, 5))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[4] != STK_OK)
{
return false;
}
}
*low = rxdata[1];
*hi = rxdata[2];
*ext = rxdata[3];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadFuseBitsExV2 (unsigned char *low, unsigned char *hi,
unsigned char *ext)
{
unsigned char cmd[2];
if (!ReadFuseBitsV2 (low, hi)) return false;
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_FUSE_HVSP;
else cmd[0] = CMD_READ_FUSE_PP;
cmd[1] = 2; // Read Extended Fuse
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*ext = rxdata[STK500V2_OFFSET + 2];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteFuseBits (unsigned char low, unsigned char hi)
{
unsigned char cmd[4];
if (protocol == 2) return WriteFuseBitsV2 (low, hi);
cmd[0] = 0x62;
cmd[1] = low;
cmd[2] = hi;
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::WriteFuseBitsV2 (unsigned char low, unsigned char hi)
{
unsigned char cmd[5];
if (ChipInfoV2.hvserial)
{
cmd[0] = CMD_PROGRAM_FUSE_HVSP;
cmd[1] = 0; // Write Low Fuse Byte
cmd[2] = low;
cmd[3] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 4, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
if (ChipInfoV2.fusebytes > 1)
{
cmd[1] = 1; // Write High Fuse Byte
cmd[2] = hi;
if (!DoCommandV2 (cmd, 5, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
}
else
{
cmd[0] = CMD_PROGRAM_FUSE_PP;
cmd[1] = 0; // Write Low Fuse Byte
cmd[2] = low;
cmd[3] = 0; // WR Pulse Width
cmd[4] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 5, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FUSE_PP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
if (ChipInfoV2.fusebytes > 1)
{
cmd[1] = 1; // Write High Fuse Byte
cmd[2] = hi;
if (!DoCommandV2 (cmd, 5, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FUSE_PP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteLockBits (unsigned char lock)
{
unsigned char cmd[3];
if (protocol == 2) return WriteLockBitsV2 (lock);
cmd[0] = 0x63;
cmd[1] = lock;
cmd[2] = 0x20;
if (!DoCommand (cmd, 3, 2))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[1] != STK_OK)
{
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteLockBitsV2 (unsigned char lock)
{
unsigned char cmd[5];
if (ChipInfoV2.hvserial)
{
cmd[0] = CMD_PROGRAM_LOCK_HVSP;
cmd[1] = 0;
cmd[2] = lock;
cmd[3] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 4, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_LOCK_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
else
{
cmd[0] = CMD_PROGRAM_LOCK_PP;
cmd[1] = 0;
cmd[2] = lock;
cmd[3] = 0; // WR Pulse Width
cmd[4] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 5, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_LOCK_PP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteFuseBitsEx (unsigned char low, unsigned char hi,
unsigned char ext)
{
unsigned char cmd[5];
if (protocol == 2) return WriteFuseBitsExV2 (low, hi, ext);
cmd[0] = 0x65;
cmd[1] = low;
cmd[2] = hi;
cmd[3] = ext;
cmd[4] = 0x20;
if (!DoCommand (cmd, 5, 2))
{
return false;
}
else
{
if (rxdata[0] != STK_INSYNC)
{
return false;
}
else if (rxdata[1] != STK_OK)
{
return false;
}
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::WriteFuseBitsExV2 (unsigned char low, unsigned char hi,
unsigned char ext)
{
unsigned char cmd[5];
if (!WriteFuseBitsV2 (low, hi)) return false;
if (ChipInfoV2.hvserial)
{
cmd[0] = CMD_PROGRAM_FUSE_HVSP;
cmd[1] = 2; // Write Extended Fuse Byte
cmd[2] = ext;
cmd[3] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 4, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FUSE_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
else
{
cmd[0] = CMD_PROGRAM_FUSE_PP;
cmd[1] = 2; // Write Extended Fuse Byte
cmd[2] = ext;
cmd[3] = 0; // WR Pulse Width
cmd[4] = 100; // Polling Timeout
if (!DoCommandV2 (cmd, 5, 2)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_PROGRAM_FUSE_PP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
}
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadCalibrationByte (int num, unsigned char *byte)
{
unsigned char cmd[3];
if (protocol == 2) return ReadCalibrationByteV2 (num, byte);
cmd[0] = 0x78;
cmd[1] = (unsigned char)num;
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;
}
}
*byte = rxdata[1];
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TSTK500::ReadCalibrationByteV2 (int num, unsigned char *byte)
{
char cmd[6];
if (ChipInfoV2.progtype == CHIP_PROGSPI)
{
cmd[0] = CMD_READ_OSCCAL_ISP;
cmd[1] = 4; // Return Address
cmd[2] = 0x38; // Read Signature Byte
cmd[3] = 0;
cmd[4] = (unsigned char)num;
cmd[5] = 0;
if (!DoCommandV2 (cmd, 6, 4)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_OSCCAL_ISP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*byte = rxdata[STK500V2_OFFSET + 2];
}
else
{
if (ChipInfoV2.hvserial) cmd[0] = CMD_READ_OSCCAL_HVSP;
else cmd[0] = CMD_READ_OSCCAL_PP;
cmd[1] = num;
if (!DoCommandV2 (cmd, 2, 3)) return false;
if (rxdata[STK500V2_OFFSET] != CMD_READ_OSCCAL_PP &&
rxdata[STK500V2_OFFSET] != CMD_READ_OSCCAL_HVSP) return false;
if (rxdata[STK500V2_OFFSET + 1] != STATUS_CMD_OK) return false;
*byte = rxdata[STK500V2_OFFSET + 2];
}
return true;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -