mirror of
https://github.com/arduino/Arduino.git
synced 2025-03-15 12:29:26 +01:00
Implement bitbang SPI for slow clock devices. (Sylvan Butler).
This commit is contained in:
parent
a17a757722
commit
64e52d8016
@ -43,7 +43,6 @@
|
|||||||
// - The SPI functions herein were developed for the AVR910_ARD programmer
|
// - The SPI functions herein were developed for the AVR910_ARD programmer
|
||||||
// - More information at http://code.google.com/p/mega-isp
|
// - More information at http://code.google.com/p/mega-isp
|
||||||
|
|
||||||
#include "SPI.h"
|
|
||||||
#include "pins_arduino.h"
|
#include "pins_arduino.h"
|
||||||
// Use pin 10 to reset the target
|
// Use pin 10 to reset the target
|
||||||
#define RESET 10
|
#define RESET 10
|
||||||
@ -53,6 +52,17 @@
|
|||||||
#define LED_PMODE 7
|
#define LED_PMODE 7
|
||||||
#define PROG_FLICKER true
|
#define PROG_FLICKER true
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_SAM) or defined(ARDUINO_ARCH_SAMD)
|
||||||
|
|
||||||
|
#define SPI_CLOCK_DIV_MAX 255
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define USE_HARDWARE_SPI
|
||||||
|
#define SPI_CLOCK_DIV_MAX SPI_CLOCK_DIV_128
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#define HWVER 2
|
#define HWVER 2
|
||||||
#define SWMAJ 1
|
#define SWMAJ 1
|
||||||
#define SWMIN 18
|
#define SWMIN 18
|
||||||
@ -67,12 +77,52 @@
|
|||||||
|
|
||||||
void pulse(int pin, int times);
|
void pulse(int pin, int times);
|
||||||
|
|
||||||
|
#ifdef USE_HARDWARE_SPI
|
||||||
|
#include "SPI.h"
|
||||||
|
#else
|
||||||
|
|
||||||
|
class BitBangedSPI {
|
||||||
|
public:
|
||||||
|
void setDataMode(uint8_t dataMode) {
|
||||||
|
(void) dataMode;
|
||||||
|
}
|
||||||
|
void setBitOrder(uint8_t bitOrder) {
|
||||||
|
(void) bitOrder;
|
||||||
|
}
|
||||||
|
void setClockDivider(uint8_t clockDiv) {
|
||||||
|
(void) clockDiv;
|
||||||
|
}
|
||||||
|
|
||||||
|
void begin() {
|
||||||
|
pinMode(MISO, INPUT);
|
||||||
|
pinMode(RESET, OUTPUT);
|
||||||
|
pinMode(SCK, OUTPUT);
|
||||||
|
pinMode(MOSI, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void end() {}
|
||||||
|
|
||||||
|
uint8_t transfer (uint8_t b) {
|
||||||
|
for (unsigned int i = 0; i < 8; ++i) {
|
||||||
|
digitalWrite(MOSI, b & 0x80);
|
||||||
|
digitalWrite(SCK, HIGH);
|
||||||
|
b = (b << 1) | digitalRead(MISO);
|
||||||
|
digitalWrite(SCK, LOW); // slow pulse
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static BitBangedSPI SPI;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(19200);
|
Serial.begin(19200);
|
||||||
SPI.setDataMode(0);
|
SPI.setDataMode(0);
|
||||||
SPI.setBitOrder(MSBFIRST);
|
SPI.setBitOrder(MSBFIRST);
|
||||||
// Clock Div can be 2,4,8,16,32,64, or 128
|
// Select the slowest possible clock
|
||||||
SPI.setClockDivider(SPI_CLOCK_DIV128);
|
SPI.setClockDivider(SPI_CLOCK_DIV_MAX);
|
||||||
pinMode(LED_PMODE, OUTPUT);
|
pinMode(LED_PMODE, OUTPUT);
|
||||||
pulse(LED_PMODE, 2);
|
pulse(LED_PMODE, 2);
|
||||||
pinMode(LED_ERR, OUTPUT);
|
pinMode(LED_ERR, OUTPUT);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user