|
28 | 28 |
|
29 | 29 | const SPISettings DEFAULT_SPI_SETTINGS = SPISettings(); |
30 | 30 |
|
| 31 | +am_hal_iom_transfer_t iomTransfer = {0}; |
| 32 | + |
31 | 33 | SPIClass::SPIClass(uint8_t iom_instance) : IOMaster(iom_instance) |
32 | 34 | { |
33 | 35 | _duplex = ap3_spi_full_duplex; |
@@ -105,12 +107,25 @@ void SPIClass::begin() |
105 | 107 | } |
106 | 108 |
|
107 | 109 | 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; // ? |
108 | 119 | } |
109 | 120 |
|
110 | 121 | void SPIClass::config(SPISettings settings) |
111 | 122 | { |
112 | 123 | memset((void *)&_config, 0x00, sizeof(am_hal_iom_config_t)); // Set the IOM configuration |
113 | 124 | _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 | + |
114 | 129 | _config.ui32ClockFreq = settings.clockFreq; |
115 | 130 | _config.eSpiMode = settings.dataMode; |
116 | 131 | _order = settings.bitOrder; |
@@ -272,19 +287,9 @@ void SPIClass::transferIn(void *buf, size_t count) |
272 | 287 |
|
273 | 288 | void SPIClass::_transfer(void *buf_out, void *buf_in, size_t count) |
274 | 289 | { |
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 |
281 | 291 | iomTransfer.pui32TxBuffer = (uint32_t *)buf_out; // todo: does this have the proper lifetime? |
282 | 292 | 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; // ? |
288 | 293 |
|
289 | 294 | // Determine direction |
290 | 295 | if ((buf_out != NULL) && (buf_in != NULL)) |
|
0 commit comments