Half Duplex Version of SWSPI

Fork of SWSPI by Dave Van Wagner

Committer:
martinsimpson
Date:
Tue Jun 19 11:19:34 2018 +0000
Revision:
3:d3be72ac889e
Parent:
2:70039cc8ba02
V3 changed Data output routine and sorted sclk for phase selection

Who changed what in which revision?

UserRevisionLine numberNew contents of line
martinsimpson 1:17d758fe52f8 1 /* SWSPI, Software SPI library
martinsimpson 1:17d758fe52f8 2 * Copyright (c) 2012-2014, David R. Van Wagner, http://techwithdave.blogspot.com
martinsimpson 1:17d758fe52f8 3 *
martinsimpson 1:17d758fe52f8 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
martinsimpson 1:17d758fe52f8 5 * of this software and associated documentation files (the "Software"), to deal
martinsimpson 1:17d758fe52f8 6 * in the Software without restriction, including without limitation the rights
martinsimpson 1:17d758fe52f8 7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
martinsimpson 1:17d758fe52f8 8 * copies of the Software, and to permit persons to whom the Software is
martinsimpson 1:17d758fe52f8 9 * furnished to do so, subject to the following conditions:
martinsimpson 1:17d758fe52f8 10 *
martinsimpson 1:17d758fe52f8 11 * The above copyright notice and this permission notice shall be included in
martinsimpson 1:17d758fe52f8 12 * all copies or substantial portions of the Software.
martinsimpson 1:17d758fe52f8 13 *
martinsimpson 1:17d758fe52f8 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
martinsimpson 1:17d758fe52f8 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
martinsimpson 1:17d758fe52f8 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
martinsimpson 1:17d758fe52f8 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
martinsimpson 1:17d758fe52f8 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
martinsimpson 1:17d758fe52f8 19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
martinsimpson 1:17d758fe52f8 20 * THE SOFTWARE.
martinsimpson 1:17d758fe52f8 21 */
martinsimpson 1:17d758fe52f8 22
martinsimpson 1:17d758fe52f8 23 #include <mbed.h>
martinsimpson 1:17d758fe52f8 24 #include "SWSPI_HD.h"
martinsimpson 1:17d758fe52f8 25
martinsimpson 3:d3be72ac889e 26 SWSPI_HD::SWSPI_HD(PinName dio_pin, PinName sclk_pin, PinName cs_pin)
martinsimpson 1:17d758fe52f8 27 {
martinsimpson 1:17d758fe52f8 28 dio = new DigitalInOut(dio_pin);
martinsimpson 1:17d758fe52f8 29 sclk = new DigitalOut(sclk_pin);
martinsimpson 3:d3be72ac889e 30 cs = new DigitalOut(cs_pin,true);
martinsimpson 1:17d758fe52f8 31 format(8);
martinsimpson 1:17d758fe52f8 32 frequency();
martinsimpson 1:17d758fe52f8 33 }
martinsimpson 1:17d758fe52f8 34
martinsimpson 1:17d758fe52f8 35 SWSPI_HD::~SWSPI_HD()
martinsimpson 1:17d758fe52f8 36 {
martinsimpson 1:17d758fe52f8 37 delete dio;
martinsimpson 1:17d758fe52f8 38 delete sclk;
martinsimpson 3:d3be72ac889e 39 delete cs;
martinsimpson 1:17d758fe52f8 40 }
martinsimpson 1:17d758fe52f8 41
martinsimpson 1:17d758fe52f8 42 void SWSPI_HD::format(int bits, int mode)
martinsimpson 1:17d758fe52f8 43 {
martinsimpson 1:17d758fe52f8 44 this->bits = bits;
martinsimpson 1:17d758fe52f8 45 this->mode = mode;
martinsimpson 1:17d758fe52f8 46 polarity = (mode >> 1) & 1;
martinsimpson 1:17d758fe52f8 47 phase = mode & 1;
martinsimpson 1:17d758fe52f8 48 sclk->write(polarity);
martinsimpson 1:17d758fe52f8 49 }
martinsimpson 1:17d758fe52f8 50
martinsimpson 1:17d758fe52f8 51 void SWSPI_HD::frequency(int hz)
martinsimpson 1:17d758fe52f8 52 {
martinsimpson 1:17d758fe52f8 53 this->freq = hz;
martinsimpson 1:17d758fe52f8 54 }
martinsimpson 1:17d758fe52f8 55
martinsimpson 1:17d758fe52f8 56 int SWSPI_HD::write(int value)
martinsimpson 1:17d758fe52f8 57 {
martinsimpson 1:17d758fe52f8 58 int read = 0;
martinsimpson 3:d3be72ac889e 59 //ensure clock is in right phase to start and disable slave device
martinsimpson 3:d3be72ac889e 60 cs->write(true);
martinsimpson 3:d3be72ac889e 61 sclk->write(!polarity);
martinsimpson 3:d3be72ac889e 62
martinsimpson 2:70039cc8ba02 63 //Write Out
martinsimpson 2:70039cc8ba02 64 dio->output();// set as an OUTPUT
martinsimpson 3:d3be72ac889e 65 cs->write(false);//select slave device (active low)
martinsimpson 1:17d758fe52f8 66 for (int bit = bits-1; bit >= 0; --bit)
martinsimpson 1:17d758fe52f8 67 {
martinsimpson 1:17d758fe52f8 68 dio->write(((value >> bit) & 0x01) != 0);
martinsimpson 3:d3be72ac889e 69 wait(1.0/freq/2);
martinsimpson 2:70039cc8ba02 70 sclk->write(!polarity);
martinsimpson 2:70039cc8ba02 71 wait(1.0/freq/2);
martinsimpson 3:d3be72ac889e 72 sclk->write(polarity);
martinsimpson 2:70039cc8ba02 73 }
martinsimpson 2:70039cc8ba02 74
martinsimpson 2:70039cc8ba02 75 //Read In
martinsimpson 2:70039cc8ba02 76 dio->input();// set as an INPUT
martinsimpson 2:70039cc8ba02 77
martinsimpson 2:70039cc8ba02 78 for (int bit = bits-1; bit >= 0; --bit)
martinsimpson 2:70039cc8ba02 79 {
martinsimpson 1:17d758fe52f8 80 if (phase == 0)
martinsimpson 1:17d758fe52f8 81 {
martinsimpson 1:17d758fe52f8 82 if (dio->read()) // was miso
martinsimpson 1:17d758fe52f8 83 read |= (1 << bit);
martinsimpson 1:17d758fe52f8 84 }
martinsimpson 3:d3be72ac889e 85
martinsimpson 3:d3be72ac889e 86 sclk->write(!polarity);
martinsimpson 3:d3be72ac889e 87
martinsimpson 3:d3be72ac889e 88 wait(1.0/freq/2);
martinsimpson 3:d3be72ac889e 89
martinsimpson 1:17d758fe52f8 90 if (phase == 1)
martinsimpson 1:17d758fe52f8 91 {
martinsimpson 1:17d758fe52f8 92 if (dio->read()) // was miso
martinsimpson 1:17d758fe52f8 93 read |= (1 << bit);
martinsimpson 1:17d758fe52f8 94 }
martinsimpson 1:17d758fe52f8 95
martinsimpson 1:17d758fe52f8 96 sclk->write(polarity);
martinsimpson 1:17d758fe52f8 97
martinsimpson 1:17d758fe52f8 98 wait(1.0/freq/2);
martinsimpson 1:17d758fe52f8 99 }
martinsimpson 3:d3be72ac889e 100 cs->write(true);
martinsimpson 1:17d758fe52f8 101 return read;
martinsimpson 1:17d758fe52f8 102 }
martinsimpson 1:17d758fe52f8 103