Skip to content

Commit 3f15c7d

Browse files
authored
Increase baseline SPI bulk transfer speeds (#89)
Increase baseline SPI bulk transfer speeds
2 parents 1e9939e + 14bb73b commit 3f15c7d

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

libraries/SPI/src/SPI.cpp

+16-11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828

2929
const SPISettings DEFAULT_SPI_SETTINGS = SPISettings();
3030

31+
am_hal_iom_transfer_t iomTransfer = {0};
32+
3133
SPIClass::SPIClass(uint8_t iom_instance) : IOMaster(iom_instance)
3234
{
3335
_duplex = ap3_spi_full_duplex;
@@ -105,12 +107,25 @@ void SPIClass::begin()
105107
}
106108

107109
config(DEFAULT_SPI_SETTINGS);
110+
111+
//Set global's settings that won't change between transfers
112+
iomTransfer.ui32InstrLen = 0; // No instructions
113+
iomTransfer.ui32Instr = 0; // No instructions
114+
iomTransfer.bContinue = false;
115+
iomTransfer.ui8RepeatCount = 0; // ?
116+
iomTransfer.ui8Priority = 1; // ?
117+
iomTransfer.ui32PauseCondition = 0; // ?
118+
iomTransfer.ui32StatusSetClr = 0; // ?
108119
}
109120

110121
void SPIClass::config(SPISettings settings)
111122
{
112123
memset((void *)&_config, 0x00, sizeof(am_hal_iom_config_t)); // Set the IOM configuration
113124
_config.eInterfaceMode = AM_HAL_IOM_SPI_MODE;
125+
126+
if (settings.clockFreq > AM_HAL_IOM_MAX_FREQ)
127+
settings.clockFreq = AM_HAL_IOM_MAX_FREQ;
128+
114129
_config.ui32ClockFreq = settings.clockFreq;
115130
_config.eSpiMode = settings.dataMode;
116131
_order = settings.bitOrder;
@@ -272,19 +287,9 @@ void SPIClass::transferIn(void *buf, size_t count)
272287

273288
void SPIClass::_transfer(void *buf_out, void *buf_in, size_t count)
274289
{
275-
am_hal_iom_transfer_t iomTransfer = {0};
276-
// iomTransfer.uPeerInfo.ui32SpiChipSelect = cs_pad;
277-
iomTransfer.ui32InstrLen = 0; // No instructions
278-
iomTransfer.ui32Instr = 0; // No instructions
279-
iomTransfer.ui32NumBytes = count; // How many bytes to transfer
280-
// iomTransfer.eDirection = AM_HAL_IOM_TX; // AM_HAL_IOM_FULLDUPLEX - Note: Ambiq SDK says that FULLDUPLEX is not yet supported // todo:
290+
iomTransfer.ui32NumBytes = count; // How many bytes to transfer
281291
iomTransfer.pui32TxBuffer = (uint32_t *)buf_out; // todo: does this have the proper lifetime?
282292
iomTransfer.pui32RxBuffer = (uint32_t *)buf_in;
283-
iomTransfer.bContinue = false;
284-
iomTransfer.ui8RepeatCount = 0; // ?
285-
iomTransfer.ui8Priority = 1; // ?
286-
iomTransfer.ui32PauseCondition = 0; // ?
287-
iomTransfer.ui32StatusSetClr = 0; // ?
288293

289294
// Determine direction
290295
if ((buf_out != NULL) && (buf_in != NULL))

0 commit comments

Comments
 (0)