ArduinoISP Versión 04m3
ArduinoISP Versión 04m3
ArduinoISP Versión 04m3
ArduinoIS
P versión
04m3
// Copyright (c) 2008-2011 Randall Bohn
// Si necesita una licencia, vea
// http://www.opensource.org/licenses/bsd-license.php
//
// Este boceto convierte al Arduino en un AVRISP
// usando los siguientes pines arduino:
//
// nombre del pin: not-mega: mega (1280 y 2560)
// reinicio esclavo: 10: 53
// MOSI: 11: 51
// MISO: 12: 50
// SCK: 13: 52
//
// Coloque un LED (con resistencia) en los siguientes pines:
// 9: Heartbeat: muestra que el programador se está ejecutando
// 8: Error: se ilumina si algo sale mal (use rojo si eso tiene sentido)
// 7: Programación - En comunicación con el esclavo
//
// 23 de julio de 2011 Randall Bohn
// -Dirección Arduino número 509 :: Portabilidad de ArduinoISP
// http://code.google.com/p/arduino/issues/detail?id=509
//
// octubre de 2010 por Randall Bohn
// - Escribir en EEPROM> 256 bytes
// - Mejor uso de LED:
// - Flash LED_PMODE en cada confirmación flash
// - Flash LED_PMODE al escribir EEPROM (ambos dan retroalimentación
visual del progreso de la escritura)
// - Enciende LED_ERR cada vez que golpeamos un STK_NOSYNC. Apáguelo
cuando vuelva a sincronizarse.
// - Usa pins_arduino.h (también debería funcionar en Arduino Mega)
//
// octubre de 2009 por David A. Mellis
// - Se agregó soporte para el comando de lectura de firma
//
// febrero de 2009 por Randall Bohn
// - Se agregó soporte para escribir en EEPROM (¿qué tomó tanto tiempo?)
// Los usuarios de Windows deberían considerar la posibilidad de WinAVR
en lugar de
// avrdude incluido con el software Arduino.
//
// enero de 2008 por Randall Bohn
// - Gracias a Amplificar por ayudarme con el protocolo STK500
// - El protocolo AVRISP / STK500 (mk I) se usa en el cargador de
arranque arduino
// - Las funciones de SPI aquí desarrolladas para el programador
AVR910_ARD
// - Más información en http://code.google.com/p/mega-isp
#include "pins_arduino.h"
#definir RESET SS
#define LED_HB 9
#define LED_ERR 8
#define LED_PMODE 7
#define PROG_FLICKER verdadero
#define HWVER 2
#define SWMAJ 1
#definir SWMIN 18
// Definiciones STK
#define STK_OK 0x10
#define STK_FAILED 0x11
#define STK_UNKNOWN 0x12
#define STK_INSYNC 0x14
#define STK_NOSYNC 0x15
#define CRC_EOP 0x20 // ok es un espacio ...
configuración nula () {
Serial.begin (19200);
pinMode (LED_PMODE, SALIDA);
pulso (LED_PMODE, 2);
pinMode (LED_ERR, OUTPUT);
pulso (LED_ERR, 2);
pinMode (LED_HB, SALIDA);
pulso (LED_HB, 2);
}
int error = 0;
int pmode = 0;
// dirección para leer y escribir, establecida por el comando 'U'
ahí;
uint8_t buff [256]; // almacenamiento global en bloque
parámetro param;
uint8_t getch () {
while (! Serial.available ());
volver Serial.read ();
}
relleno vacío (int n) {
para (int x = 0; x <n; x ++) {
buff [x] = getch ();
}
}
#define PTIME 30
pulso vacío (int pin, int veces) {
hacer {
digitalWrite (pin, ALTO);
retraso (PTIME);
digitalWrite (pin, BAJO);
retraso (PTIME);
}
while (veces--);
}
nulo spi_init () {
uint8_t x;
SPCR = 0x53;
x = SPSR;
x = SPDR;
}
nulo spi_wait () {
hacer {
}
while (! (SPSR & (1 << SPIF)));
}
void set_parameters () {
// llama a esto después de leer el paquete de parámetros en buff []
param.devicecode = buff [0];
param.revision = buff [1];
param.progtype = buff [2];
param.parmode = buff [3];
param.polling = buff [4];
param.selftimed = buff [5];
param.lockbytes = buff [6];
param.fusebytes = buff [7];
param.flashpoll = buff [8];
// ignorar buff [9] (= buff [8])
// los siguientes son 16 bits (big endian)
param.eeprompoll = beget16 (& buff [10]);
param.pagesize = beget16 (& buff [12]);
param.eepromsize = beget16 (& buff [14]);
void start_pmode () {
spi_init ();
// los siguientes retrasos pueden no funcionar en todos los
objetivos ...
pinMode (RESET, OUTPUT);
digitalWrite (RESET, ALTO);
pinMode (SCK, SALIDA);
digitalWrite (SCK, LOW);
retraso (50);
digitalWrite (RESET, BAJO);
retraso (50);
pinMode (MISO, INPUT);
pinMode (MOSI, SALIDA);
spi_transaction (0xAC, 0x53, 0x00, 0x00);
pmode = 1;
}
void end_pmode () {
pinMode (MISO, INPUT);
pinMode (MOSI, INPUT);
pinMode (SCK, INPUT);
pinMode (RESET, INPUT);
pmode = 0;
}
nulo universal () {
int w;
uint8_t ch;
relleno (4);
ch = spi_transaction (beneficio [0], beneficio [1], beneficio [2],
beneficio [3]);
brevemente (ch);
}
commit (página);
volver STK_OK;
}
void program_page () {
resultado de char = (char) STK_FAILED;
int longitud = 256 * getch ();
longitud + = getch ();
char memtype = getch ();
// memoria flash @ aquí, (longitud) bytes
if (memtype == 'F') {
escribir_flash (longitud);
regreso;
}
if (memtype == 'E') {
resultado = (char) write_eeprom (longitud);
if (CRC_EOP == getch ()) {
Serial.print ((char) STK_INSYNC);
Serial.print (resultado);
}
más {
error ++;
Serial.print ((char) STK_NOSYNC);
}
regreso;
}
Serial.print ((char) STK_FAILED);
regreso;
}
void read_page () {
resultado de char = (char) STK_FAILED;
int longitud = 256 * getch ();
longitud + = getch ();
char memtype = getch ();
if (CRC_EOP! = getch ()) {
error ++;
Serial.print ((char) STK_NOSYNC);
regreso;
}
Serial.print ((char) STK_INSYNC);
if (memtype == 'F') result = flash_read_page (length);
if (memtype == 'E') result = eeprom_read_page (length);
Serial.print (resultado);
regreso;
}
void read_signature () {
if (CRC_EOP! = getch ()) {
error ++;
Serial.print ((char) STK_NOSYNC);
regreso;
}
Serial.print ((char) STK_INSYNC);
uint8_t high = spi_transaction (0x30, 0x00, 0x00, 0x00);
Serial.print ((char) alto);
uint8_t middle = spi_transaction (0x30, 0x00, 0x01, 0x00);
Serial.print ((char) medio);
uint8_t low = spi_transaction (0x30, 0x00, 0x02, 0x00);
Serial.print ((char) bajo);
Serial.print ((char) STK_OK);
}
//////////////////////////////////////////
//////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
/
/////////////////////////////////////////////////////////////////////////
/
int avrisp () {
uint8_t datos, bajo, alto;
uint8_t ch = getch ();
interruptor (ch) {
caso '0': // inicio de sesión
error = 0;
empty_reply ();
descanso;
caso 1':
if (getch () == CRC_EOP) {
Serial.print ((char) STK_INSYNC);
Serial.print ("AVR ISP");
Serial.print ((char) STK_OK);
}
descanso;
caso 'A':
get_version (getch ());
descanso;
caso 'B':
relleno (20);
set_parameters ();
empty_reply ();
descanso;
caso 'E': // parámetros extendidos - ignorar por ahora
relleno (5);
empty_reply ();
descanso;
caso 'P':
start_pmode ();
empty_reply ();
descanso;
caso 'U': // establecer dirección (palabra)
aquí = getch ();
aquí + = 256 * getch ();
empty_reply ();
descanso;