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

📄 stk500.cpp

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