/*file:SoftwareSPI.cpp
* author:julianh2o
* edited:ahmet
* edit? add 8-16 bit function and automatic chip select(remove select and deseclt command)
*/
#include "SoftwareSPI.h"
#define bit_len8 8
#define bit_len16 16
SoftwareSPI::SoftwareSPI(byte pin_sck, byte pin_mosi, byte pin_miso, byte pin_cs) {
_pin_sck = pin_sck;
_pin_mosi = pin_mosi;
_pin_miso = pin_miso;
_pin_cs = pin_cs;
}
void SoftwareSPI::begin() {
pinMode(_pin_cs, OUTPUT);
pinMode(_pin_sck, OUTPUT);
pinMode(_pin_mosi, OUTPUT);
pinMode(_pin_miso, INPUT);
}
//==================8 BIT TRANSFER===========================
byte SoftwareSPI::transfer8(byte b) {
byte rec8 = 0;
digitalWrite(_pin_cs,LOW);
for (int i = 0; i < bit_len8; i++) {
digitalWrite(_pin_mosi, bitRead(b, 7-i)); //MSB first
digitalWrite(_pin_sck, HIGH);
bitWrite(rec8, 7-i, digitalRead(_pin_miso));
digitalWrite(_pin_sck, LOW);
}
digitalWrite(_pin_cs,HIGH);
return rec8;
}
//==================8 BIT TRANSFER===========================
//==================16 BIT TRANSFER===========================
byte SoftwareSPI::transfer16(byte b) {
byte rec16 = 0;
digitalWrite(_pin_cs,LOW);
for (int i = 0; i < bit_len16; i++) {
digitalWrite(_pin_mosi, bitRead(b, 15-i)); //MSB first
digitalWrite(_pin_sck, HIGH);
bitWrite(rec16, 15-i, digitalRead(_pin_miso));
digitalWrite(_pin_sck, LOW);
}
digitalWrite(_pin_cs,HIGH);
return rec16;
}
//==================16 BIT TRANSFER===========================
/*
void SoftwareSPI::select() { //REMOVE
digitalWrite(_pin_cs,LOW);
}
*/
/*
void SoftwareSPI::deselect() { //REMOVE
digitalWrite(_pin_cs,HIGH);
}
*/