久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3581|回復: 1
收起左側

支持多種芯片 USB高壓編程器 電路圖 源代碼

[復制鏈接]
ID:124161 發表于 2016-6-7 14:44 | 顯示全部樓層 |閱讀模式

0.png

主控芯片Mega16,單ZIF座不用跳線就可以支持多種芯片,用的是zhifeng的POWERPRG早期版本采用的協議。
USB高壓編程器電路截圖:
0.png


0.png

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)


回復

使用道具 舉報

ID:300101 發表于 2019-9-16 17:30 | 顯示全部樓層
這個編程器應該很好用,謝謝樓主
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本特黄特色aaa大片免费 | 成人免费视频网站在线观看 | 日韩高清一区二区 | caoporn国产精品免费公开 | 999久久久 | 最新中文在线视频 | 精品国产99 | 日韩免费视频一区二区 | 亚洲精品久久久一区二区三区 | 91精品在线播放 | 手机av在线| 欧美一区二区在线看 | 中文字幕韩在线第一页 | 欧美国产日韩一区二区三区 | 成人在线精品视频 | 久久综合狠狠综合久久综合88 | 精品二区视频 | 国产精品国产亚洲精品看不卡15 | 欧美日韩精品在线免费观看 | 亚洲视频在线免费观看 | 91福利影院 | 一级看片免费视频 | av免费看在线 | 99精品国自产在线观看 | 99精品一区二区三区 | 欧美一级特黄aaa大片在线观看 | 国产综合精品 | 精品二区 | 不卡一二三区 | 国产视频中文字幕 | 在线国产一区 | 亚洲在线 | 精品国产一区二区在线 | 久久中文字幕在线 | 91在线视频免费观看 | 91精品一区二区三区久久久久 | 国产精品永久 | 亚洲三区在线观看 | 成人深夜福利 | 伊人影院在线观看 | 国产一级黄色网 |