|
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