Browse Source

SPI driver for SparkFun Apollo3

main
Bill Greiman 5 years ago
parent
commit
c980c3e6ec
4 changed files with 114 additions and 4 deletions
  1. +2
    -0
      src/FreeStack.h
  2. +2
    -1
      src/SdFatConfig.h
  3. +3
    -3
      src/SpiDriver/SdSpiArduinoDriver.h
  4. +107
    -0
      src/SpiDriver/SdSpiArtemis.cpp

+ 2
- 0
src/FreeStack.h View File

@@ -44,6 +44,8 @@ inline int FreeStack() {
char* sp = reinterpret_cast<char*>(SP);
return __brkval ? sp - __brkval : sp - &__bss_end;
}
#elif defined(ARDUINO_ARCH_APOLLO3)
#define HAS_UNUSED_STACK 0
#elif defined(PLATFORM_ID) // Particle board
#include "Arduino.h"
inline int FreeStack() {

+ 2
- 1
src/SdFatConfig.h View File

@@ -284,7 +284,8 @@
/**
* Determine the default SPI configuration.
*/
#if defined(__STM32F1__)\
#if defined(ARDUINO_ARCH_APOLLO3)\
|| defined(__STM32F1__)\
|| (defined(__arm__) && defined(CORE_TEENSY))\
|| defined(PLATFORM_ID)
// has multiple SPI ports

+ 3
- 3
src/SpiDriver/SdSpiArduinoDriver.h View File

@@ -26,8 +26,8 @@
* \file
* \brief SpiDriver classes for Arduino compatible systems.
*/
#ifndef SdSpArduinoDriver_h
#define SdSpArduinoDriver_h
#ifndef SdSpiArduinoDriver_h
#define SdSpiArduinoDriver_h
#include "../common/SysCall.h"

#if SPI_DRIVER_SELECT < 2
@@ -407,4 +407,4 @@ typedef SdSoftSpiDriver SdSpiDriver;
#else // SPI_DRIVER_SELECT
#error invalid SPI_DRIVER_SELECT
#endif // SPI_DRIVER_SELECT
#endif // SdSpArduinoDriver_h
#endif // SdSpiArduinoDriver_h

+ 107
- 0
src/SpiDriver/SdSpiArtemis.cpp View File

@@ -0,0 +1,107 @@
/**
* Copyright (c) 2011-2019 Bill Greiman
* This file is part of the SdFat library for SD memory cards.
*
* MIT License
*
* 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 "SdSpiDriver.h"
#if defined(SD_ALT_SPI_DRIVER) && defined(ARDUINO_ARCH_APOLLO3)


//------------------------------------------------------------------------------
/** Set SPI options for access to SD/SDHC cards.
*
* \param[in] divisor SCK clock divider relative to the APB1 or APB2 clock.
*/
void SdAltSpiDriver::activate() {
m_spi->beginTransaction(m_spiSettings);
}
//------------------------------------------------------------------------------
/** Initialize the SPI bus.
*
* \param[in] chipSelectPin SD card chip select pin.
*/
void SdAltSpiDriver::begin(SdSpiConfig spiConfig) {
m_csPin = spiConfig.csPin;
m_spiSettings = LOW_SPEED_SPI_SETTINGS;
if (spiConfig.spiPort) {
m_spi = spiConfig.spiPort;
} else {
m_spi = &SPI;
}
m_spi->begin();
pinMode(m_csPin, OUTPUT);
digitalWrite(m_csPin, HIGH);
}
//------------------------------------------------------------------------------
/**
* End SPI transaction.
*/
void SdAltSpiDriver::deactivate() {
m_spi->endTransaction();
}
//------------------------------------------------------------------------------
/** Receive a byte.
*
* \return The byte.
*/
uint8_t SdAltSpiDriver::receive() {
return m_spi->transfer(0XFF);
}
//------------------------------------------------------------------------------
/** Receive multiple bytes.
*
* \param[out] buf Buffer to receive the data.
* \param[in] n Number of bytes to receive.
*
* \return Zero for no error or nonzero error code.
*/
uint8_t SdAltSpiDriver::receive(uint8_t *buf, size_t n) {
m_spi->transferIn(buf, n);
return 0;
}
//------------------------------------------------------------------------------
/** Send a byte.
*
* \param[in] b Byte to send
*/
void SdAltSpiDriver::send(uint8_t b) {
m_spi->transfer(b);
}
//------------------------------------------------------------------------------
/** Send multiple bytes.
*
* \param[in] buf Buffer for data to be sent.
* \param[in] n Number of bytes to send.
*/
void SdAltSpiDriver::send(const uint8_t *buf, size_t n) {
//Convert byte array to 4 byte array
uint32_t myArray[n / 4];
for (int x = 0; x < n / 4; x++)
{
myArray[x] = ((uint32_t)buf[(x * 4) + 3] << (8 * 3)) |
((uint32_t)buf[(x * 4) + 2] << (8 * 2)) |
((uint32_t)buf[(x * 4) + 1] << (8 * 1)) |
((uint32_t)buf[(x * 4) + 0] << (8 * 0));
}
m_spi->transfer((void *)myArray, n);
}
#endif // defined(ARDUINO_ARCH_APOLLO3)

Loading…
Cancel
Save