找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3510|回复: 1
打印 上一主题 下一主题
收起左侧

支持多种芯片 USB高压编程器 电路图 源代码

[复制链接]
跳转到指定楼层
楼主



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





USB高压编程器版本V0.1说明几点:
  • 上传的程序目前支持Mega8、Mega16\32、Mega8535;M48\88\168时序应该和Mega8是一样的,程序中考虑了扩展熔丝位,但是没有进行测试。
  • 硬件上还可支持如下芯片,Tiny2313、Tiny13(及引脚定义相同的8DIP封装的芯片)、Tiny26、AT24C系列。
  • 上位机软件是附件中的那个POWERPRG,不是zhifeng网上的那个,这个版本没法禁止SPIEN位。
USB高压编程器版本V0.1更新:
  • 可以支持芯片如下:Mega8\48\88\168、Mega16\32\8535、Mega8515(待测)、Tiny2313、Tiny26(待测)、S5x(ISP方式,无法实现自动功能);
  • 增加转接模式,方便贴片封装的芯片,20针定义参见http://www.der-hammer.info/hvprog/index_en.htm,已用Mega64进行测试;
  • 待测的原因是手头没有相应芯片;
  • 需要将附件中的dat文件覆盖13楼中提供的原文件,硬件上有细微改动—将ZIF19和ZIF33连到PD7上,将ZIF2连到PC6上;
  • 所有芯片和转接模式均是顶头对齐。


  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)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:300101 发表于 2019-9-16 17:30 | 只看该作者
这个编程器应该很好用,谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表