many updates..
new sensors.. display.. led.. drawing.. stuff..
This commit is contained in:
402
io/SoftSPI.h
402
io/SoftSPI.h
@@ -1,11 +1,19 @@
|
||||
#ifndef SOFTSPI_H
|
||||
#define SOFTSPI_H
|
||||
|
||||
//#include "IO.h"
|
||||
#include "GPIO.h"
|
||||
#include "../Platforms.h"
|
||||
#include "../Debug.h"
|
||||
|
||||
|
||||
|
||||
#pragma GCC push_options
|
||||
#pragma GCC optimize ("O3")
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
#if (PLATFORM == NODE_MCU) || (PLATFORM == WEMOS_D1_MINI)
|
||||
|
||||
#include "fastGPIO.h"
|
||||
@@ -34,29 +42,35 @@
|
||||
#include "driver/gpio.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define SPI_PIN_MISO GPIO_NUM_35
|
||||
#define SPI_PIN_MOSI GPIO_NUM_32
|
||||
#define SPI_PIN_CLK GPIO_NUM_27
|
||||
#define SPI_PIN_CS GPIO_NUM_25
|
||||
// #define SPI_PIN_MISO GPIO_NUM_35
|
||||
// #define SPI_PIN_MOSI GPIO_NUM_32
|
||||
// #define SPI_PIN_CLK GPIO_NUM_27
|
||||
// #define SPI_PIN_CS GPIO_NUM_25
|
||||
|
||||
#define SPI_CS_OUTPUT gpio_set_direction(SPI_PIN_CS, GPIO_MODE_OUTPUT)
|
||||
#define SPI_MOSI_OUTPUT gpio_set_direction(SPI_PIN_MOSI, GPIO_MODE_OUTPUT)
|
||||
#define SPI_MISO_INPUT gpio_set_direction(SPI_PIN_MISO, GPIO_MODE_INPUT)
|
||||
#define SPI_PIN_MISO GPIO_NUM_19
|
||||
#define SPI_PIN_MOSI GPIO_NUM_23
|
||||
#define SPI_PIN_CLK GPIO_NUM_18
|
||||
#define SPI_PIN_CS GPIO_NUM_2
|
||||
|
||||
#define SPI_CS_OUTPUT GPIO::setOutput(SPI_PIN_CS)
|
||||
#define SPI_MOSI_OUTPUT GPIO::setOutput(SPI_PIN_MOSI)
|
||||
#define SPI_MISO_INPUT GPIO::setInput(SPI_PIN_MISO)
|
||||
#define SPI_MISO_NO_PULLUP //gpio_set_pull_mode(SPI_PIN_MISO, GPIO_FLOATING) /// ??????
|
||||
#define SPI_CLK_OUTPUT gpio_set_direction(SPI_PIN_CLK, GPIO_MODE_OUTPUT)
|
||||
#define SPI_CLK_OUTPUT GPIO::setOutput(SPI_PIN_CLK)
|
||||
|
||||
#define SPI_CS_LO gpio_set_level(SPI_PIN_CS, 0)
|
||||
#define SPI_CS_HI gpio_set_level(SPI_PIN_CS, 1)
|
||||
#define SPI_CS_LO GPIO::clear(SPI_PIN_CS)
|
||||
#define SPI_CS_HI GPIO::set(SPI_PIN_CS)
|
||||
|
||||
#define SPI_CLK_LO gpio_set_level(SPI_PIN_CLK, 0)
|
||||
#define SPI_CLK_HI gpio_set_level(SPI_PIN_CLK, 1)
|
||||
#define SPI_CLK_LO GPIO::clear(SPI_PIN_CLK)
|
||||
#define SPI_CLK_HI GPIO::set(SPI_PIN_CLK)
|
||||
|
||||
#define SPI_MOSI_LO gpio_set_level(SPI_PIN_MOSI, 0)
|
||||
#define SPI_MOSI_HI gpio_set_level(SPI_PIN_MOSI, 1)
|
||||
#define SPI_MOSI_LO GPIO::clear(SPI_PIN_MOSI)
|
||||
#define SPI_MOSI_HI GPIO::set(SPI_PIN_MOSI)
|
||||
#define SPI_MOSI_SC(v) GPIO::setOrClear(SPI_PIN_MOSI, v)
|
||||
|
||||
#define SPI_MISO_READ gpio_get_level(SPI_PIN_MISO)
|
||||
#define SPI_MISO_READ GPIO::get(SPI_PIN_MISO);
|
||||
|
||||
#define SPI_FAST
|
||||
#define SPI_FAST
|
||||
|
||||
#else
|
||||
#error "not supported"
|
||||
@@ -66,18 +80,6 @@ namespace spi {
|
||||
|
||||
static constexpr const char* NAME = "SoftSPI";
|
||||
|
||||
// MTDI GPIO12 MISO (DIN) D6
|
||||
// MTCK GPIO13 MOSI (DOUT) D7
|
||||
// MTMS GPIO14 CLOCK D5
|
||||
// MTDO GPIO15 CS / SS D8
|
||||
|
||||
// #define PIN_CLK 14
|
||||
// #define PIN_MISO 12
|
||||
// #define PIN_MOSI 13
|
||||
|
||||
// #define BIT(nr) (1 << 0)
|
||||
|
||||
//public:
|
||||
|
||||
// SoftSPI() {
|
||||
// // NOT CALLED!
|
||||
@@ -94,12 +96,14 @@ namespace spi {
|
||||
|
||||
static inline bool getMISO() {return SPI_MISO_READ;} // D6
|
||||
|
||||
|
||||
#ifdef SPI_FAST
|
||||
static inline void wait() {
|
||||
__asm__ __volatile__("nop");
|
||||
//__asm__ __volatile__("nop");
|
||||
}
|
||||
static inline void waitLong() {
|
||||
DELAY_US(1);
|
||||
//DELAY_US(1);
|
||||
__asm__ __volatile__("nop"); __asm__ __volatile__("nop");
|
||||
}
|
||||
#else
|
||||
static inline void wait() {
|
||||
@@ -136,7 +140,7 @@ namespace spi {
|
||||
return (inp) ? 1 : 0;
|
||||
}
|
||||
|
||||
/** write one bit to the bus */
|
||||
// write one bit to the bus
|
||||
static inline void writeBit(const bool out) {
|
||||
if(out) {SPI_MOSI_HI;} else {SPI_MOSI_LO;}
|
||||
wait();
|
||||
@@ -146,7 +150,7 @@ namespace spi {
|
||||
wait();
|
||||
}
|
||||
|
||||
/** read one bit from the bus */
|
||||
// read one bit from the bus
|
||||
static inline uint8_t readBit() {
|
||||
clkHi();
|
||||
wait();
|
||||
@@ -172,7 +176,7 @@ namespace spi {
|
||||
}
|
||||
|
||||
|
||||
/** read 16 bits */
|
||||
// read 16 bits
|
||||
static uint16_t IN_FLASH readWord() {
|
||||
return
|
||||
(readBit() << 15) |
|
||||
@@ -193,54 +197,87 @@ namespace spi {
|
||||
(readBit() << 0);
|
||||
}
|
||||
|
||||
/** read 8 bits */
|
||||
static uint8_t IN_FLASH readByte() {
|
||||
// read 8 bits
|
||||
static uint8_t IRAM_ATTR readByte() {
|
||||
return
|
||||
(readBit() << 7) |
|
||||
(readBit() << 6) |
|
||||
(readBit() << 5) |
|
||||
(readBit() << 4) |
|
||||
(readBit() << 3) |
|
||||
(readBit() << 2) |
|
||||
(readBit() << 1) |
|
||||
(readBit() << 0);
|
||||
(readBit() << 7) |
|
||||
(readBit() << 6) |
|
||||
(readBit() << 5) |
|
||||
(readBit() << 4) |
|
||||
(readBit() << 3) |
|
||||
(readBit() << 2) |
|
||||
(readBit() << 1) |
|
||||
(readBit() << 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void IN_FLASH writeWord(const uint16_t word) {
|
||||
writeBit(word & BIT(15));
|
||||
writeBit(word & BIT(14));
|
||||
writeBit(word & BIT(13));
|
||||
writeBit(word & BIT(12));
|
||||
writeBit(word & BIT(11));
|
||||
writeBit(word & BIT(10));
|
||||
writeBit(word & BIT( 9));
|
||||
writeBit(word & BIT( 8));
|
||||
writeBit(word & BIT( 7));
|
||||
writeBit(word & BIT( 6));
|
||||
writeBit(word & BIT( 5));
|
||||
writeBit(word & BIT( 4));
|
||||
writeBit(word & BIT( 3));
|
||||
writeBit(word & BIT( 2));
|
||||
writeBit(word & BIT( 1));
|
||||
writeBit(word & BIT( 0));
|
||||
static void IRAM_ATTR writeQuad(const uint32_t quad) {
|
||||
writeBit(quad & BIT(31));
|
||||
writeBit(quad & BIT(30));
|
||||
writeBit(quad & BIT(29));
|
||||
writeBit(quad & BIT(28));
|
||||
writeBit(quad & BIT(27));
|
||||
writeBit(quad & BIT(26));
|
||||
writeBit(quad & BIT(25));
|
||||
writeBit(quad & BIT(24));
|
||||
writeBit(quad & BIT(23));
|
||||
writeBit(quad & BIT(22));
|
||||
writeBit(quad & BIT(21));
|
||||
writeBit(quad & BIT(20));
|
||||
writeBit(quad & BIT(19));
|
||||
writeBit(quad & BIT(18));
|
||||
writeBit(quad & BIT(17));
|
||||
writeBit(quad & BIT(16));
|
||||
writeBit(quad & BIT(15));
|
||||
writeBit(quad & BIT(14));
|
||||
writeBit(quad & BIT(13));
|
||||
writeBit(quad & BIT(12));
|
||||
writeBit(quad & BIT(11));
|
||||
writeBit(quad & BIT(10));
|
||||
writeBit(quad & BIT( 9));
|
||||
writeBit(quad & BIT( 8));
|
||||
writeBit(quad & BIT( 7));
|
||||
writeBit(quad & BIT( 6));
|
||||
writeBit(quad & BIT( 5));
|
||||
writeBit(quad & BIT( 4));
|
||||
writeBit(quad & BIT( 3));
|
||||
writeBit(quad & BIT( 2));
|
||||
writeBit(quad & BIT( 1));
|
||||
writeBit(quad & BIT( 0));
|
||||
}
|
||||
|
||||
static void IN_FLASH writeByte(const uint8_t byte) {
|
||||
writeBit(byte & BIT( 7));
|
||||
writeBit(byte & BIT( 6));
|
||||
writeBit(byte & BIT( 5));
|
||||
writeBit(byte & BIT( 4));
|
||||
writeBit(byte & BIT( 3));
|
||||
writeBit(byte & BIT( 2));
|
||||
writeBit(byte & BIT( 1));
|
||||
writeBit(byte & BIT( 0));
|
||||
static void IRAM_ATTR writeWord(const uint16_t word) {
|
||||
writeBit(word & BIT(15));
|
||||
writeBit(word & BIT(14));
|
||||
writeBit(word & BIT(13));
|
||||
writeBit(word & BIT(12));
|
||||
writeBit(word & BIT(11));
|
||||
writeBit(word & BIT(10));
|
||||
writeBit(word & BIT( 9));
|
||||
writeBit(word & BIT( 8));
|
||||
writeBit(word & BIT( 7));
|
||||
writeBit(word & BIT( 6));
|
||||
writeBit(word & BIT( 5));
|
||||
writeBit(word & BIT( 4));
|
||||
writeBit(word & BIT( 3));
|
||||
writeBit(word & BIT( 2));
|
||||
writeBit(word & BIT( 1));
|
||||
writeBit(word & BIT( 0));
|
||||
}
|
||||
|
||||
static void IRAM_ATTR writeByte(uint8_t byte) {
|
||||
writeBit(byte & BIT( 7));
|
||||
writeBit(byte & BIT( 6));
|
||||
writeBit(byte & BIT( 5));
|
||||
writeBit(byte & BIT( 4));
|
||||
writeBit(byte & BIT( 3));
|
||||
writeBit(byte & BIT( 2));
|
||||
writeBit(byte & BIT( 1));
|
||||
writeBit(byte & BIT( 0));
|
||||
}
|
||||
|
||||
static uint16_t IN_FLASH readWriteWord(const uint16_t word) {
|
||||
return
|
||||
(readWriteBit(word & BIT(15)) << 15) |
|
||||
(readWriteBit(word & BIT(15)) << 15) |
|
||||
(readWriteBit(word & BIT(14)) << 14) |
|
||||
(readWriteBit(word & BIT(13)) << 13) |
|
||||
(readWriteBit(word & BIT(12)) << 12) |
|
||||
@@ -273,6 +310,225 @@ namespace spi {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <int PIN_MISO, int PIN_MOSI, int PIN_CLK, bool fast> class SoftSPI {
|
||||
|
||||
static constexpr const char* NAME = "softSPI";
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
SoftSPI() {
|
||||
init();
|
||||
}
|
||||
|
||||
private:
|
||||
void init() {
|
||||
debugMod(NAME, "init()");
|
||||
GPIO::setInput(PIN_MISO);
|
||||
GPIO::setOutput(PIN_MOSI);
|
||||
GPIO::setOutput(PIN_CLK);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
static inline void wait() {
|
||||
if (!fast) {
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
__asm__ __volatile__("nop");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline void clkLo() { GPIO::clear(PIN_CLK); }
|
||||
inline void clkHi() { GPIO::set(PIN_CLK); }
|
||||
|
||||
/** write one bit to the bus */
|
||||
inline void writeBit(const bool out) {
|
||||
if(out) {GPIO::set(PIN_MOSI);} else {GPIO::clear(PIN_MOSI);}
|
||||
wait();
|
||||
clkHi();
|
||||
wait();
|
||||
clkLo();
|
||||
wait();
|
||||
}
|
||||
|
||||
/** read one bit from the bus */
|
||||
inline uint8_t readBit() {
|
||||
clkHi();
|
||||
wait();
|
||||
const bool val = GPIO::get(PIN_MISO);
|
||||
wait();
|
||||
clkLo();
|
||||
wait();
|
||||
return (val) ? 1 : 0;
|
||||
}
|
||||
|
||||
inline uint8_t readWriteBit(const bool out) {
|
||||
if(out) {GPIO::set(PIN_MOSI);} else {GPIO::clear(PIN_MOSI);}
|
||||
wait();
|
||||
clkHi();
|
||||
wait();
|
||||
const bool inp = GPIO::get(PIN_MISO);
|
||||
wait();
|
||||
clkLo();
|
||||
wait();
|
||||
return (inp) ? 1 : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
void IRAM_ATTR writeQuad(const uint32_t quad) {
|
||||
// writeBit(quad & BIT(31));
|
||||
// writeBit(quad & BIT(30));
|
||||
// writeBit(quad & BIT(29));
|
||||
// writeBit(quad & BIT(28));
|
||||
// writeBit(quad & BIT(27));
|
||||
// writeBit(quad & BIT(26));
|
||||
// writeBit(quad & BIT(25));
|
||||
// writeBit(quad & BIT(24));
|
||||
// writeBit(quad & BIT(23));
|
||||
// writeBit(quad & BIT(22));
|
||||
// writeBit(quad & BIT(21));
|
||||
// writeBit(quad & BIT(20));
|
||||
// writeBit(quad & BIT(19));
|
||||
// writeBit(quad & BIT(18));
|
||||
// writeBit(quad & BIT(17));
|
||||
// writeBit(quad & BIT(16));
|
||||
// writeBit(quad & BIT(15));
|
||||
// writeBit(quad & BIT(14));
|
||||
// writeBit(quad & BIT(13));
|
||||
// writeBit(quad & BIT(12));
|
||||
// writeBit(quad & BIT(11));
|
||||
// writeBit(quad & BIT(10));
|
||||
// writeBit(quad & BIT( 9));
|
||||
// writeBit(quad & BIT( 8));
|
||||
// writeBit(quad & BIT( 7));
|
||||
// writeBit(quad & BIT( 6));
|
||||
// writeBit(quad & BIT( 5));
|
||||
// writeBit(quad & BIT( 4));
|
||||
// writeBit(quad & BIT( 3));
|
||||
// writeBit(quad & BIT( 2));
|
||||
// writeBit(quad & BIT( 1));
|
||||
// writeBit(quad & BIT( 0));
|
||||
writeByte((quad>>24)&0xFF);
|
||||
writeByte((quad>>16)&0xFF);
|
||||
writeByte((quad>> 8)&0xFF);
|
||||
writeByte((quad>> 0)&0xFF);
|
||||
}
|
||||
|
||||
void IRAM_ATTR writeWord(const uint16_t word) {
|
||||
// writeBit(word & BIT(15));
|
||||
// writeBit(word & BIT(14));
|
||||
// writeBit(word & BIT(13));
|
||||
// writeBit(word & BIT(12));
|
||||
// writeBit(word & BIT(11));
|
||||
// writeBit(word & BIT(10));
|
||||
// writeBit(word & BIT( 9));
|
||||
// writeBit(word & BIT( 8));
|
||||
// writeBit(word & BIT( 7));
|
||||
// writeBit(word & BIT( 6));
|
||||
// writeBit(word & BIT( 5));
|
||||
// writeBit(word & BIT( 4));
|
||||
// writeBit(word & BIT( 3));
|
||||
// writeBit(word & BIT( 2));
|
||||
// writeBit(word & BIT( 1));
|
||||
// writeBit(word & BIT( 0));
|
||||
writeByte((word>>8)&0xFF);
|
||||
writeByte((word>>0)&0xFF);
|
||||
}
|
||||
|
||||
void IRAM_ATTR writeByte(uint8_t byte) {
|
||||
writeBit(byte & BIT( 7));
|
||||
writeBit(byte & BIT( 6));
|
||||
writeBit(byte & BIT( 5));
|
||||
writeBit(byte & BIT( 4));
|
||||
writeBit(byte & BIT( 3));
|
||||
writeBit(byte & BIT( 2));
|
||||
writeBit(byte & BIT( 1));
|
||||
writeBit(byte & BIT( 0));
|
||||
}
|
||||
|
||||
/** read 8 bits */
|
||||
uint8_t readByte() {
|
||||
GPIO::clear(PIN_MOSI);
|
||||
return
|
||||
(readBit() << 7) |
|
||||
(readBit() << 6) |
|
||||
(readBit() << 5) |
|
||||
(readBit() << 4) |
|
||||
(readBit() << 3) |
|
||||
(readBit() << 2) |
|
||||
(readBit() << 1) |
|
||||
(readBit() << 0);
|
||||
}
|
||||
|
||||
uint8_t readWriteByte(const uint8_t byte) {
|
||||
return
|
||||
(readWriteBit(byte & BIT( 7)) << 7) |
|
||||
(readWriteBit(byte & BIT( 6)) << 6) |
|
||||
(readWriteBit(byte & BIT( 5)) << 5) |
|
||||
(readWriteBit(byte & BIT( 4)) << 4) |
|
||||
(readWriteBit(byte & BIT( 3)) << 3) |
|
||||
(readWriteBit(byte & BIT( 2)) << 2) |
|
||||
(readWriteBit(byte & BIT( 1)) << 1) |
|
||||
(readWriteBit(byte & BIT( 0)) << 0);
|
||||
}
|
||||
|
||||
uint32_t readWriteQuad(const uint32_t quad) {
|
||||
return
|
||||
readWriteByte((quad>>24)&0xFF) << 24 |
|
||||
readWriteByte((quad>>16)&0xFF) << 16 |
|
||||
readWriteByte((quad>> 8)&0xFF) << 8 |
|
||||
readWriteByte((quad>> 0)&0xFF) << 0;
|
||||
}
|
||||
|
||||
|
||||
void write(const uint8_t* data, size_t len) {
|
||||
while(len) {
|
||||
writeByte(*data);
|
||||
++data;
|
||||
--len;
|
||||
}
|
||||
}
|
||||
|
||||
void read(uint8_t* dst, size_t len) {
|
||||
while(len) {
|
||||
*dst = readByte();
|
||||
++dst;
|
||||
--len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
#pragma GCC pop_options
|
||||
|
||||
// create an instance ONCE
|
||||
//SoftSPI spi;
|
||||
//using spi = SoftSPI;
|
||||
|
||||
Reference in New Issue
Block a user