标题: 支持多种芯片 USB高压编程器 电路图 源代码 [打印本页]

作者: happy112    时间: 2016-6-7 14:44
标题: 支持多种芯片 USB高压编程器 电路图 源代码



主控芯片Mega16,单ZIF座不用跳线就可以支持多种芯片,用的是zhifeng的POWERPRG早期版本采用的协议。
USB高压编程器电路截图:





USB高压编程器版本V0.1说明几点:
USB高压编程器版本V0.1更新:


  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <avr/pgmspace.h>
  4. #include <avr/wdt.h>

  5. #include "usbdrv.h"
  6. #include "clock.h"
  7. #include "HVProg.h"

  8. #define USBASP_FUNC_CONNECT     1
  9. #define USBASP_FUNC_DISCONNECT  2
  10. #define USBASP_FUNC_TRANSMIT    3
  11. #define USBASP_FUNC_READFLASH   4
  12. #define USBASP_FUNC_ENABLEPROG  5
  13. #define USBASP_FUNC_WRITEFLASH  6
  14. #define USBASP_FUNC_READEEPROM  7
  15. #define USBASP_FUNC_WRITEEEPROM 8
  16. #define USBASP_FUNC_SETLONGADDRESS 9

  17. #define PROG_STATE_IDLE         0
  18. #define PROG_STATE_WRITEFLASH   1
  19. #define PROG_STATE_READFLASH    2
  20. #define PROG_STATE_READEEPROM   3
  21. #define PROG_STATE_WRITEEEPROM  4

  22. #define PROG_BLOCKFLAG_FIRST    1
  23. #define PROG_BLOCKFLAG_LAST     2

  24. static uchar replyBuffer[8];

  25. static uchar prog_state = PROG_STATE_IDLE;

  26. static uchar prog_address_newmode = 0;
  27. static unsigned long prog_address;
  28. static unsigned int prog_nbytes = 0;
  29. static unsigned int prog_pagesize;
  30. static uchar prog_blockflags;
  31. static uchar prog_pagecounter;

  32. uchar temp_data = 0;
  33. uchar chip_id = 0;

  34. void ledRedOn(){
  35.         PORTD &= ~0x10;
  36. }
  37. void ledRedOff(){
  38.         PORTD |= 0x10;
  39. }

  40. uchar usbFunctionSetup(uchar data[8]) {

  41.   uchar len = 0;

  42.   if(data[1] == USBASP_FUNC_CONNECT){
  43.          
  44.           chip_id = data[3];
  45.                    
  46.     HWSwitch();
  47.     prog_address_newmode = 0;
  48.     HVConnect();
  49.     ledRedOn();
  50.                 
  51.                  replyBuffer[0] = 0x05;
  52.                  replyBuffer[1] = 0x89;
  53.                 replyBuffer[2] = 0xF0;
  54.                  replyBuffer[3] = 0x02;
  55.                  len = 4;

  56.   } else if (data[1] == USBASP_FUNC_DISCONNECT) {
  57.          
  58.           HVEndProgramming();
  59.     HVDisconnect();
  60.     ledRedOff();

  61.   } else if (data[1] == USBASP_FUNC_TRANSMIT) {
  62.          
  63.           if(data[2] == 0x00){
  64.                   replyBuffer[0] = HVReadSignature(0);
  65.             replyBuffer[1] = HVReadSignature(1);
  66.             replyBuffer[2] = HVReadSignature(2);
  67.                    replyBuffer[3] = 0x02;
  68.            }
  69.           else if(data[2] == 0x01 && data[3] == 0x32){
  70.                   replyBuffer[0] = HVEraseChip();
  71.             replyBuffer[1] = 0x89;
  72.             replyBuffer[2] = 0xF0;
  73.                    replyBuffer[3] = 0x02;
  74.            }
  75.            else if(data[2] == 0x02){
  76.                   replyBuffer[0] = HVReadOscBit(0);
  77.             replyBuffer[1] = HVReadOscBit(1);
  78.             replyBuffer[2] = HVReadOscBit(2);
  79.                    replyBuffer[3] = HVReadOscBit(3);
  80.            }
  81.            else if(data[2] == 0x03){                          
  82.                   replyBuffer[0] = HVReadFuse(0);
  83.             replyBuffer[1] = HVReadFuse(1);
  84.             if(data[3] == 0x02)replyBuffer[2] = 0xF0;
  85.             else replyBuffer[2] = HVReadFuse(2);
  86.                    replyBuffer[3] = 0x02;
  87.            }
  88.            else if((data[2] & 0x0F) == 0x04){
  89.                    HVWriteFuse(data[3],0);
  90.                    HVWriteFuse(data[4],1);
  91.                    if((data[2] & 0xF0) == 0x30)HVWriteFuse(data[5],2);
  92.                   replyBuffer[0] = 0;;
  93.             replyBuffer[1] = 0x89;
  94.             replyBuffer[2] = 0xF0;
  95.                    replyBuffer[3] = 0x02;
  96.            }
  97.           else if(data[2] == 0x05){
  98.                   replyBuffer[0] = HVReadFuse(3);
  99.             replyBuffer[1] = 0x89;
  100.             replyBuffer[2] = 0xF0;
  101.                    replyBuffer[3] = 0x02;
  102.            }
  103.           else if(data[2] == 0x06){
  104.                   replyBuffer[0] = HVWriteLockBit(data[3]);
  105.             replyBuffer[1] = 0x89;
  106.             replyBuffer[2] = 0xF0;
  107.                    replyBuffer[3] = 0x02;
  108.            }  
  109.                   
  110.     len = 4;

  111.   } else if (data[1] == USBASP_FUNC_READFLASH) {
  112.    
  113.     if (!prog_address_newmode)
  114.       prog_address = (data[3] << 8) | data[2];
  115.    
  116.     prog_nbytes = (data[7] << 8) | data[6];
  117.     prog_state = PROG_STATE_READFLASH;
  118.     len = 0xff; /* multiple in */

  119.   } else if (data[1] == USBASP_FUNC_READEEPROM) {
  120.    
  121.     if (!prog_address_newmode)
  122.        prog_address = (data[3] << 8) | data[2];

  123.     prog_nbytes = (data[7] << 8) | data[6];
  124.     prog_state = PROG_STATE_READEEPROM;
  125.     len = 0xff; /* multiple in */

  126.   } else if (data[1] == USBASP_FUNC_ENABLEPROG) {
  127.          
  128.     replyBuffer[0] = HVEnterProgrammingMode();
  129.     len = 1;

  130.   } else if (data[1] == USBASP_FUNC_WRITEFLASH) {

  131.     if (!prog_address_newmode)
  132.       prog_address = (data[3] << 8) | data[2];

  133.     prog_pagesize = data[4] + 1;
  134.     prog_blockflags = data[5] & 0x0F;
  135.     prog_pagesize += (((unsigned int)data[5] & 0xF0)<<4);
  136.     if (prog_blockflags & PROG_BLOCKFLAG_FIRST) {
  137.       prog_pagecounter = prog_pagesize;
  138.     }
  139.     prog_nbytes = (data[7] << 8) | data[6];
  140.     prog_state = PROG_STATE_WRITEFLASH;
  141.     len = 0xff; /* multiple out */
  142.    
  143.     HVStartFlashProgramming();

  144.   } else if (data[1] == USBASP_FUNC_WRITEEEPROM) {

  145.     if (!prog_address_newmode)
  146.       prog_address = (data[3] << 8) | data[2];

  147.     prog_pagesize = 0;
  148.     prog_blockflags = 0;
  149.     prog_nbytes = (data[7] << 8) | data[6];
  150.     prog_state = PROG_STATE_WRITEEEPROM;
  151.     len = 0xff; /* multiple out */
  152.    
  153.     HVStartEEPROMProgramming();

  154.   } else if(data[1] == USBASP_FUNC_SETLONGADDRESS) {

  155.     /* set new mode of address delivering (ignore address delivered in commands) */
  156.     prog_address_newmode = 1;
  157.     /* set new address */
  158.     prog_address = *((unsigned long*)&data[2]);
  159.   }

  160.   usbMsgPtr = replyBuffer;

  161.   return len;
  162. }


  163. uchar usbFunctionRead(uchar *data, uchar len){

  164.   uchar i;
  165.   
  166.   if((prog_state != PROG_STATE_READFLASH) && (prog_state != PROG_STATE_READEEPROM))
  167.     return 0xff;
  168.   
  169.   for(i = 0; i < len; i++){
  170.           if(prog_state == PROG_STATE_READFLASH){
  171.             if(prog_address % 2 == 1)data[i] = temp_data;
  172.             else data[i] = HVReadFlash(prog_address);
  173.           }else data[i] = HVReadEEPROM(prog_address);
  174.     prog_address++;
  175.   }

  176.   if(len < 8)prog_state = PROG_STATE_IDLE;

  177.   return len;
  178. }


  179. uchar usbFunctionWrite(uchar *data, uchar len){
  180.        
  181.   uchar retVal = 0;
  182.         uchar i;
  183.   
  184.   if((prog_state != PROG_STATE_WRITEFLASH) && (prog_state != PROG_STATE_WRITEEEPROM))
  185.     return 0xff;

  186.   for(i = 0;i < len;i++){                   
  187.     if(prog_state == PROG_STATE_WRITEFLASH){                               
  188.                         if(prog_pagesize == 0){
  189.                                 return 0xFF;
  190.       }else{
  191.               if((prog_address % 2) == 0)temp_data = data[i];
  192.               else HVWriteFlash(prog_address, data[i], temp_data);
  193.               prog_pagecounter--;
  194.               if(prog_pagecounter == 0){
  195.                       HVFlushPage(prog_address);
  196.                                   prog_pagecounter = prog_pagesize;
  197.                                 }
  198.       }
  199.     }else{      
  200.       HVWriteEEPROM(prog_address, data[i]);
  201.     }
  202.            prog_nbytes --;
  203.            if(prog_nbytes == 0){
  204.              prog_state = PROG_STATE_IDLE;
  205.              if((prog_blockflags & PROG_BLOCKFLAG_LAST) && (prog_pagecounter != prog_pagesize))
  206.                                 HVFlushPage(prog_address);          
  207.                   retVal = 1; // Need to return 1 when no more data is to be received
  208.           }         
  209.           prog_address ++;
  210.         }

  211.   return retVal;
  212. }


  213. int main(void)
  214. {
  215.   uchar   i, j;

  216.         PORTA = 0;
  217.         PORTB = 0;
  218.         PORTC = 0;
  219.         DDRA = 0;
  220.         DDRB = 0;
  221.         DDRC = 0;

  222.   PORTD = 0x10;
  223.   DDRD = 0x38;        /* all outputs except PD2 = INT0 */

  224.   j = 0;
  225.   while(--j){           /* USB Reset by device only required on Watchdog Reset */
  226.       i = 0;
  227.       while(--i);       /* delay >10ms for USB reset */
  228.   }
  229.   
  230.   DDRD = 0x30;           /* all USB and ISP pins inputs */
  231.   
  232.   HWSwitch();
  233.   
  234.   usbInit();
  235.   sei();
  236.   for(;;){                /* main event loop */
  237.     usbPoll();
  238.   }
  239.   return 0;
  240. }

复制代码
全部资料(压缩包)下载:
USB高压编程器版本V0.1.rar (859.04 KB, 下载次数: 24) V0.1(更新).rar (156.67 KB, 下载次数: 21)



作者: vvv64    时间: 2019-9-16 17:30
这个编程器应该很好用,谢谢楼主




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1