Skip to content

Commit 64e52d8

Browse files
Peter Van HoyweghenPeter Van Hoyweghen
Peter Van Hoyweghen
authored and
Peter Van Hoyweghen
committed
Implement bitbang SPI for slow clock devices. (Sylvan Butler).
1 parent a17a757 commit 64e52d8

File tree

1 file changed

+53
-3
lines changed

1 file changed

+53
-3
lines changed

build/shared/examples/11.ArduinoISP/ArduinoISP/ArduinoISP.ino

+53-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
// - The SPI functions herein were developed for the AVR910_ARD programmer
4444
// - More information at http://code.google.com/p/mega-isp
4545

46-
#include "SPI.h"
4746
#include "pins_arduino.h"
4847
// Use pin 10 to reset the target
4948
#define RESET 10
@@ -53,6 +52,17 @@
5352
#define LED_PMODE 7
5453
#define PROG_FLICKER true
5554

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+
5666
#define HWVER 2
5767
#define SWMAJ 1
5868
#define SWMIN 18
@@ -67,12 +77,52 @@
6777

6878
void pulse(int pin, int times);
6979

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+
70120
void setup() {
71121
Serial.begin(19200);
72122
SPI.setDataMode(0);
73123
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);
76126
pinMode(LED_PMODE, OUTPUT);
77127
pulse(LED_PMODE, 2);
78128
pinMode(LED_ERR, OUTPUT);

0 commit comments

Comments
 (0)