I ported the SPI code driver of <David Ogilvy> on ESP8266 Arduino IDE, because the previous release of SPI gives me some errors.
I use Ogilvy's code methods with some improvement; that's only a test alpha, but compiling errors of Arduino IDE are the major problem to use it properly.
I found that the IDE cannot expands some of the macros and it fails with lots of the declarations, because "they are not declared in its scope". I think could be a problem with IDE and not with code, but to dispel all doubts I have posted everything on my github.
Follow the errors identified for further troubleshooting:
In file included from C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/ets_sys.h:12:0,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.h:32,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:26:
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp: In static member function 'static void SPIClass::begin(uint8)':
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:53:37: error: 'SPI_USER' was not declared in this scope
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_CS_SETUP|SPI_CS_HOLD);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:52:40: note: in expansion of macro 'WRITE_PERI_REG'
#define SET_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask)))
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:53:2: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_CS_SETUP|SPI_CS_HOLD);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:54:42: error: 'SPI_FLASH_MODE' was not declared in this scope
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_FLASH_MODE);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:54:2: note: in expansion of macro 'CLEAR_PERI_REG_MASK'
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_FLASH_MODE);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp: In static member function 'static void SPIClass::end()':
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:60:7: error: no match for 'operator!' (operand type is 'SPIClass')
if (!SPI)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:60:7: note: candidate is:
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:60:7: note: operator!(bool) <built-in>
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:60:7: note: no known conversion for argument 1 from 'SPIClass' to 'bool'
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:62:10: error: type 'class SPIClass' argument given to 'delete', expected pointer
delete SPI;
^
In file included from C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/ets_sys.h:12:0,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.h:32,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:26:
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp: In static member function 'static void SPIClass::spi_clock(uint16, uint8)':
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:123:36: error: 'SPI_CLOCK' was not declared in this scope
WRITE_PERI_REG(SPI_CLOCK(SPI_type), SPI_CLK_EQU_SYSCLK);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:123:3: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_CLOCK(SPI_type), SPI_CLK_EQU_SYSCLK);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:127:36: error: 'SPI_CLOCK' was not declared in this scope
WRITE_PERI_REG(SPI_CLOCK(SPI_type),
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:127:3: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_CLOCK(SPI_type),
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp: In static member function 'static void SPIClass::spi_tx_byte_order(uint8)':
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:161:38: error: 'SPI_USER' was not declared in this scope
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_WR_BYTE_ORDER);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:52:40: note: in expansion of macro 'WRITE_PERI_REG'
#define SET_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask)))
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:161:3: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_WR_BYTE_ORDER);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:163:40: error: 'SPI_USER' was not declared in this scope
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_WR_BYTE_ORDER);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:51:40: note: in expansion of macro 'WRITE_PERI_REG'
#define CLEAR_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)&(~(mask))))
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:163:3: note: in expansion of macro 'CLEAR_PERI_REG_MASK'
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_WR_BYTE_ORDER);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp: In static member function 'static void SPIClass::spi_txd(uint8, uint32)':
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:185:38: error: 'SPI_CMD' was not declared in this scope
while(READ_PERI_REG(SPI_CMD(SPI_type))&SPI_USR);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:185:8: note: in expansion of macro 'READ_PERI_REG'
while(READ_PERI_REG(SPI_CMD(SPI_type))&SPI_USR);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:185:41: error: 'SPI_USR' was not declared in this scope
while(READ_PERI_REG(SPI_CMD(SPI_type))&SPI_USR);
^
In file included from C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/ets_sys.h:12:0,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.h:32,
from C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:26:
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:187:37: error: 'SPI_USER' was not declared in this scope
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MOSI);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:52:40: note: in expansion of macro 'WRITE_PERI_REG'
#define SET_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask)))
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:187:2: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MOSI);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:187:40: error: 'SPI_USR_MOSI' was not declared in this scope
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MOSI);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:187:2: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MOSI);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:42: error: 'SPI_USR_MISO' was not declared in this scope
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:2: note: in expansion of macro 'CLEAR_PERI_REG_MASK'
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:71: error: 'SPI_USR_ADDR' was not declared in this scope
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:2: note: in expansion of macro 'CLEAR_PERI_REG_MASK'
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:84: error: 'SPI_USR_DUMMY' was not declared in this scope
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:189:2: note: in expansion of macro 'CLEAR_PERI_REG_MASK'
CLEAR_PERI_REG_MASK(SPI_USER(SPI_type), SPI_USR_MISO|SPI_USR_COMMAND|SPI_USR_ADDR|SPI_USR_DUMMY);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:191:35: error: 'SPI_USER1' was not declared in this scope
WRITE_PERI_REG(SPI_USER1(SPI_type), ((no_bits-1)&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S); //set bits in MOSI BITLEN. Clears all ADDR/MISO/DUMMY BITLENs!
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:191:2: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_USER1(SPI_type), ((no_bits-1)&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S); //set bits in MOSI BITLEN. Clears all ADDR/MISO/DUMMY BITLENs!
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:191:51: error: 'SPI_USR_MOSI_BITLEN' was not declared in this scope
WRITE_PERI_REG(SPI_USER1(SPI_type), ((no_bits-1)&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S); //set bits in MOSI BITLEN. Clears all ADDR/MISO/DUMMY BITLENs!
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:191:73: error: 'SPI_USR_MOSI_BITLEN_S' was not declared in this scope
WRITE_PERI_REG(SPI_USER1(SPI_type), ((no_bits-1)&SPI_USR_MOSI_BITLEN)<<SPI_USR_MOSI_BITLEN_S); //set bits in MOSI BITLEN. Clears all ADDR/MISO/DUMMY BITLENs!
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:194:33: error: 'SPI_W0' was not declared in this scope
WRITE_PERI_REG(SPI_W0(SPI_type), data<<(32-no_bits));
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:194:3: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_W0(SPI_type), data<<(32-no_bits));
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:201:33: error: 'SPI_W0' was not declared in this scope
WRITE_PERI_REG(SPI_W0(SPI_type), ((0xFFFFFFFF<<(no_bits - extra_bits)&data)<<(8-extra_bits) | (0xFFFFFFFF>>(32-(no_bits - extra_bits)))&data));
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:201:3: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_W0(SPI_type), ((0xFFFFFFFF<<(no_bits - extra_bits)&data)<<(8-extra_bits) | (0xFFFFFFFF>>(32-(no_bits - extra_bits)))&data));
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:203:33: error: 'SPI_W0' was not declared in this scope
WRITE_PERI_REG(SPI_W0(SPI_type), data);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:203:3: note: in expansion of macro 'WRITE_PERI_REG'
WRITE_PERI_REG(SPI_W0(SPI_type), data);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:206:36: error: 'SPI_CMD' was not declared in this scope
SET_PERI_REG_MASK(SPI_CMD(SPI_type), SPI_USR);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:45:34: note: in definition of macro 'ETS_UNCACHED_ADDR'
#define ETS_UNCACHED_ADDR(addr) (addr)
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:52:40: note: in expansion of macro 'WRITE_PERI_REG'
#define SET_PERI_REG_MASK(reg, mask) WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask)))
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:206:2: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_CMD(SPI_type), SPI_USR);
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:206:39: error: 'SPI_USR' was not declared in this scope
SET_PERI_REG_MASK(SPI_CMD(SPI_type), SPI_USR);
^
C:\Program Files\ArduinoESP-1.6.1/hardware/tools/esp8266/sdk/include/eagle_soc.h:50:98: note: in definition of macro 'WRITE_PERI_REG'
#define WRITE_PERI_REG(addr, val) (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val)
^
C:\Program Files\ArduinoESP-1.6.1\hardware\esp8266com\esp8266\libraries\SPI\SPI.cpp:206:2: note: in expansion of macro 'SET_PERI_REG_MASK'
SET_PERI_REG_MASK(SPI_CMD(SPI_type), SPI_USR);