-
-
Save shaielc/e0937d68978b03b2544474b641328145 to your computer and use it in GitHub Desktop.
#include<SlaveSPIClass.h> | |
int SlaveSPI::size = 0; | |
SlaveSPI** SlaveSPI::SlaveSPIVector = NULL; | |
void setupIntr(spi_slave_transaction_t * trans) | |
{ | |
for(int i=0 ; i<SlaveSPI::size;i++) | |
{ | |
if(SlaveSPI::SlaveSPIVector[i]->match(trans)) | |
SlaveSPI::SlaveSPIVector[i]->setup_intr(trans); | |
} | |
} | |
void transIntr(spi_slave_transaction_t * trans) | |
{ | |
for(int i=0 ; i<SlaveSPI::size;i++) | |
{ | |
if(SlaveSPI::SlaveSPIVector[i]->match(trans)) | |
SlaveSPI::SlaveSPIVector[i]->trans_intr(trans); | |
} | |
} | |
SlaveSPI::SlaveSPI() | |
{ | |
SlaveSPI** temp = new SlaveSPI * [size+1]; | |
for (int i=0;i<size;i++) | |
{ | |
temp[i]=SlaveSPIVector[i]; | |
} | |
temp[size] = this; | |
size++; | |
delete [] SlaveSPIVector; | |
SlaveSPIVector = temp; | |
buff = ""; | |
transBuffer = ""; | |
} | |
void SlaveSPI::begin(gpio_num_t so,gpio_num_t si,gpio_num_t sclk,gpio_num_t ss,size_t length,void(* ext)()) | |
{ | |
//should set to the minimum transaction length | |
t_size = length; | |
driver = new spi_slave_transaction_t{t_size * 8 , 0 , heap_caps_malloc(max(t_size,32), MALLOC_CAP_DMA), heap_caps_malloc(max(t_size,32), MALLOC_CAP_DMA),NULL}; | |
spi_bus_config_t buscfg={ | |
.mosi_io_num=si, | |
.miso_io_num=so, | |
.sclk_io_num=sclk | |
}; | |
gpio_set_pull_mode(sclk, GPIO_PULLUP_ONLY); | |
gpio_set_pull_mode(ss, GPIO_PULLUP_ONLY); | |
spi_slave_interface_config_t slvcfg={ss,0,1,0,setupIntr,transIntr};//check the IDF for further explenation | |
spi_slave_initialize(HSPI_HOST, &buscfg, &slvcfg,1); //DMA channel 1 | |
spi_slave_queue_trans(HSPI_HOST,driver,portMAX_DELAY);//ready for input (no transmit) | |
exter_intr =ext; | |
} | |
void SlaveSPI::setup_intr(spi_slave_transaction_t *trans) | |
{//called when the trans is set in the queue | |
//didn't find use for it in the end. | |
} | |
void SlaveSPI::trans_intr(spi_slave_transaction_t *trans) | |
{//called when the trans has finished | |
for(int i=0;i<(driver->trans_len/8);i++) | |
{ | |
buff += ((char*)driver->rx_buffer)[i]; | |
((char*) driver->rx_buffer)[i] = (char)0; | |
size++; | |
} | |
setDriver(); | |
exter_intr(); | |
} | |
void SlaveSPI::trans_queue(String& transmission){ | |
//used to queue data to transmit | |
for (int i=0;i<transmission.length();i++) | |
transBuffer += transmission[i]; | |
} | |
inline bool SlaveSPI::match(spi_slave_transaction_t * trans) | |
{ | |
return (this->driver == trans); | |
} | |
void SlaveSPI::setDriver() | |
{ | |
driver->user = NULL; | |
int i=0; | |
for(;i<(driver->trans_len/8)&&i<transBuffer.length();i++) | |
{ | |
((char*) driver->tx_buffer)[i] = transBuffer[i]; | |
} | |
transBuffer = &(transBuffer[i]); | |
driver->length=t_size*8; | |
driver->trans_len = 0; | |
spi_slave_queue_trans(HSPI_HOST,driver,portMAX_DELAY); | |
} | |
char SlaveSPI::read() | |
{ | |
char temp = buff[0]; | |
buff.remove(0,1); | |
size--; | |
return temp; | |
} | |
#ifndef SLAVE_SPI_CLASS | |
#define SLAVE_SPI_CLASS | |
#include "Arduino.h" | |
#include "driver/spi_slave.h" | |
void setupIntr(spi_slave_transaction_t * trans); | |
void transIntr(spi_slave_transaction_t * trans); | |
class SlaveSPI | |
{ | |
static SlaveSPI** SlaveSPIVector; | |
static int size; | |
friend void setupIntr(spi_slave_transaction_t * trans); | |
friend void transIntr(spi_slave_transaction_t * trans); | |
String buff;//used to save incoming data | |
String transBuffer;//used to buffer outgoing data !not tested! | |
spi_slave_transaction_t * driver; | |
void (*exter_intr)();//interrupt at the end of transmission , if u need to do something at the end of each transmission | |
size_t t_size;//length of transaction buffer, (should be set to maximum transition size) | |
public: | |
SlaveSPI(); | |
int size; | |
void setup_intr(spi_slave_transaction_t *trans);//called when the trans is set in the queue | |
void trans_intr(spi_slave_transaction_t *trans);//called when the trans has finished | |
void begin(gpio_num_t so,gpio_num_t si,gpio_num_t sclk,gpio_num_t ss,size_t length=128,void(* ext)() = NULL); | |
void trans_queue(String& transmission);//used to queue data to transmit | |
inline char* operator[](int i){return (&buff[i]);} | |
inline void flush(){buff = "";size=0;} | |
inline bool match(spi_slave_transaction_t * trans); | |
void setDriver(); | |
char read(); | |
inline String* getBuff(){return &buff;} | |
}; | |
#endif |
#include <SlaveSPIClass.h> | |
#include <SPI.h> | |
#define MO 22 | |
#define MI 23 | |
#define MCLK 19 | |
#define MS 18 | |
#define SO 32 | |
#define SI 25 | |
#define SCLK 27 | |
#define SS 34 | |
SlaveSPI slave; | |
SPIClass master(VSPI); | |
void test(); | |
void setup() { | |
Serial.begin(115200); | |
// put your setup code here, to run once: | |
master.begin(MCLK,MI,MO); | |
slave.begin((gpio_num_t)SO,(gpio_num_t)SI,(gpio_num_t)SCLK,(gpio_num_t)SS,8,test);//seems to work with groups of 4 bytes | |
SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)); | |
pinMode(MS,OUTPUT); | |
} | |
String txt = ""; | |
String cmd =""; | |
void loop() { | |
// put your main code here, to run repeatedly: | |
if(slave.getBuff()->length()&&digitalRead(SS)==HIGH) | |
{ | |
while(slave.getBuff()->length()) | |
txt+=slave.read(); | |
Serial.println("slave input:"); | |
Serial.println(txt); | |
} | |
while(Serial.available()) | |
{ | |
cmd +=(char) Serial.read(); | |
} | |
while(txt.length()>0) | |
{ | |
slave.trans_queue(txt); | |
Serial.println("slave output:"); | |
Serial.println(txt); | |
txt =""; | |
} | |
while(cmd.length()>0) | |
{ | |
Serial.println("input:"); | |
Serial.println(cmd); | |
Serial.println("Master input:"); | |
digitalWrite(MS,LOW); | |
for(int i=0;i<cmd.length();i++) | |
{ | |
cmd[i] = master.transfer(cmd[i]); //ERROR : gives the transmitted data <<1 | |
} | |
digitalWrite(MS,HIGH); | |
for(int i=0;i<cmd.length();i++) | |
Serial.print(cmd[i],HEX); | |
cmd =""; | |
} | |
} | |
void test() | |
{ | |
//Serial.println("test"); | |
//Serial.println(slave[0]); | |
} | |
cannot compile (with ESP32 Arduino core v1.0.1) , get the following error:
/Users/markus/Documents/Arduino/libraries/SlaveSPI/SlaveSPIClass.h:22:6: error: 'int SlaveSPI::size' conflicts with a previous declaration
int size;
^
/Users/markus/Documents/Arduino/libraries/SlaveSPI/SlaveSPIClass.h:11:13: note: previous declaration 'int SlaveSPI::size'
static int size;
^
I got an error in functions max() and min() parameters, I "fixed it" casting max_buffer_size as int, but when I executed and wrote some data in serial monitor I got another an error, I think it is something about invalid memory...
I am new using arduino ide and esp32 and need to write a code to read from a SPI master some temperature data (16 bits), nothing more than that, I don't need to write to master neither gpios. How could I change this example to do that?
Memory error (?):
13:51:41.956 -> master output (cmd): 31 A , input (return): 0 0 CORRUPT HEAP: Bad head at 0x3ffba5d4. Expected 0xabba1234 got 0x3ffba6f0
13:51:42.049 -> assertion "head != NULL" failed: file "/Users/ficeto/Desktop/ESP32/ESP32/esp-idf-public/components/heap/multi_heap_poisoning.c", line 214, function: multi_heap_free
13:51:42.049 -> abort() was called at PC 0x400d71eb on core 1
13:51:42.049 ->
13:51:42.049 -> ELF file SHA256: 0000000000000000000000000000000000000000000000000000000000000000
13:51:42.049 ->
13:51:42.049 -> Backtrace: 0x40085fd0:0x3ffb1df0 0x40086245:0x3ffb1e10 0x400d71eb:0x3ffb1e30 0x4008a999:0x3ffb1e60 0x400846d6:0x3ffb1e80 0x40084b1d:0x3ffb1ea0 0x4000bec7:0x3ffb1ec0 0x400e9745:0x3ffb1ee0 0x400e9b15:0x3ffb1f00 0x400d11d3:0x3ffb1f20 0x400d0ee5:0x3ffb1f40 0x400d117e:0x3ffb1f70 0x400d2a29:0x3ffb1fb0 0x4008a1a1:0x3ffb1fd0
13:51:42.049 ->
13:51:42.049 -> Rebooting...
13:51:42.049 -> ets Jun 8 2016 00:22:57
13:51:42.049 ->
13:51:42.049 -> rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
13:51:42.049 -> configsip: 0, SPIWP:0xee
13:51:42.049 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
13:51:42.049 -> mode:DIO, clock div:1
13:51:42.049 -> load:0x3fff0018,len:4
13:51:42.049 -> load:0x3fff001c,len:1100
13:51:42.049 -> load:0x40078000,len:10312
13:51:42.049 -> load:0x40080400,len:6460
13:51:42.049 -> entry 0x400806a4
Max and Min error:
Arduino: 1.8.8 (Windows 10), Board: "ESP32 Dev Module, Disabled, Default, 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"
sketch\SlaveSPI.cpp: In member function 'esp_err_t SlaveSPI::begin(gpio_num_t, gpio_num_t, gpio_num_t, gpio_num_t, size_t, int (*)())':
SlaveSPI.cpp:52:74: error: no matching function for call to 'max(size_t&, int)'
tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3463:5: note: candidate: template<class _Tp, class _Compare> _Tp std::max(std::initializer_list<_Tp>, _Compare)
max(initializer_list<_Tp> __l, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3463:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:52:74: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3457:5: note: candidate: template<class _Tp> _Tp std::max(std::initializer_list<_Tp>)
max(initializer_list<_Tp> __l)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3457:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:52:74: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:265:5: note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)
max(const _Tp& __a, const _Tp& __b, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:265:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:52:74: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:219:5: note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp&)
max(const _Tp& __a, const _Tp& __b)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:219:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:52:74: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
SlaveSPI.cpp:53:74: error: no matching function for call to 'max(size_t&, int)'
rx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3463:5: note: candidate: template<class _Tp, class _Compare> _Tp std::max(std::initializer_list<_Tp>, _Compare)
max(initializer_list<_Tp> __l, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3463:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:53:74: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
rx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3457:5: note: candidate: template<class _Tp> _Tp std::max(std::initializer_list<_Tp>)
max(initializer_list<_Tp> __l)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3457:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:53:74: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
rx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:265:5: note: candidate: template<class _Tp, class _Compare> const _Tp& std::max(const _Tp&, const _Tp&, _Compare)
max(const _Tp& __a, const _Tp& __b, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:265:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:53:74: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
rx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:219:5: note: candidate: template<class _Tp> const _Tp& std::max(const _Tp&, const _Tp&)
max(const _Tp& __a, const _Tp& __b)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:219:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:53:74: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
rx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
^
sketch\SlaveSPI.cpp: In member function 'esp_err_t SlaveSPI::initTransmissionQueue()':
SlaveSPI.cpp:167:59: error: no matching function for call to 'min(size_t&, int)'
int size = min(max_buffer_size, output_stream.length()); // NOT over the buffer's size.
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3451:5: note: candidate: template<class _Tp, class _Compare> _Tp std::min(std::initializer_list<_Tp>, _Compare)
min(initializer_list<_Tp> __l, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3451:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:167:59: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
int size = min(max_buffer_size, output_stream.length()); // NOT over the buffer's size.
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:62:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3445:5: note: candidate: template<class _Tp> _Tp std::min(std::initializer_list<_Tp>)
min(initializer_list<_Tp> __l)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algo.h:3445:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:167:59: note: mismatched types 'std::initializer_list<_Tp>' and 'unsigned int'
int size = min(max_buffer_size, output_stream.length()); // NOT over the buffer's size.
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:243:5: note: candidate: template<class _Tp, class _Compare> const _Tp& std::min(const _Tp&, const _Tp&, _Compare)
min(const _Tp& __a, const _Tp& __b, _Compare __comp)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:243:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:167:59: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
int size = min(max_buffer_size, output_stream.length()); // NOT over the buffer's size.
^
In file included from c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\algorithm:61:0,
from C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/Arduino.h:148,
from sketch\SlaveSPI.h:4,
from sketch\SlaveSPI.cpp:9:
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:195:5: note: candidate: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&)
min(const _Tp& __a, const _Tp& __b)
^
c:\users\matheus.nogueira\appdata\local\arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc\1.22.0-80-g6c4433a-5.2.0\xtensa-esp32-elf\include\c++\5.2.0\bits\stl_algobase.h:195:5: note: template argument deduction/substitution failed:
sketch\SlaveSPI.cpp:167:59: note: deduced conflicting types for parameter 'const _Tp' ('unsigned int' and 'int')
int size = min(max_buffer_size, output_stream.length()); // NOT over the buffer's size.
^
exit status 1
no matching function for call to 'max(size_t&, int)'
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Hey there,
I could fix the compile errors and warnings, which turned out to be just 2 tiny problems.
At the moment I do not know if it makes the program work.
Fix #1
The same name is used for a static member and an instance member.
In SlaveSPIClass.h @ line 2
static int size;
becomes
static int size_;
In SlaveSPIClass.cpp @ lines 2, 6, 14: replace occurrences of SlaveSPI::size
with SlaveSPI::size_
.
Fix #2
The compiler messes up the implicit conversion from integer literal to t_size
.
SlaveSPIClass.cpp @ line 41
driver = new spi_slave_transaction_t{t_size * 8 , 0 , heap_caps_malloc(max(t_size,32), MALLOC_CAP_DMA), heap_caps_malloc(max(t_size,32), MALLOC_CAP_DMA),NULL};
becomes
driver = new spi_slave_transaction_t{(size_t)(t_size * 8) , 0 , heap_caps_malloc(max(t_size,(size_t)32), MALLOC_CAP_DMA), heap_caps_malloc(max(t_size,(size_t)32), MALLOC_CAP_DMA),NULL};
I feel like something else is wrong with size
and size_
.
Fix #3
It does not make sense that an instance value is used in the constructor SlaveSPI::SlaveSPI()
because size
is only used to affect the static member SlaveSPIVector
.
SlaveSPIClass.cpp @ lines 20 to 33: replace every size
with SlaveSPI::size_
.
Possible fix
The instance's size
is not explicitly initialized. It looks like a buffer count. It should probably be initialized to 0 in the member initialization part of the constructor. The default value is to be checked.
EDIT #1
Yes! My fixes #1 to #3 made it work somehow! I was receiving nothing at all without the fix #3. Now I'm receiving a corrupted message but at least I have a correct piece of it.
I am using platform IO, and after implementing all the fixes above, I cannot compile:
My error is inline 29 of .cpp file: tx_buffer = (uint8_t *)heap_caps_malloc(max(max_buffer_size, 32), SPI_MALLOC_CAP);
the error is: no instance of max(size_t,int)
any help or suggestions?
Explanation about the string :
The string is just there to manage large transactions the idea was to try and mimic the behavior of the other arduino drivers (UART & SPI master) which get the data inside a DMA buffer from the hardware and than saves it in a software buffer.
The reason why you would do that is this creates an abstraction for the user the user doesn't handle the "low level" allocations he just uses the data that got in.
Now I will try and check how they did it with the master and try to mimic the behavior.