找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ISP下载器 电路图 原代码 驱动程序

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



       该ISP编程器采用ATMEGA8_DIP28作为主控制芯片,预留MOSI,MISO,RET,SCK,VCC,GND。6PIN接口,方便使用者根据需要连接目标板。

同时预留PROGRAMMING编程接口,用户可自行升级下载器固件。

ISP下载器电路原理图截图:



ISP下载器源码:
  1. /*
  2.   USBasp - USB in-circuit programmer for Atmel AVR controllers

  3.   Thomas Fischl <tfischl@gmx.de>

  4.   License:
  5.   The project is built with AVR USB driver by Objective Development, which is
  6.   published under an own licence based on the GNU General Public License (GPL).
  7.   USBasp is also distributed under this enhanced licence. See Documentation.

  8.   Target.........: ATMega8 at 12 MHz
  9.   Creation Date..: 2005-02-20
  10.   Last change....: 2006-12-29

  11.   PC2 SCK speed option. GND  -> slow (8khz SCK),
  12.                         open -> fast (375kHz SCK)
  13. */

  14. #include <avr/io.h>
  15. #include <avr/interrupt.h>
  16. #include <avr/pgmspace.h>
  17. #include <avr/wdt.h>

  18. #include "usbdrv.h"
  19. #include "isp.h"
  20. #include "clock.h"

  21. #define USBASP_FUNC_CONNECT     1
  22. #define USBASP_FUNC_DISCONNECT  2
  23. #define USBASP_FUNC_TRANSMIT    3
  24. #define USBASP_FUNC_READFLASH   4
  25. #define USBASP_FUNC_ENABLEPROG  5
  26. #define USBASP_FUNC_WRITEFLASH  6
  27. #define USBASP_FUNC_READEEPROM  7
  28. #define USBASP_FUNC_WRITEEEPROM 8

  29. #define PROG_STATE_IDLE         0
  30. #define PROG_STATE_WRITEFLASH   1
  31. #define PROG_STATE_READFLASH    2
  32. #define PROG_STATE_READEEPROM   3
  33. #define PROG_STATE_WRITEEEPROM  4

  34. #define PROG_BLOCKFLAG_FIRST    1
  35. #define PROG_BLOCKFLAG_LAST     2

  36. #define ledRedOn()    PORTC &= ~(1 << PC1)
  37. #define ledRedOff()   PORTC |= (1 << PC1)
  38. #define ledGreenOn()  PORTC &= ~(1 << PC0)
  39. #define ledGreenOff() PORTC |= (1 << PC0)

  40. static uchar replyBuffer[8];

  41. static uchar prog_state = PROG_STATE_IDLE;

  42. static unsigned int prog_address;
  43. static unsigned int prog_nbytes = 0;
  44. static unsigned int prog_pagesize; //TP: Mega128 fix
  45. static uchar prog_blockflags;
  46. static uchar prog_pagecounter;


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

  48.   uchar len = 0;

  49.   if(data[1] == USBASP_FUNC_CONNECT){

  50.     /* set SCK speed */
  51.     if ((PINC & (1 << PC2)) == 0) {
  52.       ispSetSCKOption(ISP_SCK_SLOW);
  53.     } else {
  54.       ispSetSCKOption(ISP_SCK_FAST);
  55.     }

  56.     ispConnect();
  57.     ledRedOn();

  58.   } else if (data[1] == USBASP_FUNC_DISCONNECT) {
  59.     ispDisconnect();
  60.     ledRedOff();

  61.   } else if (data[1] == USBASP_FUNC_TRANSMIT) {
  62.           if(chip==ATM){
  63.             replyBuffer[0] = ispTransmit(data[2]);
  64.             replyBuffer[1] = ispTransmit(data[3]);
  65.             replyBuffer[2] = ispTransmit(data[4]);
  66.             replyBuffer[3] = ispTransmit(data[5]);
  67.           }else{
  68.                   if(data[2]==0x24){
  69.                           replyBuffer[0] = ispTransmit(data[2]);
  70.                     replyBuffer[1] = ispTransmit(data[3]);
  71.                     replyBuffer[2] = ispTransmit(data[4]);
  72.                           switch(ispTransmit(data[5])&0x1C){
  73.                                   case(0x00):replyBuffer[3]=0xE0;break;
  74.                                   case(0x04):replyBuffer[3]=0xE5;break;
  75.                                   case(0x0C):replyBuffer[3]=0xEE;break;
  76.                                   case(0x1C):replyBuffer[3]=0xFF;break;
  77.                                   }
  78.                   }
  79.                   else if(data[2]==0x30){
  80.                           replyBuffer[0] = ispTransmit(0x28);
  81.                     replyBuffer[1] = ispTransmit(data[3]);
  82.                     replyBuffer[2] = ispTransmit(data[4]);
  83.                     replyBuffer[3] = ispTransmit(data[5]);
  84.                   }
  85.                   else{
  86.                           replyBuffer[0] = ispTransmit(data[2]);
  87.                     replyBuffer[1] = ispTransmit(data[3]);
  88.                     replyBuffer[2] = ispTransmit(data[4]);
  89.                     replyBuffer[3] = ispTransmit(data[5]);
  90.             }
  91.     }
  92.     len = 4;

  93.   } else if (data[1] == USBASP_FUNC_READFLASH) {
  94.     prog_address = (data[3] << 8) | data[2];
  95.     prog_nbytes = (data[7] << 8) | data[6];
  96.     prog_state = PROG_STATE_READFLASH;
  97.     len = 0xff; /* multiple in */

  98.   } else if (data[1] == USBASP_FUNC_READEEPROM) {
  99.     prog_address = (data[3] << 8) | data[2];
  100.     prog_nbytes = (data[7] << 8) | data[6];
  101.     prog_state = PROG_STATE_READEEPROM;
  102.     len = 0xff; /* multiple in */

  103.   } else if (data[1] == USBASP_FUNC_ENABLEPROG) {
  104.     replyBuffer[0] = ispEnterProgrammingMode();;
  105.     len = 1;

  106.   } else if (data[1] == USBASP_FUNC_WRITEFLASH) {
  107.     prog_address = (data[3] << 8) | data[2];
  108.     prog_pagesize = data[4];
  109.     prog_blockflags = data[5] & 0x0F;
  110.     prog_pagesize += (((unsigned int)data[5] & 0xF0)<<4); //TP: Mega128 fix
  111.     if (prog_blockflags & PROG_BLOCKFLAG_FIRST) {
  112.       prog_pagecounter = prog_pagesize;
  113.     }
  114.     prog_nbytes = (data[7] << 8) | data[6];
  115.     prog_state = PROG_STATE_WRITEFLASH;
  116.     len = 0xff; /* multiple out */

  117.   } else if (data[1] == USBASP_FUNC_WRITEEEPROM) {
  118.     prog_address = (data[3] << 8) | data[2];
  119.     prog_pagesize = 0;
  120.     prog_blockflags = 0;
  121.     prog_nbytes = (data[7] << 8) | data[6];
  122.     prog_state = PROG_STATE_WRITEEEPROM;
  123.     len = 0xff; /* multiple out */
  124.   }

  125.   usbMsgPtr = replyBuffer;

  126.   return len;
  127. }


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

  129.   uchar i;

  130.   /* check if programmer is in correct read state */
  131.   if ((prog_state != PROG_STATE_READFLASH) &&
  132.       (prog_state != PROG_STATE_READEEPROM)) {
  133.     return 0xff;
  134.   }

  135.   /* fill packet */
  136.   for (i = 0; i < len; i++) {
  137.     if (prog_state == PROG_STATE_READFLASH) {
  138.       data[i] = ispReadFlash(prog_address);
  139.     } else {
  140.       data[i] = ispReadEEPROM(prog_address);
  141.     }
  142.     prog_address++;
  143.   }

  144.   /* last packet? */
  145.   if (len < 8) {
  146.     prog_state = PROG_STATE_IDLE;
  147.   }

  148.   return len;
  149. }


  150. uchar usbFunctionWrite(uchar *data, uchar len) {

  151.   uchar retVal = 0;
  152.   uchar i;

  153.   /* check if programmer is in correct write state */
  154.   if ((prog_state != PROG_STATE_WRITEFLASH) &&
  155.       (prog_state != PROG_STATE_WRITEEEPROM)) {
  156.     return 0xff;
  157.   }


  158.   for (i = 0; i < len; i++) {

  159.     if (prog_state == PROG_STATE_WRITEFLASH) {
  160.       /* Flash */

  161.       if (prog_pagesize == 0) {
  162.         /* not paged */
  163.         ispWriteFlash(prog_address, data[i], 1);
  164.       } else {
  165.         /* paged */
  166.         ispWriteFlash(prog_address, data[i], 0);
  167.         prog_pagecounter --;
  168.         if (prog_pagecounter == 0) {
  169.           ispFlushPage(prog_address, data[i]);
  170.           prog_pagecounter = prog_pagesize;
  171.         }
  172.       }

  173.     } else {
  174.       /* EEPROM */
  175.       ispWriteEEPROM(prog_address, data[i]);
  176.     }

  177.     prog_nbytes --;

  178.     if (prog_nbytes == 0) {
  179.       prog_state = PROG_STATE_IDLE;
  180.       if ((prog_blockflags & PROG_BLOCKFLAG_LAST) &&
  181.           (prog_pagecounter != prog_pagesize)) {

  182.         /* last block and page flush pending, so flush it now */
  183.         ispFlushPage(prog_address, data[i]);
  184.       }
  185.           
  186.           retVal = 1; // Need to return 1 when no more data is to be received
  187.     }

  188.     prog_address ++;
  189.   }

  190.   return retVal;
  191. }


  192. int main(void)
  193. {
  194.   uchar   i, j;

  195.   PORTD = 0;
  196.   PORTB = 0;                /* no pullups on USB and ISP pins */
  197.   DDRD = ~(1 << 2);        /* all outputs except PD2 = INT0 */

  198.   DDRB = ~0;            /* output SE0 for USB reset */
  199.   j = 0;
  200.   while(--j){           /* USB Reset by device only required on Watchdog Reset */
  201.       i = 0;
  202.       while(--i);       /* delay >10ms for USB reset */
  203.   }
  204.   DDRB = 0;             /* all USB and ISP pins inputs */

  205.   DDRC = 0x03;          /* all inputs except PC0, PC1 */
  206.   PORTC = 0xfe;
  207.        
  208.         chip=ATM;
  209.        
  210.   clockInit();          /* init timer */

  211.   ispSetSCKOption(ISP_SCK_FAST);

  212.   usbInit();
  213.   sei();
  214.   for(;;){                /* main event loop */
  215.     usbPoll();
  216.   }
  217.   return 0;
  218. }

复制代码
全部资料(压缩包)下载:
windows端驱动.zip (32.27 KB, 下载次数: 16) 固件和AVR单片机源码.zip (146.18 KB, 下载次数: 16) 原理图和PCB源文件.zip (122.32 KB, 下载次数: 13)



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

使用道具 举报

沙发
ID:125666 发表于 2016-6-7 16:21 | 只看该作者
好牛逼
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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