AHI Functions and Explanations for SPI
SPI
This section covers the implementation of AHI-compatible functions for SPI.
- This implementation is not intended to maintain full compatibility.
- Notes and considerations known at the time of writing are described here.
- Internal implementations may change without notice.
- For parameters mentioned in the explanations, only items requiring attention are described; for omitted parts, refer to the original AHI library manual.
The following pins are used for SPI operation:
Signal | Pin Name (PIO No.) | Description |
---|---|---|
SCK | SPLCLK=DIO11(PIO0) | Clock signal This pin is shared with SPICLK and DIO11 |
MOSI | DIO18(PIO2) | SPIMOSI. Output from TWELITE side, input to external SPI device. |
MISO | SPIMISO(PIO5) | SPIMISO. Input to TWELITE side, output from external SPI device. |
SEL0 | DIO19(PIO3) | |
SEL1 | DIO0(PIO16) | |
SEL2 | DIO1(PIO17) |
When using alternate pin assignments (set via vAHI_SpiSetLocation_MW(FALSE)
):
Signal | Pin Name (PIO No.) | Description |
---|---|---|
SCK | ADC1(PIO15) | Clock signal |
MOSI | DIO1(PIO17) | SPIMOSI. Output from TWELITE side, input to external SPI device. |
MISO | DIO2(PIO18) | SPIMISO. Input to TWELITE side, output from external SPI device. |
SEL0 | DIO0(PIO16) | |
SEL1 | DIO8=ADC2(PIO14) | This pin is shared with DIO8 and ADC2 |
SEL2 | DIO12(PIO13) |
SPI operates using hardware functionality, so there may be some differences in pin behavior (especially the HIGH/LOW state when no transfer is occurring).
- The implementation uses blocking transfers. To maintain code compatibility, ensure to include polling wait code immediately after transfer API calls (
bAHI_SpiPollBusy()
,vAHI_SpiWaitBusy()
).
vAHI_SpiConfigure()
void vAHI_SpiConfigure(
uint8 u8SlaveEnable,
bool_t bLsbFirst,
bool_t bPolarity,
bool_t bPhase,
uint8 u8ClockDivider,
bool_t bInterruptEnable,
bool_t bAutoSlaveSelect);
Initializes the SPI.
bInterruptEnable
is not supported; this parameter is ignored.
vAHI_SpiDisable()
void vAHI_SpiDisable(void);
Stops the use of SPI.
vAHI_SpiSelect()
void vAHI_SpiSelect(
uint8 u8SlaveMask)
Selects the SPI SELECT pin.
- If
bAutoSlaveSelect
invAHI_SpiConfigure()
is set to TRUE, specifies the pin to control but does not control it at the time of this call. - If
bAutoSlaveSelect
invAHI_SpiConfigure()
is set to FALSE, controls the SELECT pin (sets the target pin LOW, all others HIGH).
vAHI_SpiStop()
PUBLIC void vAHI_SpiStop(void);
Deselects the SELECT pin.
Performs the same operation as vAHI_SpiSelect(0)
.
vAHI_SpiStartTransfer()
void vAHI_SpiStartTransfer(
uint8 u8CharLen,
uint32 u32Out);
void vAHI_SpiStartTransfer32(uint32 u32Out);
void vAHI_SpiStartTransfer16(uint16 u16Out);
void vAHI_SpiStartTransfer8(uint8 u8Out);
Executes an SPI transfer.
- This process runs in blocking mode.
- If the bit length is not a multiple of 8, the transfer will be split into 2–3 parts.
- When specifying 32-bit transfers, regardless of the memory byte order (endianness), data is sent from the most significant byte to the least significant byte.
As a result, the transfer waveform will be identical on both BLUE and GOLD.
AHI_SpiReadTransfer()
static inline uint32 u32AHI_SpiReadTransfer32(void);
static inline uint16 u16AHI_SpiReadTransfer16(void);
static inline uint8 u8AHI_SpiReadTransfer8(void);
Call this after the transfer completes to return the read value.
bAHI_SpiPollBusy()
bool_t bAHI_SpiPollBusy(void);
inline void vAHI_SpiWaitBusy(void) { while(bAHI_SpiPollBusy()); }
Always returns FALSE because the transfer API performs blocking transfers.
bAHI_SpiTransferBlocking_MW()
bool_t bAHI_SpiTransferBlocking_MW(
uint8 *au8tx,
uint8 *au8rx,
uint8 u8len);
Performs byte-level SPI transfers.au8tx
is the transmit data array, au8rx
is the receive data array, and u8len
is the number of bytes to transfer.
- Data is transferred sequentially from the beginning of the array.
To transfer from LSB first, store the LSB-side bytes first in the array. The same applies to the received data.
vAHI_SpiWaitBusy()
void vAHI_SpiWaitBusy(void);
Returns immediately.
vAHI_SpiSetLocation_MW()
void vAHI_SpiSetLocation_MW(bool_t bLocation);
Changes the pin assignment configuration.
If using the default pin assignments, calling this function is unnecessary.
If using the alternate pins, call this function before invoking vAHI_SpiConfigure()
.
bLocation == FALSE
(default) → Uses the default pin assignments.bLocation == TRUE
→ Uses the alternate pin assignments.
Others
Transfer Splitting
When performing transfers with vAHI_SpiStartTransfer()
that are not a multiple of 8 bits (e.g., 8, 16, 24, 32 bits),
the transfer is internally split into two parts.
As a result, the waveform will be held for a certain period between the first and second transfers.
Behavior on Wake from Sleep
If the SPI bus was initialized before entering RAM-retention sleep, the initialization state will be restored upon wake-up. For RAM-off sleep, normal DIO initialization will be performed at startup.
To improve code compatibility with BLUE/RED, explicitly call vAHI_SpiDisable()
before sleep.