diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a511e5de6b6133cf8c7601398c36f2cf61eef3b..c5d677191b4f9b6bcdb43eb84697bddab5116297 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,15 +214,6 @@ sbs_target(test-pwm stm32f429zi_stm32f4discovery) add_executable(test-spi src/tests/drivers/spi/test-spi.cpp) sbs_target(test-spi stm32f429zi_stm32f4discovery) -add_executable(test-spi-as-slave src/tests/drivers/spi/test-spi-as-slave.cpp) -sbs_target(test-spi-as-slave stm32f429zi_stm32f4discovery) - -add_executable(test-spi-signal-generator src/tests/drivers/spi/test-spi-signal-generator.cpp) -sbs_target(test-spi-signal-generator stm32f429zi_stm32f4discovery) - -add_executable(test-spi-slave-bus src/tests/drivers/spi/test-spi-slave-bus.cpp) -sbs_target(test-spi-slave-bus stm32f429zi_stm32f4discovery) - add_executable(test-timer-utils src/tests/drivers/timer/test-timer-utils.cpp) sbs_target(test-timer-utils stm32f429zi_stm32f4discovery) @@ -322,12 +313,6 @@ sbs_target(test-ads1118 stm32f407vg_stm32f4discovery) add_executable(test-ads131m04 src/tests/sensors/ADS131M04/test-ads131m04.cpp) sbs_target(test-ads131m04 stm32f429zi_stm32f4discovery) -add_executable(test-ads131m04highfreq src/tests/sensors/ADS131M04/test-ads131m04highfreq.cpp) -sbs_target(test-ads131m04highfreq stm32f429zi_stm32f4discovery) - -add_executable(test-ads131m04highfreq-with-logger src/tests/sensors/ADS131M04/test-ads131m04highfreq-with-logger.cpp) -sbs_target(test-ads131m04highfreq-with-logger stm32f429zi_stm32f4discovery) - add_executable(test-analog-pressure-sensors src/tests/sensors/analog/test-analog-pressure-sensors.cpp) sbs_target(test-analog-pressure-sensors stm32f429zi_stm32f4discovery) diff --git a/cmake/boardcore.cmake b/cmake/boardcore.cmake index 5a91d68a09de6e972b58f779eac3ab722f596cd7..caea138a30977227222c31c1f0beae22b3f415f4 100644 --- a/cmake/boardcore.cmake +++ b/cmake/boardcore.cmake @@ -81,7 +81,6 @@ foreach(OPT_BOARD ${BOARDS}) # Sensors ${SBS_BASE}/src/shared/sensors/ADS1118/ADS1118.cpp ${SBS_BASE}/src/shared/sensors/ADS131M04/ADS131M04.cpp - ${SBS_BASE}/src/shared/sensors/ADS131M04/ADS131M04HighFreq.cpp ${SBS_BASE}/src/shared/sensors/BME280/BME280.cpp ${SBS_BASE}/src/shared/sensors/BMP280/BMP280.cpp ${SBS_BASE}/src/shared/sensors/BMX160/BMX160.cpp diff --git a/src/shared/drivers/spi/SPI.h b/src/shared/drivers/spi/SPI.h index 2097264ec8fc93ea70f3ef8fe600bf06d4baad36..e146c323c5db96c5bb5915202e848a88ad8be890 100644 --- a/src/shared/drivers/spi/SPI.h +++ b/src/shared/drivers/spi/SPI.h @@ -183,7 +183,7 @@ public: * @param data Buffer to be filled with received data. * @param size Size of the buffer in bytes. */ - void read(uint16_t *data, size_t nBytes); + void read16(uint16_t *data, size_t nBytes); /** * @brief Writes a single byte to the bus. @@ -197,7 +197,7 @@ public: * * @param data Half word to write. */ - void write(uint16_t data); + void write16(uint16_t data); /** * @brief Writes multiple bytes to the bus. @@ -213,7 +213,7 @@ public: * @param data Buffer containing data to write. * @param size Size of the buffer in bytes. */ - void write(const uint16_t *data, size_t nBytes); + void write16(const uint16_t *data, size_t nBytes); /** * @brief Full duplex transmission of one byte on the bus. @@ -229,7 +229,7 @@ public: * @param data Half word to write. * @return Half word read from the bus. */ - uint16_t transfer(uint16_t data); + uint16_t transfer16(uint16_t data); /** * @brief Full duplex transmission of multiple bytes on the bus. @@ -245,7 +245,7 @@ public: * @param data Buffer containing data to trasfer. * @param size Size of the buffer in bytes. */ - void transfer(uint16_t *data, size_t nBytes); + void transfer16(uint16_t *data, size_t nBytes); private: SPIType *spi; @@ -344,7 +344,7 @@ inline void SPI::read(uint8_t *data, size_t nBytes) data[i] = read(); } -inline void SPI::read(uint16_t *data, size_t nBytes) +inline void SPI::read16(uint16_t *data, size_t nBytes) { // Set 16 bit frame format set16BitFrameFormat(); @@ -372,7 +372,7 @@ inline void SPI::read(uint16_t *data, size_t nBytes) inline void SPI::write(uint8_t data) { transfer(data); } -inline void SPI::write(uint16_t data) { transfer(data); } +inline void SPI::write16(uint16_t data) { transfer(data); } inline void SPI::write(const uint8_t *data, size_t nBytes) { @@ -380,7 +380,7 @@ inline void SPI::write(const uint8_t *data, size_t nBytes) transfer(data[i]); } -inline void SPI::write(const uint16_t *data, size_t nBytes) +inline void SPI::write16(const uint16_t *data, size_t nBytes) { // Set 16 bit frame format set16BitFrameFormat(); @@ -423,7 +423,7 @@ inline uint8_t SPI::transfer(uint8_t data) return static_cast<uint8_t>(spi->DR); } -inline uint16_t SPI::transfer(uint16_t data) +inline uint16_t SPI::transfer16(uint16_t data) { // Set 16 bit frame format set16BitFrameFormat(); @@ -452,7 +452,7 @@ inline void SPI::transfer(uint8_t *data, size_t nBytes) data[i] = transfer(data[i]); } -inline void SPI::transfer(uint16_t *data, size_t nBytes) +inline void SPI::transfer16(uint16_t *data, size_t nBytes) { // Set 16 bit frame format set16BitFrameFormat(); diff --git a/src/shared/drivers/spi/SPIBus.h b/src/shared/drivers/spi/SPIBus.h index e5865b0511bae4e6750b0908eba08074b6e7d2b3..a10af7e296aa35d8aaed5f3c14eac9119b7df802 100644 --- a/src/shared/drivers/spi/SPIBus.h +++ b/src/shared/drivers/spi/SPIBus.h @@ -101,7 +101,7 @@ public: * @param data Buffer to be filled with received data. * @param size Size of the buffer. */ - void read(uint16_t* data, size_t size) override; + void read16(uint16_t* data, size_t size) override; /** * @brief Writes a single byte to the bus. @@ -115,7 +115,7 @@ public: * * @param data Half word to write. */ - void write(uint16_t data) override; + void write16(uint16_t data) override; /** * @brief Writes multiple bytes to the bus. @@ -131,7 +131,7 @@ public: * @param data Buffer containing data to write. * @param size Size of the buffer. */ - void write(uint16_t* data, size_t size) override; + void write16(uint16_t* data, size_t size) override; /** * @brief Full duplex transmission of one byte on the bus. @@ -147,7 +147,7 @@ public: * @param data Half word to write. * @return Half word read from the bus. */ - uint16_t transfer(uint16_t data) override; + uint16_t transfer16(uint16_t data) override; /** * @brief Full duplex transmission of multiple bytes on the bus. @@ -163,7 +163,7 @@ public: * @param data Buffer containing data to trasfer. * @param size Size of the buffer. */ - void transfer(uint16_t* data, size_t size) override; + void transfer16(uint16_t* data, size_t size) override; private: SPI spi; @@ -233,31 +233,34 @@ inline uint16_t SPIBus::read16() { return spi.read16(); } inline void SPIBus::read(uint8_t* data, size_t size) { spi.read(data, size); } -inline void SPIBus::read(uint16_t* data, size_t size) { spi.read(data, size); } +inline void SPIBus::read16(uint16_t* data, size_t size) +{ + spi.read16(data, size); +} inline void SPIBus::write(uint8_t data) { spi.write(data); } -inline void SPIBus::write(uint16_t data) { spi.write(data); } +inline void SPIBus::write16(uint16_t data) { spi.write(data); } inline void SPIBus::write(uint8_t* data, size_t size) { spi.write(data, size); } -inline void SPIBus::write(uint16_t* data, size_t size) +inline void SPIBus::write16(uint16_t* data, size_t size) { - spi.write(data, size); + spi.write16(data, size); } inline uint8_t SPIBus::transfer(uint8_t data) { return spi.transfer(data); } -inline uint16_t SPIBus::transfer(uint16_t data) { return spi.transfer(data); } +inline uint16_t SPIBus::transfer16(uint16_t data) { return spi.transfer(data); } inline void SPIBus::transfer(uint8_t* data, size_t size) { spi.transfer(data, size); } -inline void SPIBus::transfer(uint16_t* data, size_t size) +inline void SPIBus::transfer16(uint16_t* data, size_t size) { - spi.transfer(data, size); + spi.transfer16(data, size); } } // namespace Boardcore diff --git a/src/shared/drivers/spi/SPIBusInterface.h b/src/shared/drivers/spi/SPIBusInterface.h index 1cbdd05ffe6c9a8ba86b82307fe776f1d079a645..12fde48f221732752690b0b109f40ef55c638b01 100644 --- a/src/shared/drivers/spi/SPIBusInterface.h +++ b/src/shared/drivers/spi/SPIBusInterface.h @@ -148,7 +148,7 @@ public: * @param data Buffer to be filled with received data. * @param size Size of the buffer. */ - virtual void read(uint16_t* data, size_t size) = 0; + virtual void read16(uint16_t* data, size_t size) = 0; /** * @brief Writes a single byte to the bus. @@ -162,7 +162,7 @@ public: * * @param data Half word to write. */ - virtual void write(uint16_t data) = 0; + virtual void write16(uint16_t data) = 0; /** * @brief Writes multiple bytes to the bus. @@ -178,7 +178,7 @@ public: * @param data Buffer containing data to write. * @param size Size of the buffer. */ - virtual void write(uint16_t* data, size_t size) = 0; + virtual void write16(uint16_t* data, size_t size) = 0; /** * @brief Full duplex transmission of one byte on the bus. @@ -194,7 +194,7 @@ public: * @param data Half word to write. * @return Half word read from the bus. */ - virtual uint16_t transfer(uint16_t data) = 0; + virtual uint16_t transfer16(uint16_t data) = 0; /** * @brief Full duplex transmission of multiple bytes on the bus. @@ -210,7 +210,7 @@ public: * @param data Buffer containing data to trasfer. * @param size Size of the buffer. */ - virtual void transfer(uint16_t* data, size_t size) = 0; + virtual void transfer16(uint16_t* data, size_t size) = 0; }; /** diff --git a/src/shared/drivers/spi/SPIDriver.h b/src/shared/drivers/spi/SPIDriver.h index 836f9782e42c9fa5b7f5022b5d9dea30d2fba67b..7bdb64ef33a805b2d30628d81103aae1bc1ed63f 100644 --- a/src/shared/drivers/spi/SPIDriver.h +++ b/src/shared/drivers/spi/SPIDriver.h @@ -24,5 +24,4 @@ #include "SPIBus.h" #include "SPIBusInterface.h" -#include "SPISlaveBus.h" #include "SPITransaction.h" diff --git a/src/shared/drivers/spi/SPISignalGenerator.h b/src/shared/drivers/spi/SPISignalGenerator.h deleted file mode 100644 index e3d7e31ee67838d454cb2aaf2dd09a6cb6361f2f..0000000000000000000000000000000000000000 --- a/src/shared/drivers/spi/SPISignalGenerator.h +++ /dev/null @@ -1,273 +0,0 @@ -/* Copyright (c) 2021 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include <drivers/timer/GeneralPurposeTimer.h> -#include <drivers/timer/TimerUtils.h> - -#include "SPIBusInterface.h" - -namespace Boardcore -{ - -/** - * @brief Generates SPI clock and chip select signal through two timers chained - * together. - * - * To configure which timer to use, change the following parameters: - * - chainChannel: Specify which channel of the master timer is used to chain - * the slave timer; - * - csChannel: Specify which channel of the master timer to use for CS signal - * generation; - * - sckChannel: Specify which channel of the slave timer to use for SCK signal - * generation. - * - * The chainChannel and CSChannel should be different. If they are equal the CS - * signal generated by the master timer will be reversed (high when active). - * - * GPIO must be already configured. - * - * This driver does not support the complementary timers channels. - */ -class SPISignalGenerator -{ -public: - /** - * @brief Create a SPISignalGenerator object. This does not configure the - * timers. - * - * @param nBytes Number of bytes for the sck signal. - * @param transactionFrequency Frequency of the SPI transactions. - * @param spiFrequency SPI clock signal frequency. - * @param spiMode SPI mode, this affects the clock polarity and phase. - * @param chainChannel Master timer channel used to chain the slave timer. - * @param csChannel Master timer channel used for CS signal generation. - * @param sckChannel Slave timer channel used for SCK signal generation. - * @param masterTimer Master timer which generates the CS signal. - * @param slaveTimer Slave timer which generates the SCK signal. - * @param slaveTriggerSource Trigger source form the slave timer. This - * depends on the timers combination. - */ - SPISignalGenerator( - size_t nBytes, int transactionFrequency, int spiFrequency = 1e6, - SPI::Mode spiMode = SPI::Mode::MODE_0, - TimerUtils::Channel chainChannel = TimerUtils::Channel::CHANNEL_2, - TimerUtils::Channel csChannel = TimerUtils::Channel::CHANNEL_2, - TimerUtils::Channel sckChannel = TimerUtils::Channel::CHANNEL_4, - TIM_TypeDef *masterTimer = TIM1, TIM_TypeDef *slaveTimer = TIM3, - TimerUtils::TriggerSource slaveTriggerSource = - TimerUtils::TriggerSource::ITR0); - - /** - * @brief Sets up the two timers. - */ - void configure(); - - /** - * @brief Enables SPI signal generation. - */ - void enable(); - - /** - * @brief Disables SPI signal generation. - */ - void disable(); - - /** - * @brief Generates a single spi transaction with the specified number of - * bytes. - * - * Configures the timers to generate the specified number of bytes, enables - * master timer one one-pulse mode and enables them. The master timer will - * be disabled automatically, but the slave timer will not. - * - * @param nBytes Size of the transaction in bytes. - */ - void generateSingleTransaction(size_t nBytes); - -private: - int nBytes; ///< SPI Clock pulses (divided by 8). - int transactionFrequency; ///< Frequency of the transactions are generated. - int spiFrequency; ///< SPI Clock frequency. - SPI::Mode spiMode; - TimerUtils::Channel chainChannel; - TimerUtils::Channel csChannel; - TimerUtils::Channel sckChannel; - GP16bitTimer masterTimer; ///< Master timer for CS generation. - GP16bitTimer slaveTimer; ///< Slave timer for SCK generation. - TimerUtils::TriggerSource slaveTriggerSource; -}; - -inline SPISignalGenerator::SPISignalGenerator( - size_t nBytes, int transactionFrequency, int spiFrequency, - SPI::Mode spiMode, TimerUtils::Channel chainChannel, - TimerUtils::Channel csChannel, TimerUtils::Channel sckChannel, - TIM_TypeDef *masterTimer, TIM_TypeDef *slaveTimer, - TimerUtils::TriggerSource slaveTriggerSource) - : nBytes(nBytes), transactionFrequency(transactionFrequency), - spiFrequency(spiFrequency), spiMode(spiMode), chainChannel(chainChannel), - csChannel(csChannel), sckChannel(sckChannel), masterTimer(masterTimer), - slaveTimer(slaveTimer), slaveTriggerSource(slaveTriggerSource) -{ -} - -inline void SPISignalGenerator::configure() -{ - // Configure master timer - { - masterTimer.reset(); - - // Ensures that the CS output will be high until the timers are enabled - // masterTimer.setCounter(UINT16_MAX); - - // Connect the specified channel to the trigger output - switch (chainChannel) - { - case TimerUtils::Channel::CHANNEL_1: - masterTimer.setMasterMode( - TimerUtils::MasterMode::OC1REF_OUTPUT); - break; - case TimerUtils::Channel::CHANNEL_2: - masterTimer.setMasterMode( - TimerUtils::MasterMode::OC2REF_OUTPUT); - break; - case TimerUtils::Channel::CHANNEL_3: - masterTimer.setMasterMode( - TimerUtils::MasterMode::OC3REF_OUTPUT); - break; - case TimerUtils::Channel::CHANNEL_4: - masterTimer.setMasterMode( - TimerUtils::MasterMode::OC4REF_OUTPUT); - break; - } - - // Set the prescaler and auto realod value - uint16_t autoReloadRegister = spiFrequency * 4 / transactionFrequency; - masterTimer.setPrescaler(TimerUtils::computePrescalerValue( - masterTimer.getTimer(), spiFrequency * 4)); - masterTimer.setAutoReloadRegister(autoReloadRegister); - - // Set channels capture/compare register - uint16_t ccRegister = nBytes * 8 * 4; - ccRegister = autoReloadRegister - ccRegister + 1; - - // Set chain channel - masterTimer.setCaptureCompareRegister(chainChannel, ccRegister); - masterTimer.setOutputCompareMode( - chainChannel, TimerUtils::OutputCompareMode::PWM_MODE_2); - - // Set CS channel if different - if (chainChannel != csChannel) - { - masterTimer.setCaptureCompareRegister(csChannel, ccRegister); - masterTimer.setOutputCompareMode( - csChannel, TimerUtils::OutputCompareMode::PWM_MODE_1); - - // Enable CS capture/compare output - masterTimer.enableCaptureCompareOutput(csChannel); - } - else - { - // If chain channel and cs channel are the same, the cs output - // must be from the complementary output - masterTimer.setCaptureCompareComplementaryPolarity( - chainChannel, TimerUtils::OutputComparePolarity::ACTIVE_LOW); - masterTimer.enableCaptureCompareComplementaryOutput(chainChannel); - } - - // Update the registers - masterTimer.generateUpdate(); - } - - // Configure slave timer - { - slaveTimer.reset(); - - // Set slaveTimer in gated mode - slaveTimer.setSlaveMode(TimerUtils::SlaveMode::GATED_MODE); - - // Set ITR1 as internal trigger source - slaveTimer.setTriggerSource(slaveTriggerSource); - - // Set the prescaler and auto realod value - slaveTimer.setPrescaler(TimerUtils::computePrescalerValue( - slaveTimer.getTimer(), spiFrequency * 4)); - slaveTimer.setAutoReloadRegister(1); - - // Set SCK capture/compare register - slaveTimer.setCaptureCompareRegister(sckChannel, 1); - - // Set channel 1 to toggle mode - slaveTimer.setOutputCompareMode(sckChannel, - TimerUtils::OutputCompareMode::TOGGLE); - if (spiMode >= SPI::Mode::MODE_2) - { - slaveTimer.setCaptureComparePolarity( - sckChannel, TimerUtils::OutputComparePolarity::ACTIVE_LOW); - } - - // Enable capture/compare output - slaveTimer.enableCaptureCompareOutput(sckChannel); - - // Update the register - slaveTimer.generateUpdate(); - } -} - -inline void SPISignalGenerator::enable() -{ - slaveTimer.enable(); - masterTimer.enable(); -} - -inline void SPISignalGenerator::disable() -{ - masterTimer.disable(); - slaveTimer.disable(); -} - -inline void SPISignalGenerator::generateSingleTransaction(size_t nBytes) -{ - // Change the number of bytes to generate - size_t backupNBytes = this->nBytes; - this->nBytes = nBytes; - - // Change the period to generate a transaction right away - int backupTransactionFrequency = transactionFrequency; - transactionFrequency = spiFrequency * 4 / (nBytes * 8 * 4); - - // Configure the timers - configure(); - - // Enable one pulse mode - masterTimer.enableOnePulseMode(); - - // Reset nBytes - this->nBytes = backupNBytes; - transactionFrequency = backupTransactionFrequency; - - // Start the signal generation - enable(); -} - -} // namespace Boardcore diff --git a/src/shared/drivers/spi/SPISlaveBus.h b/src/shared/drivers/spi/SPISlaveBus.h deleted file mode 100644 index fcd274c25937ff768f112e0312176d0d3344024f..0000000000000000000000000000000000000000 --- a/src/shared/drivers/spi/SPISlaveBus.h +++ /dev/null @@ -1,271 +0,0 @@ -/* Copyright (c) 2021 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include "SPIBusInterface.h" -#include "SPISignalGenerator.h" - -namespace Boardcore -{ - -/** - * @brief This implementation of SPIBusInterface uses the spi peripheral in - * slave mode and the spi signal generator to act as an spi master. - */ -class SPISlaveBus : public SPIBusInterface -{ -public: - SPISlaveBus(SPIType* spi, SPISignalGenerator signalGenerator); - - ///< Delete copy/move contructors/operators. - SPISlaveBus(const SPISlaveBus&) = delete; - SPISlaveBus& operator=(const SPISlaveBus&) = delete; - SPISlaveBus(SPISlaveBus&&) = delete; - SPISlaveBus& operator=(SPISlaveBus&&) = delete; - - /** - * @brief Configures and enables the bus with the provided configuration. - * - * Since this implementation is not syncronized, if configure() is called on - * an already in use bus nothing will be done. - * - * Use SyncedSPIBus if you need to synchronize access to the bus. - */ - void configure(SPIBusConfig config) override; - - /** - * @brief See SPIBusInterface::select(). - */ - void select(GpioType& cs) override; - - /** - * @brief See SPIBusInterface::deselect(). - */ - void deselect(GpioType& cs) override; - - // Read, write and transfer operations - - /** - * @brief Reads a single byte from the bus. - * - * @return Byte read from the bus. - */ - uint8_t read() override; - - /** - * @brief Reads a single half word from the bus. - * - * @return Half word read from the bus. - */ - uint16_t read16() override; - - /** - * @brief Reads multiple bytes from the bus - * - * @param data Buffer to be filled with received data. - * @param size Size of the buffer in bytes. - */ - void read(uint8_t* data, size_t size) override; - - /** - * @brief Reads multiple half words from the bus - * - * @param data Buffer to be filled with received data. - * @param size Size of the buffer in bytes. - */ - void read(uint16_t* data, size_t size) override; - - /** - * @brief Writes a single byte to the bus. - * - * @param data Byte to write. - */ - void write(uint8_t data) override; - - /** - * @brief Writes a single half word to the bus. - * - * @param data Half word to write. - */ - void write(uint16_t data) override; - - /** - * @brief Writes multiple bytes to the bus. - * - * @param data Buffer containing data to write. - * @param size Size of the buffer in bytes. - */ - void write(uint8_t* data, size_t size) override; - - /** - * @brief Writes multiple half words to the bus. - * - * @param data Buffer containing data to write. - * @param size Size of the buffer in bytes. - */ - void write(uint16_t* data, size_t size) override; - - /** - * @brief Full duplex transmission of one byte on the bus. - * - * @param data Byte to write. - * @return Byte read from the bus. - */ - uint8_t transfer(uint8_t data) override; - - /** - * @brief Full duplex transmission of one half word on the bus. - * - * @param data Half word to write. - * @return Half word read from the bus. - */ - uint16_t transfer(uint16_t data) override; - - /** - * @brief Full duplex transmission of multiple bytes on the bus. - * - * @param data Buffer containing data to trasfer. - * @param size Size of the buffer in bytes. - */ - void transfer(uint8_t* data, size_t size) override; - - /** - * @brief Full duplex transmission of multiple half words on the bus. - * - * @param data Buffer containing data to trasfer. - * @param size Size of the buffer in bytes. - */ - void transfer(uint16_t* data, size_t size) override; - -private: - SPI spi; - SPISignalGenerator signalGenerator; - SPIBusConfig config{}; -}; - -inline SPISlaveBus::SPISlaveBus(SPIType* spi, - SPISignalGenerator signalGenerator) - : spi(spi), signalGenerator(signalGenerator) -{ -} - -inline void SPISlaveBus::configure(SPIBusConfig newConfig) -{ - // Save the new configuration - config = newConfig; - - // Wait until the peripheral is done before changing configuration - spi.waitPeripheral(); - - // Disable the peripheral - spi.disable(); - - // Configure clock polarity and phase - spi.setMode(config.mode); - - // Configure bit order - spi.setBitOrder(config.bitOrder); - - // Enable the peripheral - spi.enable(); -} - -inline void SPISlaveBus::select(GpioType& cs) {} - -inline void SPISlaveBus::deselect(GpioType& cs) {} - -// Read, write and transfer operations - -inline uint8_t SPISlaveBus::read() -{ - signalGenerator.generateSingleTransaction(1); - return spi.read(); -} - -inline uint16_t SPISlaveBus::read16() -{ - signalGenerator.generateSingleTransaction(2); - return spi.read16(); -} - -inline void SPISlaveBus::read(uint8_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.read(data, size); -} - -inline void SPISlaveBus::read(uint16_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.read(data, size); -} - -inline void SPISlaveBus::write(uint8_t data) -{ - signalGenerator.generateSingleTransaction(1); - spi.write(data); -} - -inline void SPISlaveBus::write(uint16_t data) -{ - signalGenerator.generateSingleTransaction(2); - spi.write(data); -} - -inline void SPISlaveBus::write(uint8_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.write(data, size); -} - -inline void SPISlaveBus::write(uint16_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.write(data, size); -} - -inline uint8_t SPISlaveBus::transfer(uint8_t data) -{ - signalGenerator.generateSingleTransaction(1); - return spi.transfer(data); -} - -inline uint16_t SPISlaveBus::transfer(uint16_t data) -{ - signalGenerator.generateSingleTransaction(2); - return spi.transfer(data); -} - -inline void SPISlaveBus::transfer(uint8_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.transfer(data, size); -} - -inline void SPISlaveBus::transfer(uint16_t* data, size_t size) -{ - signalGenerator.generateSingleTransaction(size); - spi.transfer(data, size); -} - -} // namespace Boardcore diff --git a/src/shared/drivers/spi/SPITransaction.cpp b/src/shared/drivers/spi/SPITransaction.cpp index faa330d96f5c8e5cc268863a5b72f51f933ffac0..e16ad6326cc661503160e262a5d45e1b38c18828 100644 --- a/src/shared/drivers/spi/SPITransaction.cpp +++ b/src/shared/drivers/spi/SPITransaction.cpp @@ -64,10 +64,10 @@ void SPITransaction::read(uint8_t* data, size_t size) bus.deselect(cs); } -void SPITransaction::read(uint16_t* data, size_t size) +void SPITransaction::read16(uint16_t* data, size_t size) { bus.select(cs); - bus.read(data, size); + bus.read16(data, size); bus.deselect(cs); } @@ -78,10 +78,10 @@ void SPITransaction::write(uint8_t data) bus.deselect(cs); } -void SPITransaction::write(uint16_t data) +void SPITransaction::write16(uint16_t data) { bus.select(cs); - bus.write(data); + bus.write16(data); bus.deselect(cs); } @@ -92,10 +92,10 @@ void SPITransaction::write(uint8_t* data, size_t size) bus.deselect(cs); } -void SPITransaction::write(uint16_t* data, size_t size) +void SPITransaction::write16(uint16_t* data, size_t size) { bus.select(cs); - bus.write(data, size); + bus.write16(data, size); bus.deselect(cs); } @@ -107,10 +107,10 @@ uint8_t SPITransaction::transfer(uint8_t data) return data; } -uint16_t SPITransaction::transfer(uint16_t data) +uint16_t SPITransaction::transfer16(uint16_t data) { bus.select(cs); - data = bus.transfer(data); + data = bus.transfer16(data); bus.deselect(cs); return data; } @@ -122,10 +122,10 @@ void SPITransaction::transfer(uint8_t* data, size_t size) bus.deselect(cs); } -void SPITransaction::transfer(uint16_t* data, size_t size) +void SPITransaction::transfer16(uint16_t* data, size_t size) { bus.select(cs); - bus.transfer(data, size); + bus.transfer16(data, size); bus.deselect(cs); } diff --git a/src/shared/drivers/spi/SPITransaction.h b/src/shared/drivers/spi/SPITransaction.h index 6c98cafbe1b4ba524f8ade19e399acb4c2b61b47..abd9ac33e6a341ea736219bdfe4b2436602a22eb 100644 --- a/src/shared/drivers/spi/SPITransaction.h +++ b/src/shared/drivers/spi/SPITransaction.h @@ -126,7 +126,7 @@ public: * @param data Buffer to be filled with received data. * @param size Size of the buffer in bytes. */ - void read(uint16_t *data, size_t size); + void read16(uint16_t *data, size_t size); /** * @brief Writes a single byte to the bus. @@ -140,7 +140,7 @@ public: * * @param data Half word to write. */ - void write(uint16_t data); + void write16(uint16_t data); /** * @brief Writes multiple bytes to the bus. @@ -156,7 +156,7 @@ public: * @param data Buffer containing data to write. * @param size Size of the buffer in bytes. */ - void write(uint16_t *data, size_t size); + void write16(uint16_t *data, size_t size); /** * @brief Full duplex transmission of one byte on the bus. @@ -172,7 +172,7 @@ public: * @param data Half word to write. * @return Half word read from the bus. */ - uint16_t transfer(uint16_t data); + uint16_t transfer16(uint16_t data); /** * @brief Full duplex transmission of multiple bytes on the bus. @@ -188,7 +188,7 @@ public: * @param data Buffer containing data to trasfer. * @param size Size of the buffer in bytes. */ - void transfer(uint16_t *data, size_t size); + void transfer16(uint16_t *data, size_t size); // Read, write and transfer operations with registers diff --git a/src/shared/sensors/MAX31855/MAX31855.cpp b/src/shared/sensors/MAX31855/MAX31855.cpp index ee52dd7ab70af2d83e150a60b8b322e490ba1fcd..c55d0806597b7967bb2140e9768c32094f8a217e 100644 --- a/src/shared/sensors/MAX31855/MAX31855.cpp +++ b/src/shared/sensors/MAX31855/MAX31855.cpp @@ -51,7 +51,7 @@ bool MAX31855::checkConnection() { SPITransaction spi{slave}; - spi.read(sample, sizeof(sample)); + spi.read16(sample, sizeof(sample)); } // Bits D0, D1 and D2 go high if thermocouple is open or shorted either to @@ -90,7 +90,7 @@ TemperatureData MAX31855::readInternalTemperature() { SPITransaction spi{slave}; - spi.read(sample, sizeof(sample)); + spi.read16(sample, sizeof(sample)); } TemperatureData result{}; diff --git a/src/tests/drivers/spi/test-spi-as-slave.cpp b/src/tests/drivers/spi/test-spi-as-slave.cpp deleted file mode 100644 index 525f9e5d8b224e0715d3a9ac33a5e5303288a4d9..0000000000000000000000000000000000000000 --- a/src/tests/drivers/spi/test-spi-as-slave.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright (c) 2020 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include <drivers/spi/SPI.h> -#include <miosix.h> - -using namespace miosix; -using namespace Boardcore; - -GpioPin sckPin = GpioPin(GPIOE_BASE, 4); -GpioPin misoPin = GpioPin(GPIOE_BASE, 2); -GpioPin mosiPin = GpioPin(GPIOE_BASE, 5); -GpioPin csPin = GpioPin(GPIOE_BASE, 6); - -uint16_t counter = 0; - -int main() -{ - // Setup gpio pins - csPin.mode(Mode::ALTERNATE); - csPin.alternateFunction(5); - sckPin.mode(Mode::ALTERNATE); - sckPin.alternateFunction(5); - misoPin.mode(Mode::ALTERNATE); - misoPin.alternateFunction(5); - mosiPin.mode(Mode::ALTERNATE); - mosiPin.alternateFunction(5); - - // Setup spi as a slave - SPI spi(SPI4); - spi.reset(); - spi.enable(); - spi.set16BitFrameFormat(); - - printf("Slave started\n"); - - while (true) - { - spi.getSpi()->DR = counter; - counter++; - // Wait until Tx buffer is empty and until the peripheral is still busy - while ((spi.getSpi()->SR & SPI_SR_TXE) == 0) - ; - } -} diff --git a/src/tests/drivers/spi/test-spi-signal-generator.cpp b/src/tests/drivers/spi/test-spi-signal-generator.cpp deleted file mode 100644 index c89af2e3d71e770e76fe8ab762fb570b5ac02b15..0000000000000000000000000000000000000000 --- a/src/tests/drivers/spi/test-spi-signal-generator.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2021 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include <drivers/spi/SPISignalGenerator.h> -#include <miosix.h> - -using namespace miosix; -using namespace Boardcore; -using namespace TimerUtils; - -/** - * Pin list: - * PB4 - TIM3_CH1 - CS signal - * PE5 - TIM9_CH1 - SCK signal - * - * We'll use two timers to generate clock and chip select signals for the SPI - * peripheral. - */ - -GpioPin csPin = GpioPin(GPIOA_BASE, 11); -GpioPin sckPin = GpioPin(GPIOB_BASE, 1); - -void setupGPIOs(); - -int main() -{ - setupGPIOs(); - - SPISignalGenerator spiSignalGenerator{2, - 1000, - 1000000, - SPI::Mode::MODE_0, - TimerUtils::Channel::CHANNEL_1, - TimerUtils::Channel::CHANNEL_4, - TimerUtils::Channel::CHANNEL_4}; - spiSignalGenerator.configure(); - - Thread::sleep(1000); - - spiSignalGenerator.generateSingleTransaction(8); - - Thread::sleep(1000); - spiSignalGenerator.configure(); - spiSignalGenerator.enable(); - - Thread::sleep(5 * 1000); - - spiSignalGenerator.disable(); - - while (true) - Thread::sleep(10000); -} - -void setupGPIOs() -{ - csPin.mode(Mode::ALTERNATE); - csPin.alternateFunction(1); - - sckPin.mode(Mode::ALTERNATE); - sckPin.alternateFunction(2); -} diff --git a/src/tests/drivers/spi/test-spi-slave-bus.cpp b/src/tests/drivers/spi/test-spi-slave-bus.cpp deleted file mode 100644 index e75d047e0bc822ed4f85ce886b93aff540915bf8..0000000000000000000000000000000000000000 --- a/src/tests/drivers/spi/test-spi-slave-bus.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright (c) 2020 Skyward Experimental Rocketry - * Author: Alberto Nidasio - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include <drivers/spi/SPIDriver.h> -#include <miosix.h> - -using namespace miosix; -using namespace Boardcore; - -GpioPin sckPin = GpioPin(GPIOE_BASE, 4); -GpioPin misoPin = GpioPin(GPIOE_BASE, 2); -GpioPin mosiPin = GpioPin(GPIOE_BASE, 5); -GpioPin csPin = GpioPin(GPIOE_BASE, 6); - -GpioPin timerCsPin = GpioPin(GPIOA_BASE, 11); -GpioPin timerSckPin = GpioPin(GPIOB_BASE, 1); - -int main() -{ - // Setup gpio pins - csPin.mode(Mode::ALTERNATE); - csPin.alternateFunction(5); - sckPin.mode(Mode::ALTERNATE); - sckPin.alternateFunction(5); - misoPin.mode(Mode::ALTERNATE); - misoPin.alternateFunction(5); - mosiPin.mode(Mode::ALTERNATE); - mosiPin.alternateFunction(5); - - timerCsPin.mode(Mode::ALTERNATE); - timerCsPin.alternateFunction(1); - timerSckPin.mode(Mode::ALTERNATE); - timerSckPin.alternateFunction(2); - - // Setup spi as a slave - SPISignalGenerator spiSignalGenerator{2, - 100, - 1000000, - SPI::Mode::MODE_0, - TimerUtils::Channel::CHANNEL_1, - TimerUtils::Channel::CHANNEL_4, - TimerUtils::Channel::CHANNEL_4}; - SPISlaveBus bus(SPI4, spiSignalGenerator); - SPISlave spiSlave(bus, csPin, {}); - spiSlave.config.clockDivider = SPI::ClockDivider::DIV_64; - - SPITransaction transaction(spiSlave); - - uint8_t buffer8[6]; - uint16_t buffer16[6]; - - transaction.read(); - delayMs(1); - transaction.read16(); - delayMs(1); - transaction.read(buffer8, sizeof(buffer8)); - delayMs(1); - transaction.read(buffer16, sizeof(buffer16)); - delayMs(1); - transaction.write((uint8_t)0xAB); - delayMs(1); - transaction.write((uint16_t)0xABCD); - delayMs(1); - buffer8[0] = 0x01; - buffer8[1] = 0x23; - buffer8[2] = 0x45; - buffer8[3] = 0x67; - buffer8[4] = 0x89; - buffer8[5] = 0xAB; - transaction.write(buffer8, sizeof(buffer8)); - delayMs(1); - buffer16[0] = 0x0101; - buffer16[1] = 0x2323; - buffer16[2] = 0x4545; - buffer16[3] = 0x6767; - buffer16[4] = 0x8989; - buffer16[5] = 0xABAB; - transaction.write(buffer16, sizeof(buffer16)); - delayMs(1); - transaction.transfer((uint8_t)0xAB); - delayMs(1); - transaction.transfer((uint16_t)0xABCD); - delayMs(1); - transaction.transfer(buffer8, sizeof(buffer8)); - delayMs(1); - transaction.transfer(buffer16, sizeof(buffer16)); - - while (true) - delayMs(1000); -} diff --git a/src/tests/drivers/spi/test-spi.cpp b/src/tests/drivers/spi/test-spi.cpp index 0d52bd427c89ccf84f257d137d3eda5cb90e0159..813cc1a1fd3d29c68f7cf0f0872ae1f80baea04f 100644 --- a/src/tests/drivers/spi/test-spi.cpp +++ b/src/tests/drivers/spi/test-spi.cpp @@ -62,11 +62,11 @@ int main() delayMs(1); transaction.read(buffer8, 6); delayMs(1); - transaction.read(buffer16, 6); + transaction.read16(buffer16, 6); delayMs(1); transaction.write((uint8_t)0xAB); delayMs(1); - transaction.write((uint16_t)0xABCD); + transaction.write16((uint16_t)0xABCD); delayMs(1); buffer8[0] = 0x01; buffer8[1] = 0x23; @@ -82,15 +82,15 @@ int main() buffer16[3] = 0x6767; buffer16[4] = 0x8989; buffer16[5] = 0xABAB; - transaction.write(buffer16, 6); + transaction.write16(buffer16, 6); delayMs(1); transaction.transfer((uint8_t)0xAB); delayMs(1); - transaction.transfer((uint16_t)0xABCD); + transaction.transfer16((uint16_t)0xABCD); delayMs(1); transaction.transfer(buffer8, 6); delayMs(1); - transaction.transfer(buffer16, 6); + transaction.transfer16(buffer16, 6); while (true) delayMs(1000);