├── .gitignore ├── README.md ├── SoftwareSPI.cpp ├── SoftwareSPI.h └── library.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | SoftwareSPI 2 | ----------- 3 | 4 | This is a simple library to simplify bit-banging SPI on an Arduino. It accepts any arduino pins and uses only digitalWrites and digitalReads to handle the data. 5 | 6 | First include the library: 7 | 8 | #include 9 | 10 | Then initialize it with the correct pins: 11 | 12 | SoftwareSPI spi(SPI_SCK,SPI_MOSI,SPI_MISO,SPI_CS); 13 | 14 | **Note: You can use 0 for the CS pin if you don't plan on using spi.select() or spi.deselect()** 15 | 16 | Before using it, configure the pins by calling begin: 17 | 18 | spi.begin(); 19 | 20 | Transfer data by using select, transfer, and deselect: 21 | 22 | spi.select(); 23 | byte value = spi.transfer(5); 24 | spi.deselect(); 25 | 26 | -------------------------------------------------------------------------------- /SoftwareSPI.cpp: -------------------------------------------------------------------------------- 1 | #include "SoftwareSPI.h" 2 | 3 | SoftwareSPI::SoftwareSPI(byte pin_sck, byte pin_mosi, byte pin_miso, byte pin_cs) { 4 | _pin_sck = pin_sck; 5 | _pin_mosi = pin_mosi; 6 | _pin_miso = pin_miso; 7 | _pin_cs = pin_cs; 8 | } 9 | 10 | void SoftwareSPI::begin() { 11 | deselect(); 12 | pinMode(_pin_cs, OUTPUT); 13 | 14 | pinMode(_pin_sck, OUTPUT); 15 | pinMode(_pin_mosi, OUTPUT); 16 | pinMode(_pin_miso, INPUT); 17 | } 18 | 19 | byte SoftwareSPI::transfer(byte b) { 20 | byte rec = 0; 21 | 22 | for (int i = 0; i < 8; i++) { 23 | digitalWrite(_pin_mosi, bitRead(b, 7-i)); //MSB first 24 | digitalWrite(_pin_sck, HIGH); 25 | bitWrite(rec, 7-i, digitalRead(_pin_miso)); 26 | digitalWrite(_pin_sck, LOW); 27 | } 28 | 29 | return rec; 30 | } 31 | 32 | void SoftwareSPI::select() { 33 | digitalWrite(_pin_cs,LOW); 34 | } 35 | 36 | void SoftwareSPI::deselect() { 37 | digitalWrite(_pin_cs,HIGH); 38 | } 39 | 40 | -------------------------------------------------------------------------------- /SoftwareSPI.h: -------------------------------------------------------------------------------- 1 | #ifndef SoftwareSPI_h 2 | #define SoftwareSPI_h 3 | 4 | #if defined(ARDUINO) && ARDUINO >= 100 5 | #include "Arduino.h" 6 | #else 7 | #include "WProgram.h" 8 | #endif 9 | 10 | class SoftwareSPI { 11 | public: 12 | SoftwareSPI(byte, byte, byte, byte); 13 | void begin(); 14 | byte transfer(byte); 15 | void select(); 16 | void deselect(); 17 | 18 | private: 19 | byte _pin_sck; 20 | byte _pin_mosi; 21 | byte _pin_miso; 22 | byte _pin_cs; 23 | }; 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /library.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "SoftwareSPI", 3 | "keywords": "spi", 4 | "description": "A barebones library for bitbanging SPI", 5 | "repository": 6 | { 7 | "type": "git", 8 | "url": "https://github.com/Flickerstrip/SoftwareSPI.git" 9 | }, 10 | "frameworks": "arduino", 11 | "platforms": "*" 12 | } 13 | --------------------------------------------------------------------------------