From 7499b1ae572e00ab0fa57183d2958846cd01d8e8 Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 15 Nov 2019 15:54:47 -0700 Subject: [PATCH 1/2] Make the iomTransfer global to decrease single byte read/write time by 25%. --- libraries/SPI/src/SPI.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 324b948..2b525b9 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -28,6 +28,8 @@ const SPISettings DEFAULT_SPI_SETTINGS = SPISettings(); +am_hal_iom_transfer_t iomTransfer = {0}; + SPIClass::SPIClass(uint8_t iom_instance) : IOMaster(iom_instance) { _duplex = ap3_spi_full_duplex; @@ -105,6 +107,15 @@ void SPIClass::begin() } config(DEFAULT_SPI_SETTINGS); + + //Set global's settings that won't change between transfers + iomTransfer.ui32InstrLen = 0; // No instructions + iomTransfer.ui32Instr = 0; // No instructions + iomTransfer.bContinue = false; + iomTransfer.ui8RepeatCount = 0; // ? + iomTransfer.ui8Priority = 1; // ? + iomTransfer.ui32PauseCondition = 0; // ? + iomTransfer.ui32StatusSetClr = 0; // ? } void SPIClass::config(SPISettings settings) @@ -272,19 +283,9 @@ void SPIClass::transferIn(void *buf, size_t count) void SPIClass::_transfer(void *buf_out, void *buf_in, size_t count) { - am_hal_iom_transfer_t iomTransfer = {0}; - // iomTransfer.uPeerInfo.ui32SpiChipSelect = cs_pad; - iomTransfer.ui32InstrLen = 0; // No instructions - iomTransfer.ui32Instr = 0; // No instructions - iomTransfer.ui32NumBytes = count; // How many bytes to transfer - // iomTransfer.eDirection = AM_HAL_IOM_TX; // AM_HAL_IOM_FULLDUPLEX - Note: Ambiq SDK says that FULLDUPLEX is not yet supported // todo: + iomTransfer.ui32NumBytes = count; // How many bytes to transfer iomTransfer.pui32TxBuffer = (uint32_t *)buf_out; // todo: does this have the proper lifetime? iomTransfer.pui32RxBuffer = (uint32_t *)buf_in; - iomTransfer.bContinue = false; - iomTransfer.ui8RepeatCount = 0; // ? - iomTransfer.ui8Priority = 1; // ? - iomTransfer.ui32PauseCondition = 0; // ? - iomTransfer.ui32StatusSetClr = 0; // ? // Determine direction if ((buf_out != NULL) && (buf_in != NULL)) From 14bb73ba7b310619264eb63cf5c783ace8039e9a Mon Sep 17 00:00:00 2001 From: Nathan Seidle Date: Fri, 15 Nov 2019 16:02:59 -0700 Subject: [PATCH 2/2] Limit SPI max speed to HAL limit of 48MHz. --- libraries/SPI/src/SPI.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 2b525b9..abcfa6b 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -122,6 +122,10 @@ void SPIClass::config(SPISettings settings) { memset((void *)&_config, 0x00, sizeof(am_hal_iom_config_t)); // Set the IOM configuration _config.eInterfaceMode = AM_HAL_IOM_SPI_MODE; + + if (settings.clockFreq > AM_HAL_IOM_MAX_FREQ) + settings.clockFreq = AM_HAL_IOM_MAX_FREQ; + _config.ui32ClockFreq = settings.clockFreq; _config.eSpiMode = settings.dataMode; _order = settings.bitOrder;