diff --git a/CMakeLists.txt b/CMakeLists.txt index 1cb8b7df5a53d3ae8288e4c4c926e2d89e134a19..2cdba5fe17beac41331e917fb33499c85b1a12b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,13 +57,25 @@ sbs_target(runcam-settings stm32f407vg_stm32f4discovery) add_executable(sdcard-benchmark src/entrypoints/sdcard-benchmark.cpp) sbs_target(sdcard-benchmark stm32f429zi_skyward_death_stack_x) -add_executable(sx1278fsk-serial src/entrypoints/sx1278-serial.cpp) -target_compile_definitions(sx1278fsk-serial PRIVATE SX1278_IS_FSK) -sbs_target(sx1278fsk-serial stm32f429zi_skyward_groundstation_v2) +add_executable(sx1278fsk-ra01-serial src/entrypoints/sx1278-serial.cpp) +target_compile_definitions(sx1278fsk-ra01-serial PRIVATE SX1278_IS_FSK) +sbs_target(sx1278fsk-ra01-serial stm32f429zi_skyward_groundstation_v2) -add_executable(sx1278lora-serial src/entrypoints/sx1278-serial.cpp) -target_compile_definitions(sx1278lora-serial PRIVATE SX1278_IS_LORA) -sbs_target(sx1278lora-serial stm32f429zi_skyward_groundstation_v2) +add_executable(sx1278lora-ra01-serial src/entrypoints/sx1278-serial.cpp) +target_compile_definitions(sx1278lora-ra01-serial PRIVATE SX1278_IS_LORA) +sbs_target(sx1278lora-ra01-serial stm32f429zi_skyward_groundstation_v2) + +add_executable(sx1278fsk-skyward433-serial src/entrypoints/sx1278-serial.cpp) +target_compile_definitions(sx1278fsk-skyward433-serial PRIVATE SX1278_IS_FSK SX1278_IS_SKYWARD433) +sbs_target(sx1278fsk-skyward433-serial stm32f429zi_skyward_groundstation_v2) + +add_executable(sx1278lora-skyward433-serial src/entrypoints/sx1278-serial.cpp) +target_compile_definitions(sx1278lora-skyward433-serial PRIVATE SX1278_IS_LORA SX1278_IS_SKYWARD433) +sbs_target(sx1278lora-skyward433-serial stm32f429zi_skyward_groundstation_v2) + +add_executable(sx1278fsk-ebyterig-serial src/entrypoints/sx1278-serial.cpp) +target_compile_definitions(sx1278fsk-ebyterig-serial PRIVATE SX1278_IS_FSK) +sbs_target(sx1278fsk-ebyterig-serial stm32f429zi_skyward_rig) #-----------------------------------------------------------------------------# # Tests # @@ -288,14 +300,14 @@ add_executable(test-sx1278fsk-rx src/tests/radio/sx1278/test-sx1278-bench-serial target_compile_definitions(test-sx1278fsk-rx PRIVATE DISABLE_TX) sbs_target(test-sx1278fsk-rx stm32f429zi_skyward_groundstation_v2) -add_executable(test-sx1278fsk-gui-rx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp) -target_compile_definitions(test-sx1278fsk-gui-rx PRIVATE DISABLE_TX) -sbs_target(test-sx1278fsk-gui-rx stm32f429zi_skyward_groundstation_v2) - add_executable(test-sx1278fsk-gui-tx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp) target_compile_definitions(test-sx1278fsk-gui-tx PRIVATE DISABLE_RX) sbs_target(test-sx1278fsk-gui-tx stm32f429zi_skyward_groundstation_v2) +add_executable(test-sx1278fsk-gui-rx src/tests/radio/sx1278/test-sx1278-bench-gui.cpp) +target_compile_definitions(test-sx1278fsk-gui-rx PRIVATE DISABLE_TX) +sbs_target(test-sx1278fsk-gui-rx stm32f429zi_skyward_groundstation_v2) + add_executable(test-sx1278fsk-mavlink src/tests/radio/sx1278/fsk/test-sx1278-mavlink.cpp) sbs_target(test-sx1278fsk-mavlink stm32f429zi_skyward_groundstation_v2) diff --git a/src/entrypoints/sx1278-serial.cpp b/src/entrypoints/sx1278-serial.cpp index fdd565e83e0ddf5ead9adddf02fa118d90c7671c..db464cd40ece4dfccfeecd8235fcf0e1cddfbafa 100644 --- a/src/entrypoints/sx1278-serial.cpp +++ b/src/entrypoints/sx1278-serial.cpp @@ -42,6 +42,8 @@ using namespace miosix; // Uncomment the following line to enable Ebyte module // #define SX1278_IS_EBYTE +// Uncomment the following line to ebable Skyward433 module +// #define SX1278_IS_SKYWARD433 using cs = peripherals::ra01::pc13::cs; using dio0 = peripherals::ra01::pc13::dio0; @@ -63,6 +65,29 @@ using rxen = Gpio<GPIOD_BASE, 4>; #define SX1278_IRQ_DIO1 EXTI2_IRQHandlerImpl #define SX1278_IRQ_DIO3 EXTI11_IRQHandlerImpl +#elif defined _BOARD_STM32F429ZI_SKYWARD_RIG +#include "interfaces-impl/hwmapping.h" + +#define SX1278_IS_EBYTE + +using cs = radio::cs; +using dio0 = radio::dio0; +using dio1 = radio::dio1; +using dio3 = radio::dio3; + +using sck = radio::sck; +using miso = radio::miso; +using mosi = radio::mosi; + +using txen = radio::txEn; +using rxen = radio::rxEn; + +#define SX1278_SPI SPI4 + +#define SX1278_IRQ_DIO0 EXTI5_IRQHandlerImpl +#define SX1278_IRQ_DIO1 EXTI12_IRQHandlerImpl +#define SX1278_IRQ_DIO3 EXTI13_IRQHandlerImpl + #else #error "Target not supported" #endif @@ -162,10 +187,15 @@ int main() SPIBus bus(SX1278_SPI); GpioPin cs = cs::getPin(); -#ifdef IS_EBYTE +#if defined SX1278_IS_EBYTE + printf("[sx1278] Confuring Ebyte frontend...\n"); std::unique_ptr<SX1278::ISX1278Frontend> frontend( new EbyteFrontend(txen::getPin(), rxen::getPin())); +#elif defined SX1278_IS_SKYWARD433 + printf("[sx1278] Confuring Skyward 433 frontend...\n"); + std::unique_ptr<SX1278::ISX1278Frontend> frontend(new Skyward433Frontend()); #else + printf("[sx1278] Confuring RA01 frontend...\n"); std::unique_ptr<SX1278::ISX1278Frontend> frontend(new RA01Frontend()); #endif diff --git a/src/shared/radio/SX1278/SX1278Fsk.cpp b/src/shared/radio/SX1278/SX1278Fsk.cpp index f56b3c912d5c7cc6e069a072f9077664449ca4bf..9179b9aaca63787c47b33445f563b38708d9e77c 100644 --- a/src/shared/radio/SX1278/SX1278Fsk.cpp +++ b/src/shared/radio/SX1278/SX1278Fsk.cpp @@ -46,7 +46,6 @@ SX1278Fsk::Error SX1278Fsk::init(const Config &config) // First probe for the device if (!checkVersion()) { - TRACE("[sx1278] Wrong chipid\n"); return Error::BAD_VALUE; } @@ -62,7 +61,10 @@ bool SX1278Fsk::checkVersion() Lock guard(*this); SPITransaction spi(getSpiSlave()); - return spi.readRegister(REG_VERSION) == 0x12; + uint8_t version = spi.readRegister(REG_VERSION); + TRACE("[sx1278] Chip id: %d\n", version); + + return version == 0x12; } SX1278Fsk::Error SX1278Fsk::configure(const Config &config) @@ -70,15 +72,19 @@ SX1278Fsk::Error SX1278Fsk::configure(const Config &config) // First cycle the device to bring it into Fsk mode (can only be changed in // sleep) setDefaultMode(RegOpMode::MODE_SLEEP, DEFAULT_MAPPING, false, false); + miosix::Thread::sleep(1); + // Make sure the device remains in standby and not in sleep setDefaultMode(RegOpMode::MODE_STDBY, DEFAULT_MAPPING, false, false); + miosix::Thread::sleep(1); // Lock the bus Lock guard(*this); LockMode guard_mode(*this, guard, RegOpMode::MODE_STDBY, DEFAULT_MAPPING); - if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 1000)) - return Error::IRQ_TIMEOUT; + // The datasheet lies, this IRQ is unreliable, it doesn't always trigger + // if (!waitForIrqBusy(guard_mode, RegIrqFlags::MODE_READY, 1000)) + // return Error::IRQ_TIMEOUT; int bitrate = config.bitrate; int freq_dev = config.freq_dev; diff --git a/src/shared/radio/SX1278/SX1278Lora.cpp b/src/shared/radio/SX1278/SX1278Lora.cpp index 5948b78d86be9f1e7c20a9f8e8053f2968c96bf6..682f1dc39daf9eadf063b14cedb6f819fd32ccbe 100644 --- a/src/shared/radio/SX1278/SX1278Lora.cpp +++ b/src/shared/radio/SX1278/SX1278Lora.cpp @@ -151,7 +151,10 @@ bool SX1278Lora::checkVersion() Lock guard(*this); SPITransaction spi(getSpiSlave()); - return spi.readRegister(REG_VERSION) == 0x12; + uint8_t version = spi.readRegister(REG_VERSION); + TRACE("[sx1278] Chip id: %d\n", version); + + return version == 0x12; } SX1278Lora::Error SX1278Lora::configure(const Config &config) diff --git a/src/tests/radio/sx1278/sx1278-init.h b/src/tests/radio/sx1278/sx1278-init.h index 0cdcfd2e6e75e255352220b32e5562611fe0f707..75672862a91faf564ff326b3c5da491e81e2f6b0 100644 --- a/src/tests/radio/sx1278/sx1278-init.h +++ b/src/tests/radio/sx1278/sx1278-init.h @@ -38,6 +38,8 @@ // Uncomment the following line to enable Ebyte module // #define SX1278_IS_EBYTE +// Uncomment the following line to ebable Skyward433 module +#define SX1278_IS_SKYWARD433 using cs = miosix::peripherals::ra01::pc13::cs; using dio0 = miosix::peripherals::ra01::pc13::dio0; @@ -59,6 +61,29 @@ using rxen = miosix::Gpio<GPIOD_BASE, 4>; #define SX1278_IRQ_DIO1 EXTI2_IRQHandlerImpl #define SX1278_IRQ_DIO3 EXTI11_IRQHandlerImpl +#elif defined _BOARD_STM32F429ZI_SKYWARD_RIG +#include "interfaces-impl/hwmapping.h" + +#define SX1278_IS_EBYTE + +using cs = miosix::radio::cs; +using dio0 = miosix::radio::dio0; +using dio1 = miosix::radio::dio1; +using dio3 = miosix::radio::dio3; + +using sck = miosix::radio::sck; +using miso = miosix::radio::miso; +using mosi = miosix::radio::mosi; + +using txen = miosix::radio::txEn; +using rxen = miosix::radio::rxEn; + +#define SX1278_SPI SPI4 + +#define SX1278_IRQ_DIO0 EXTI5_IRQHandlerImpl +#define SX1278_IRQ_DIO1 EXTI12_IRQHandlerImpl +#define SX1278_IRQ_DIO3 EXTI13_IRQHandlerImpl + #else #error "Target not supported" #endif @@ -123,28 +148,34 @@ void initBoard() #endif } +Boardcore::SPIBus sx1278_bus(SX1278_SPI); + bool initRadio() { // Initialize frontend (if any) -#ifdef IS_EBYTE +#if defined SX1278_IS_EBYTE + printf("[sx1278] Confuring Ebyte frontend...\n"); std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend( new Boardcore::EbyteFrontend(txen::getPin(), rxen::getPin())); +#elif defined SX1278_IS_SKYWARD433 + printf("[sx1278] Confuring Skyward 433 frontend...\n"); + std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend( + new Boardcore::Skyward433Frontend()); #else + printf("[sx1278] Confuring RA01 frontend...\n"); std::unique_ptr<Boardcore::SX1278::ISX1278Frontend> frontend( new Boardcore::RA01Frontend()); #endif - Boardcore::SPIBus bus(SX1278_SPI); - miosix::GpioPin cs = cs::getPin(); - // Initialize actual radio driver #ifdef SX1278_IS_LORA // Run default configuration Boardcore::SX1278Lora::Config config; Boardcore::SX1278Lora::Error err; - sx1278 = new Boardcore::SX1278Lora( - bus, cs, Boardcore::SPI::ClockDivider::DIV_64, std::move(frontend)); + sx1278 = new Boardcore::SX1278Lora(sx1278_bus, cs::getPin(), + Boardcore::SPI::ClockDivider::DIV_64, + std::move(frontend)); printf("\n[sx1278] Configuring sx1278 lora...\n"); if ((err = sx1278->init(config)) != Boardcore::SX1278Lora::Error::NONE) @@ -159,8 +190,9 @@ bool initRadio() Boardcore::SX1278Fsk::Config config; Boardcore::SX1278Fsk::Error err; - sx1278 = new Boardcore::SX1278Fsk( - bus, cs, Boardcore::SPI::ClockDivider::DIV_64, std::move(frontend)); + sx1278 = new Boardcore::SX1278Fsk(sx1278_bus, cs::getPin(), + Boardcore::SPI::ClockDivider::DIV_64, + std::move(frontend)); printf("\n[sx1278] Configuring sx1278 fsk...\n"); if ((err = sx1278->init(config)) != Boardcore::SX1278Fsk::Error::NONE)