⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stk500.cpp

📁 用于开发Atmel的AVR系列单片机的GCC集成开发环境
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   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 + -