Program Listing for File spi3w-ino.hpp

Return to documentation for file (src/framework/arduino/pal/spi3w-ino.hpp)

/*
 * \file        spi3w-ino.hpp
 * \brief       Arduino SPI 3wire extension
 * \author      Infineon Technologies AG
 * \version     4.0.0
 * \copyright   2020-2024 Infineon Technologies AG
 *
 * SPDX-License-Identifier: MIT
 */

#ifndef SPI3W_INO_HPP
#define SPI3W_INO_HPP


#include <Arduino.h>
#include "SPI.h"
#include "pal-pin-types.hpp"

namespace tle5012
{


#define SPI3W_ARD        1
#define SPI3W_XMC        2
#define SPI3W_ESP32      3

#define MAX_SLAVE_NUM    4
#define SPEED            1000000U

#if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)
    // This part is yet to be implemented
    class SPIClass3W : public ArduinoSPI {
#elif defined(ARDUINO_ARCH_RP2040)
    // This part is yet to be implemented
    class SPIClass3W : public MbedSPI {
#elif defined(ARDUINO_ARCH_SAMD)
    // This part is yet to be implemented
    class SPIClass3W : public SPIClassSAMD {
#else
    class SPIClass3W : public SPIClass {
#endif

    public:
        #if defined(UC_FAMILY) && (UC_FAMILY == 1 || UC_FAMILY == 4)
            #define SPI3W_INO SPI3W_XMC
        #elif defined(ESP32) && (ALTERNATIVE_PINS == 3)
            #define SPI3W_INO SPI3W_ESP32
        #else
            #define SPI3W_INO SPI3W_ARD
        #endif

        uint8_t     mCS;
        uint8_t     mSpiNum;

                SPIClass3W(uint8_t spiNum = 0);
                ~SPIClass3W();
        void    begin(uint8_t miso, uint8_t mosi, uint8_t sck, uint8_t cs);
        void    setCSPin(uint8_t cs);
        void    sendReceiveSpi(uint16_t* sent_data, uint16_t size_of_sent_data, uint16_t* received_data, uint16_t size_of_received_data);

    private:

        uint8_t     mMOSI;
        uint8_t     mMISO;
        uint8_t     mSCK;


        #if defined(UC_FAMILY) && (UC_FAMILY == 1 || UC_FAMILY == 4)
            typedef struct
            {
                XMC_USIC_CH_t*           channel;
                XMC_SPI_CH_CONFIG_t      channel_config;
                XMC_PORT_PIN_t           mosi;
                XMC_GPIO_CONFIG_t        mosi_open;
                XMC_GPIO_CONFIG_t        mosi_close;
                XMC_PORT_PIN_t           miso;
                XMC_GPIO_CONFIG_t        miso_open;
                XMC_GPIO_CONFIG_t        miso_close;
                XMC_USIC_INPUT_t         input_source;
                XMC_PORT_PIN_t           sck;
                XMC_GPIO_CONFIG_t        sck_config;
                XMC_PORT_PIN_t           cs;
                XMC_GPIO_CONFIG_t        cs_config;
            } XMC_3W_SPI_t;

            XMC_3W_SPI_t      m3Wire;

            void setupSPI();
            void initSpi();

        #elif defined(ESP32) && (ALTERNATIVE_PINS == 3)
            void *e3Wire;
        #endif

};


extern SPIClass3W SPI3W;
#if (NUM_SPI > 1)
    extern SPIClass3W SPI3W1;
#   if (NUM_SPI > 2)
        extern SPIClass3W SPI3W2;
#       if (NUM_SPI > 3)
            extern SPIClass3W SPI3W3;
#           if (NUM_SPI > 4)
                extern SPIClass3W SPI3W4;
#           endif
#       endif
#   endif
#endif

}
#endif /* SPI3W_INO_HPP */