using spi1 and spi2 simultaneously

Post here first, or if you can't find a relevant section!
ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: using spi1 and spi2 simultaneously

Post by ag123 »

mysketch.h

Code: Select all

#include <SPI.h>
#ifndef _MYSKETCH_H
#define _MYSKETCH_H
extern SPIClass SPI_2;
#endif
then in your .ino sketch

Code: Select all

#include "mysketch.h"

//            MOSI  MISO  SCLK
SPIClass SPI_2(PB15, PB14, PB13);
and in your copies of mcp_can.h and mcp_can.cpp

Code: Select all

#include "mysketch.h"
and update the references for SPI to SPI_2 in mcp_cah.h and mcp_can.cpp
arun
Posts: 7
Joined: Wed Sep 21, 2022 11:25 am

Re: using spi1 and spi2 simultaneously

Post by arun »

followed your instructions but still :oops:
no matching function for call to 'SPIClass::SPIClass(<anonymous enum>, <anonymous enum>, <anonymous enum>)'
SPIClass SPI_2(PB15, PB14, PB13);

Code: Select all

Arduino: 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Board: "Generic STM32F103C series, STM32F103C8 (20k RAM. 64k Flash), STLink, 72Mhz (Normal), Smallest (default)"





















C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\hardware -hardware C:\Users\Arunsaravana\Documents\ArduinoData\packages -tools C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\tools-builder -tools C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\hardware\tools\avr -tools C:\Users\Arunsaravana\Documents\ArduinoData\packages -built-in-libraries C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\libraries -libraries C:\Users\Arunsaravana\Documents\Arduino\libraries -fqbn=stm32duino:STM32F1:genericSTM32F103C:device_variant=STM32F103C8,upload_method=STLinkMethod,cpu_speed=speed_72mhz,opt=osstd -ide-version=10819 -build-path C:\Users\ARUNSA~1\AppData\Local\Temp\arduino_build_706871 -warnings=none -build-cache C:\Users\ARUNSA~1\AppData\Local\Temp\arduino_cache_51985 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arm-none-eabi-gcc.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1 -prefs=runtime.tools.arm-none-eabi-gcc-4.8.3-2014q1.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1 -prefs=runtime.tools.stm32tools.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\tools\stm32tools\2021.5.31 -prefs=runtime.tools.stm32tools-2021.5.31.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\tools\stm32tools\2021.5.31 -verbose C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino

C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\arduino-builder -compile -logger=machine -hardware C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\hardware -hardware C:\Users\Arunsaravana\Documents\ArduinoData\packages -tools C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\tools-builder -tools C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\hardware\tools\avr -tools C:\Users\Arunsaravana\Documents\ArduinoData\packages -built-in-libraries C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\libraries -libraries C:\Users\Arunsaravana\Documents\Arduino\libraries -fqbn=stm32duino:STM32F1:genericSTM32F103C:device_variant=STM32F103C8,upload_method=STLinkMethod,cpu_speed=speed_72mhz,opt=osstd -ide-version=10819 -build-path C:\Users\ARUNSA~1\AppData\Local\Temp\arduino_build_706871 -warnings=none -build-cache C:\Users\ARUNSA~1\AppData\Local\Temp\arduino_cache_51985 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arm-none-eabi-gcc.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1 -prefs=runtime.tools.arm-none-eabi-gcc-4.8.3-2014q1.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\arduino\tools\arm-none-eabi-gcc\4.8.3-2014q1 -prefs=runtime.tools.stm32tools.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\tools\stm32tools\2021.5.31 -prefs=runtime.tools.stm32tools-2021.5.31.path=C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\tools\stm32tools\2021.5.31 -verbose C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino

Using board 'genericSTM32F103C' from platform in folder: C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31

Using core 'maple' from platform in folder: C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31

Detecting libraries used...

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp" -o nul

Alternatives for SPI.h: [SPI@1.0]

ResolveLibrary(SPI.h)

  -> candidates: [SPI@1.0]

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp" -o nul

Alternatives for mcp_can.h: [MCP_CAN_lib-master@1.5.0]

ResolveLibrary(mcp_can.h)

  -> candidates: [MCP_CAN_lib-master@1.5.0]

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp" -o nul

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\mcp_can.cpp" -o nul

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src\\SPI.cpp" -o nul

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master\\mcp_can.cpp" -o nul

Generating function prototypes...

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -w -x c++ -E -CC -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp" -o "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\preproc\\ctags_target_for_gcc_minus_e.cpp"

"C:\\Program Files\\WindowsApps\\ArduinoLLC.ArduinoIDE_1.8.57.0_x86__mdqgnx93n4wtt\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\preproc\\ctags_target_for_gcc_minus_e.cpp"

Compiling sketch...

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp" -o "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\cans.ino.cpp.o"

"C:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\arduino\\tools\\arm-none-eabi-gcc\\4.8.3-2014q1/bin/arm-none-eabi-g++" -c -g -Os -w -DDEBUG_LEVEL=DEBUG_NONE -std=gnu++11 -MMD -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -fno-use-cxa-atexit -DBOARD_generic_stm32f103c -DVECT_TAB_ADDR=0x8000000 -DERROR_LED_PORT=GPIOC -DERROR_LED_PIN=13 -mcpu=cortex-m3 -DF_CPU=72000000L -DARDUINO=10819 -DARDUINO_GENERIC_STM32F103C -DARDUINO_ARCH_STM32F1 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DSERIAL_USB -DGENERIC_BOOTLOADER -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ -DMCU_STM32F103C8 -mthumb -march=armv7-m -D__STM32F1__ "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/stm32f1/include" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/stm32f1" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\system/libmaple/usb/usb_lib" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\cores\\maple" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\variants\\generic_stm32f103c" "-IC:\\Users\\Arunsaravana\\Documents\\ArduinoData\\packages\\stm32duino\\hardware\\STM32F1\\2021.5.31\\libraries\\SPI\\src" "-IC:\\Users\\Arunsaravana\\Documents\\Arduino\\libraries\\MCP_CAN_lib-master" "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\mcp_can.cpp" -o "C:\\Users\\ARUNSA~1\\AppData\\Local\\Temp\\arduino_build_706871\\sketch\\mcp_can.cpp.o"

cans:14:32: error: no matching function for call to 'SPIClass::SPIClass(<anonymous enum>, <anonymous enum>, <anonymous enum>)'

 SPIClass SPI_2(PB15, PB14, PB13);

                                ^

C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino:14:32: note: candidates are:

In file included from C:\Users\Arunsaravana\Documents\Arduino\cans\arun.h:1:0,

                 from C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino:10:

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:176:5: note: SPIClass::SPIClass(uint32)

     SPIClass(uint32 spiPortNumber);

     ^

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:176:5: note:   candidate expects 1 argument, 3 provided

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:170:7: note: constexpr SPIClass::SPIClass(const SPIClass&)

 class SPIClass {

       ^

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:170:7: note:   candidate expects 1 argument, 3 provided

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:170:7: note: constexpr SPIClass::SPIClass(SPIClass&&)

C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI\src/SPI.h:170:7: note:   candidate expects 1 argument, 3 provided

In file included from C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master/mcp_can.h:24:0,

                 from C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino:16:

C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master/cspi2.h:4:23: error: redefinition of 'SPIClass SPI_2'

 extern SPIClass SPI_2(PB15, PB14, PB13);

                       ^

cans:14:10: error: 'SPIClass SPI_2' previously declared here

 SPIClass SPI_2(PB15, PB14, PB13);

          ^

In file included from C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master/mcp_can_dfs.h:26:0,

                 from C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master/mcp_can.h:28,

                 from C:\Users\Arunsaravana\Documents\Arduino\cans\cans.ino:16:

C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master/cspi2.h:4:23: error: redefinition of 'SPIClass SPI_2'

 extern SPIClass SPI_2(PB15, PB14, PB13);

                       ^

cans:14:10: error: 'SPIClass SPI_2' previously declared here

 SPIClass SPI_2(PB15, PB14, PB13);

          ^

Using library SPI at version 1.0 in folder: C:\Users\Arunsaravana\Documents\ArduinoData\packages\stm32duino\hardware\STM32F1\2021.5.31\libraries\SPI 

Using library MCP_CAN_lib-master at version 1.5.0 in folder: C:\Users\Arunsaravana\Documents\Arduino\libraries\MCP_CAN_lib-master 

exit status 1

no matching function for call to 'SPIClass::SPIClass(<anonymous enum>, <anonymous enum>, <anonymous enum>)'

ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: using spi1 and spi2 simultaneously

Post by ag123 »

That instructions is intended for the "official" core
https://github.com/stm32duino/Arduino_Core_STM32
https://github.com/stm32duino/wiki/wiki
^ this is how/where to install it

you are using libmaple (Roger's core)
the example is here:
https://github.com/rogerclarkmelbourne/ ... _ports.ino

Code: Select all

#include "mysketch.h"

SPIClass SPI_2(2); 
^ in your sketch, SPI_2 should be defined this way instead.

And do not include the library from the Arduino menu, instead copy out the library files (mcp_can.h and mcp_can.cpp) into your sketch folder as you need to modify them.
arun
Posts: 7
Joined: Wed Sep 21, 2022 11:25 am

Re: using spi1 and spi2 simultaneously

Post by arun »

Thank you ag123. :D
at last, it got compiled without any errors
ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: using spi1 and spi2 simultaneously

Post by ag123 »

run the "official" core as well
https://github.com/stm32duino/Arduino_Core_STM32
https://github.com/stm32duino/wiki/wiki
that is larger, is based on HAL and has been made to run on more boards and MCUs than do libmaple.
while it is 'bulkier', the 'support' for different STM32 socs is a non-trivial 'feature' of the 'official' core.
Doing things like switching to a stm32f4xx mcu can make a lot of difference vs using stm32f103c8, both in terms of speeds, more sram and flash, FPU etc.
stm32f4xx is (much) faster than stm32f103xx for the same Mhz, due to "ART accelerator" (on chip cache), FPU and has better clocks setup etc.

'official' and libmaple core can co-exist, and the 'official' core bundles a compiler which can be used for libmaple.
After i used stm32f401xx/f411xx, I 'never looked back', it is simply more versatile for all sorts of *duino developments/projects.
Anand.ratna
Posts: 2
Joined: Sat Jul 29, 2023 9:28 am

Re: using spi1 and spi2 simultaneously

Post by Anand.ratna »

I want to use SPI1 for Lora and SPI2 for NRF. But I am not able to figure out how to achieve this. I tried Chat GPT also but that was not helpful.
ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: using spi1 and spi2 simultaneously

Post by ag123 »

for the 'official' core
there are some docs here
https://github.com/stm32duino/Arduino_C ... ki/API#spi

Code: Select all

#include <SPI.h>
//            MOSI  MISO  SCLK
SPIClass SPI_2(PB15, PB14, PB13);

void setup() {
  SPI_2.begin(PB12); //Enables the SPI_2 instance with default settings and attaches PB12 as the CS pin  
  SPI_2.transfer(PB12, 0xA4); //Transfers data to the  device. The SPI_2 instance is configured with the right settings  
  //SPI_2.end() //SPI_2 instance is disabled
}
maybe some examples here
https://github.com/stm32duino/STM32Exam ... I_loop.ino

the thing is some libraries coded with a single SPI class, and one of those ways is to copy that library and rename all those references for SPI to SPI2 in that copied library's source code
Anand.ratna
Posts: 2
Joined: Sat Jul 29, 2023 9:28 am

Re: using spi1 and spi2 simultaneously

Post by Anand.ratna »

Replaced SPI with SPI2 in the copy of Lora Library and getting below error

/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp: In member function 'int LoRaClass::begin(long int)':
/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp:82:8: error: request for member 'begin' in 'SPI2', which is of pointer type 'spi_dev*' (maybe you meant to use '->' ?)
SPI2.begin();
^
/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp: In member function 'void LoRaClass::end()':
/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp:121:8: error: request for member 'end' in 'SPI2', which is of pointer type 'spi_dev*' (maybe you meant to use '->' ?)
SPI2.end();
^
/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp: In member function 'uint8_t LoRaClass::singleTransfer(uint8_t, uint8_t)':
/private/var/folders/r7/3w_jcm0x57b7vn2yg1xm8b_x0wgj_5/T/.arduinoIDE-unsaved2023630-14465-1yfpjuh.lqx1/LoRaSender/LoRaSTM32C.cpp:511:8: error: request for member 'beginTransaction' in 'SPI2', which is of pointer type 'spi_dev*' (maybe you meant to use '->' ?)
SPI2.beginTransaction(_spiSettings);
^

Code: Select all

// Copyright (c) Sandeep Mistry. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

#include "LoRaSTM32C.h"

// registers
#define REG_FIFO                 0x00
#define REG_OP_MODE              0x01
#define REG_FRF_MSB              0x06
#define REG_FRF_MID              0x07
#define REG_FRF_LSB              0x08
#define REG_PA_CONFIG            0x09
#define REG_LNA                  0x0c
#define REG_FIFO_ADDR_PTR        0x0d
#define REG_FIFO_TX_BASE_ADDR    0x0e
#define REG_FIFO_RX_BASE_ADDR    0x0f
#define REG_FIFO_RX_CURRENT_ADDR 0x10
#define REG_IRQ_FLAGS            0x12
#define REG_RX_NB_BYTES          0x13
#define REG_PKT_SNR_VALUE        0x19
#define REG_PKT_RSSI_VALUE       0x1a
#define REG_MODEM_CONFIG_1       0x1d
#define REG_MODEM_CONFIG_2       0x1e
#define REG_PREAMBLE_MSB         0x20
#define REG_PREAMBLE_LSB         0x21
#define REG_PAYLOAD_LENGTH       0x22
#define REG_MODEM_CONFIG_3       0x26
#define REG_RSSI_WIDEBAND        0x2c
#define REG_DETECTION_OPTIMIZE   0x31
#define REG_DETECTION_THRESHOLD  0x37
#define REG_SYNC_WORD            0x39
#define REG_DIO_MAPPING_1        0x40
#define REG_VERSION              0x42

// modes
#define MODE_LONG_RANGE_MODE     0x80
#define MODE_SLEEP               0x00
#define MODE_STDBY               0x01
#define MODE_TX                  0x03
#define MODE_RX_CONTINUOUS       0x05
#define MODE_RX_SINGLE           0x06

// PA config
#define PA_BOOST                 0x80

// IRQ masks
#define IRQ_TX_DONE_MASK           0x08
#define IRQ_PAYLOAD_CRC_ERROR_MASK 0x20
#define IRQ_RX_DONE_MASK           0x40

#define MAX_PKT_LENGTH           255
LoRaClass::LoRaClass() :
  _spiSettings(8E6, MSBFIRST, SPI_MODE0),
  _ss(LORA_DEFAULT_SS_PIN), _reset(LORA_DEFAULT_RESET_PIN), _dio0(LORA_DEFAULT_DIO0_PIN),
  _frequency(0),
  _packetIndex(0),
  _implicitHeaderMode(0),
  _onReceive(NULL)
{
  // overide Stream timeout value
  setTimeout(0);
}

int LoRaClass::begin(long frequency)
{
  // setup pins
  pinMode(_ss, OUTPUT);
  // set SS high
  digitalWrite(_ss, HIGH);

  if (_reset != -1) {
    pinMode(_reset, OUTPUT);

    // perform reset
    digitalWrite(_reset, LOW);
    delay(10);
    digitalWrite(_reset, HIGH);
    delay(10);
  }

  // start SPI
  SPI2.begin();

  // check version
  uint8_t version = readRegister(REG_VERSION);
  if (version != 0x12) {
    return 0;
  }

  // put in sleep mode
  sleep();

  // set frequency
  setFrequency(frequency);

  // set base addresses
  writeRegister(REG_FIFO_TX_BASE_ADDR, 0);
  writeRegister(REG_FIFO_RX_BASE_ADDR, 0);

  // set LNA boost
  writeRegister(REG_LNA, readRegister(REG_LNA) | 0x03);

  // set auto AGC
  writeRegister(REG_MODEM_CONFIG_3, 0x04);

  // set output power to 17 dBm
  setTxPower(20);

  // put in standby mode
  idle();

  return 1;
}

void LoRaClass::end()
{
  // put in sleep mode
  sleep();

  // stop SPI
  SPI2.end();
}

int LoRaClass::beginPacket(int implicitHeader)
{
  // put in standby mode
  idle();

  if (implicitHeader) {
    implicitHeaderMode();
  } else {
    explicitHeaderMode();
  }

  // reset FIFO address and paload length
  writeRegister(REG_FIFO_ADDR_PTR, 0);
  writeRegister(REG_PAYLOAD_LENGTH, 0);

  return 1;
}

int LoRaClass::endPacket()
{
  // put in TX mode
  writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX);

  // wait for TX done
  while ((readRegister(REG_IRQ_FLAGS) & IRQ_TX_DONE_MASK) == 0) {
    yield();
  }

  // clear IRQ's
  writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK);

  return 1;
}

int LoRaClass::parsePacket(int size)
{
  int packetLength = 0;
  int irqFlags = readRegister(REG_IRQ_FLAGS);

  if (size > 0) {
    implicitHeaderMode();

    writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
  } else {
    explicitHeaderMode();
  }

  // clear IRQ's
  writeRegister(REG_IRQ_FLAGS, irqFlags);

  if ((irqFlags & IRQ_RX_DONE_MASK) && (irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
    // received a packet
    _packetIndex = 0;

    // read packet length
    if (_implicitHeaderMode) {
      packetLength = readRegister(REG_PAYLOAD_LENGTH);
    } else {
      packetLength = readRegister(REG_RX_NB_BYTES);
    }

    // set FIFO address to current RX address
    writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));

    // put in standby mode
    idle();
  } else if (readRegister(REG_OP_MODE) != (MODE_LONG_RANGE_MODE | MODE_RX_SINGLE)) {
    // not currently in RX mode

    // reset FIFO address
    writeRegister(REG_FIFO_ADDR_PTR, 0);

    // put in single RX mode
    writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_SINGLE);
  }

  return packetLength;
}

int LoRaClass::packetRssi()
{
  return (readRegister(REG_PKT_RSSI_VALUE) - (_frequency < 868E6 ? 164 : 157));
}

float LoRaClass::packetSnr()
{
  return ((int8_t)readRegister(REG_PKT_SNR_VALUE)) * 0.25;
}

size_t LoRaClass::write(uint8_t byte)
{
  return write(&byte, sizeof(byte));
}

size_t LoRaClass::write(const uint8_t *buffer, size_t size)
{
  int currentLength = readRegister(REG_PAYLOAD_LENGTH);

  // check size
  if ((currentLength + size) > MAX_PKT_LENGTH) {
    size = MAX_PKT_LENGTH - currentLength;
  }

  // write data
  for (size_t i = 0; i < size; i++) {
    writeRegister(REG_FIFO, buffer[i]);
  }

  // update length
  writeRegister(REG_PAYLOAD_LENGTH, currentLength + size);

  return size;
}

int LoRaClass::available()
{
  return (readRegister(REG_RX_NB_BYTES) - _packetIndex);
}

int LoRaClass::read()
{
  if (!available()) {
    return -1;
  }

  _packetIndex++;

  return readRegister(REG_FIFO);
}

int LoRaClass::peek()
{
  if (!available()) {
    return -1;
  }

  // store current FIFO address
  int currentAddress = readRegister(REG_FIFO_ADDR_PTR);

  // read
  uint8_t b = readRegister(REG_FIFO);

  // restore FIFO address
  writeRegister(REG_FIFO_ADDR_PTR, currentAddress);

  return b;
}

void LoRaClass::flush()
{
}

void LoRaClass::onReceive(void(*callback)(int))
{
  _onReceive = callback;

  if (callback) {
    writeRegister(REG_DIO_MAPPING_1, 0x00);

    attachInterrupt(_dio0, LoRaClass::onDio0Rise, RISING);
  } else {
    detachInterrupt(_dio0);
  }
}

void LoRaClass::receive(int size)
{
  if (size > 0) {
    implicitHeaderMode();

    writeRegister(REG_PAYLOAD_LENGTH, size & 0xff);
  } else {
    explicitHeaderMode();
  }

  writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS);
}

void LoRaClass::idle()
{
  writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY);
}

void LoRaClass::sleep()
{
  writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP);
}

void LoRaClass::setTxPower(int level, int outputPin)
{
  if (PA_OUTPUT_RFO_PIN == outputPin) {
    // RFO
    if (level < 0) {
      level = 0;
    } else if (level > 14) {
      level = 14;
    }

    writeRegister(REG_PA_CONFIG, 0x70 | level);
  } else {
    // PA BOOST
    if (level < 2) {
      level = 2;
    } else if (level > 17) {
      level = 17;
    }

    writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2));
  }
}

void LoRaClass::setFrequency(long frequency)
{
  _frequency = frequency;

  uint64_t frf = ((uint64_t)frequency << 19) / 32000000;

  writeRegister(REG_FRF_MSB, (uint8_t)(frf >> 16));
  writeRegister(REG_FRF_MID, (uint8_t)(frf >> 8));
  writeRegister(REG_FRF_LSB, (uint8_t)(frf >> 0));
}

void LoRaClass::setSpreadingFactor(int sf)
{
  if (sf < 6) {
    sf = 6;
  } else if (sf > 12) {
    sf = 12;
  }

  if (sf == 6) {
    writeRegister(REG_DETECTION_OPTIMIZE, 0xc5);
    writeRegister(REG_DETECTION_THRESHOLD, 0x0c);
  } else {
    writeRegister(REG_DETECTION_OPTIMIZE, 0xc3);
    writeRegister(REG_DETECTION_THRESHOLD, 0x0a);
  }

  writeRegister(REG_MODEM_CONFIG_2, (readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0));
}

void LoRaClass::setSignalBandwidth(long sbw)
{
  int bw;

  if (sbw <= 7.8E3) {
    bw = 0;
  } else if (sbw <= 10.4E3) {
    bw = 1;
  } else if (sbw <= 15.6E3) {
    bw = 2;
  } else if (sbw <= 20.8E3) {
    bw = 3;
  } else if (sbw <= 31.25E3) {
    bw = 4;
  } else if (sbw <= 41.7E3) {
    bw = 5;
  } else if (sbw <= 62.5E3) {
    bw = 6;
  } else if (sbw <= 125E3) {
    bw = 7;
  } else if (sbw <= 250E3) {
    bw = 8;
  } else /*if (sbw <= 250E3)*/ {
    bw = 9;
  }

  writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0x0f) | (bw << 4));
}

void LoRaClass::setCodingRate4(int denominator)
{
  if (denominator < 5) {
    denominator = 5;
  } else if (denominator > 8) {
    denominator = 8;
  }

  int cr = denominator - 4;

  writeRegister(REG_MODEM_CONFIG_1, (readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1));
}

void LoRaClass::setPreambleLength(long length)
{
  writeRegister(REG_PREAMBLE_MSB, (uint8_t)(length >> 8));
  writeRegister(REG_PREAMBLE_LSB, (uint8_t)(length >> 0));
}

void LoRaClass::setSyncWord(int sw)
{
  writeRegister(REG_SYNC_WORD, sw);
}

void LoRaClass::enableCrc()
{
  writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) | 0x04);
}

void LoRaClass::disableCrc()
{
  writeRegister(REG_MODEM_CONFIG_2, readRegister(REG_MODEM_CONFIG_2) & 0xfb);
}

byte LoRaClass::random()
{
  return readRegister(REG_RSSI_WIDEBAND);
}

void LoRaClass::setPins(int ss, int reset, int dio0)
{
  _ss = ss;
  _reset = reset;
  _dio0 = dio0;
}

void LoRaClass::setSPIFrequency(uint32_t frequency)
{
  _spiSettings = SPISettings(frequency, MSBFIRST, SPI_MODE0);
}

void LoRaClass::dumpRegisters(Stream& out)
{
  for (int i = 0; i < 128; i++) {
    out.print("0x");
    out.print(i, HEX);
    out.print(": 0x");
    out.println(readRegister(i), HEX);
  }
}

void LoRaClass::explicitHeaderMode()
{
  _implicitHeaderMode = 0;

  writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) & 0xfe);
}

void LoRaClass::implicitHeaderMode()
{
  _implicitHeaderMode = 1;

  writeRegister(REG_MODEM_CONFIG_1, readRegister(REG_MODEM_CONFIG_1) | 0x01);
}

void LoRaClass::handleDio0Rise()
{
  int irqFlags = readRegister(REG_IRQ_FLAGS);

  // clear IRQ's
  writeRegister(REG_IRQ_FLAGS, irqFlags);

  if ((irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0) {
    // received a packet
    _packetIndex = 0;

    // read packet length
    int packetLength = _implicitHeaderMode ? readRegister(REG_PAYLOAD_LENGTH) : readRegister(REG_RX_NB_BYTES);

    // set FIFO address to current RX address
    writeRegister(REG_FIFO_ADDR_PTR, readRegister(REG_FIFO_RX_CURRENT_ADDR));

    if (_onReceive) {
      _onReceive(packetLength);
    }

    // reset FIFO address
    writeRegister(REG_FIFO_ADDR_PTR, 0);
  }
}

uint8_t LoRaClass::readRegister(uint8_t address)
{
  return singleTransfer(address & 0x7f, 0x00);
}

void LoRaClass::writeRegister(uint8_t address, uint8_t value)
{
  singleTransfer(address | 0x80, value);
}

uint8_t LoRaClass::singleTransfer(uint8_t address, uint8_t value)
{
  uint8_t response;

  digitalWrite(_ss, LOW);

  SPI2.beginTransaction(_spiSettings);
  SPI2.transfer(address);
  response = SPI2.transfer(value);
  SPI2.endTransaction();

  digitalWrite(_ss, HIGH);

  return response;
}

void LoRaClass::onDio0Rise()
{
  LoRa.handleDio0Rise();
}

LoRaClass LoRa;

Post Reply

Return to “General discussion”