|
43 | 43 | // - The SPI functions herein were developed for the AVR910_ARD programmer
|
44 | 44 | // - More information at http://code.google.com/p/mega-isp
|
45 | 45 |
|
46 |
| -#include "SPI.h" |
47 | 46 | #include "pins_arduino.h"
|
48 | 47 | // Use pin 10 to reset the target
|
49 | 48 | #define RESET 10
|
|
53 | 52 | #define LED_PMODE 7
|
54 | 53 | #define PROG_FLICKER true
|
55 | 54 |
|
| 55 | +#if defined(ARDUINO_ARCH_SAM) or defined(ARDUINO_ARCH_SAMD) |
| 56 | + |
| 57 | +#define SPI_CLOCK_DIV_MAX 255 |
| 58 | + |
| 59 | +#else |
| 60 | + |
| 61 | +#define USE_HARDWARE_SPI |
| 62 | +#define SPI_CLOCK_DIV_MAX SPI_CLOCK_DIV_128 |
| 63 | + |
| 64 | +#endif |
| 65 | + |
56 | 66 | #define HWVER 2
|
57 | 67 | #define SWMAJ 1
|
58 | 68 | #define SWMIN 18
|
|
67 | 77 |
|
68 | 78 | void pulse(int pin, int times);
|
69 | 79 |
|
| 80 | +#ifdef USE_HARDWARE_SPI |
| 81 | +#include "SPI.h" |
| 82 | +#else |
| 83 | + |
| 84 | +class BitBangedSPI { |
| 85 | + public: |
| 86 | + void setDataMode(uint8_t dataMode) { |
| 87 | + (void) dataMode; |
| 88 | + } |
| 89 | + void setBitOrder(uint8_t bitOrder) { |
| 90 | + (void) bitOrder; |
| 91 | + } |
| 92 | + void setClockDivider(uint8_t clockDiv) { |
| 93 | + (void) clockDiv; |
| 94 | + } |
| 95 | + |
| 96 | + void begin() { |
| 97 | + pinMode(MISO, INPUT); |
| 98 | + pinMode(RESET, OUTPUT); |
| 99 | + pinMode(SCK, OUTPUT); |
| 100 | + pinMode(MOSI, OUTPUT); |
| 101 | + } |
| 102 | + |
| 103 | + void end() {} |
| 104 | + |
| 105 | + uint8_t transfer (uint8_t b) { |
| 106 | + for (unsigned int i = 0; i < 8; ++i) { |
| 107 | + digitalWrite(MOSI, b & 0x80); |
| 108 | + digitalWrite(SCK, HIGH); |
| 109 | + b = (b << 1) | digitalRead(MISO); |
| 110 | + digitalWrite(SCK, LOW); // slow pulse |
| 111 | + } |
| 112 | + return b; |
| 113 | + } |
| 114 | +}; |
| 115 | + |
| 116 | +static BitBangedSPI SPI; |
| 117 | + |
| 118 | +#endif |
| 119 | + |
70 | 120 | void setup() {
|
71 | 121 | Serial.begin(19200);
|
72 | 122 | SPI.setDataMode(0);
|
73 | 123 | SPI.setBitOrder(MSBFIRST);
|
74 |
| - // Clock Div can be 2,4,8,16,32,64, or 128 |
75 |
| - SPI.setClockDivider(SPI_CLOCK_DIV128); |
| 124 | + // Select the slowest possible clock |
| 125 | + SPI.setClockDivider(SPI_CLOCK_DIV_MAX); |
76 | 126 | pinMode(LED_PMODE, OUTPUT);
|
77 | 127 | pulse(LED_PMODE, 2);
|
78 | 128 | pinMode(LED_ERR, OUTPUT);
|
|
0 commit comments