Program Listing for File spi3w-ard.cpp

Return to documentation for file (src/framework/arduino/pal/spi3w-ard.cpp)

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

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

#if (SPI3W_INO == SPI3W_ARD)

using namespace tle5012;

#if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)
// This part is yet to be implemented
SPIClass3W::SPIClass3W(uint8_t spiNum):ArduinoSPI(MISO,MOSI,SCK,MODE_SPI)
#elif defined(ARDUINO_ARCH_RP2040)
// This part is yet to be implemented
SPIClass3W::SPIClass3W(uint8_t spiNum):MbedSPI(MISO,MOSI,SCK)
#elif defined(ARDUINO_ARCH_SAMD)
// This part is yet to be implemented
SPIClass3W::SPIClass3W(uint8_t spiNum):SPIClassSAMD(&PERIPH_SPI ,MISO,SCK,MOSI, PAD_SPI_TX,  PAD_SPI_RX)
#else
SPIClass3W::SPIClass3W(uint8_t spiNum):SPIClass()
#endif
{
    this->mCS = SS;
    this->mMISO = MISO;
    this->mMOSI = MOSI;
    this->mSCK = SCK;
    this->mSpiNum = spiNum;
}

void SPIClass3W::begin(uint8_t miso, uint8_t mosi, uint8_t sck, uint8_t cs)
{
    this->mMOSI = mosi;
    this->mMISO = miso;
    this->mSCK = sck;
    setCSPin(cs);
    pinMode(this->mCS,OUTPUT);
    digitalWrite(this->mCS, HIGH);
    #if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)
        ArduinoSPI::begin();
        Serial.println("Arduino Uno R4 3-wire SPI is yet not working");
    #elif defined(ARDUINO_ARCH_RP2040)
        MbedSPI::begin();
        Serial.println("Arduino Uno Nano RP2040 3-wire SPI is yet not working");
    #elif defined(ARDUINO_ARCH_SAMD)
        SPIClassSAMD::begin();
        Serial.println("Arduino SAMD 3-wire SPI is yet not working");
    #else
        SPIClass::begin();
    #endif
}


SPIClass3W::~SPIClass3W()
{
}

void SPIClass3W::setCSPin(uint8_t cs)
{
    this->mCS = cs;
}

void SPIClass3W::sendReceiveSpi(uint16_t* sent_data, uint16_t size_of_sent_data, uint16_t* received_data, uint16_t size_of_received_data)
{
    uint32_t data_index = 0;
    //send via TX
    digitalWrite(this->mCS, LOW);
    pinMode(this->mMISO,INPUT);
    pinMode(this->mMOSI,OUTPUT);
    beginTransaction(SPISettings(SPEED,MSBFIRST,SPI_MODE1));

    for(data_index = 0; data_index < size_of_sent_data; data_index++)
    {
        received_data[0] = transfer16(sent_data[data_index]);
    }
    // Some MCUs require a delay and CS high to low between the last byte and the CS high
    // digitalWrite(this->mCS, HIGH);

    // receive via RX
    // digitalWrite(this->mCS, LOW);
    pinMode(this->mMISO,OUTPUT);
    pinMode(this->mMOSI,INPUT);
    delayMicroseconds(5);

    for(data_index = 0; data_index < size_of_received_data; data_index++)
    {
        received_data[data_index] = transfer16(0x0000);
    }

    endTransaction();
    digitalWrite(this->mCS, HIGH);
}


// #endif


#endif /* SPI3W_INO */