SPI SlaveDriver

Description

SPI Slave Interface driver.

Flexible SPI Slave driver implementation for use in an NCP scenario.

This driver will support both blocking and non-blocking operation, with LDMA backing the background transfers to support nonblocking.

Functions

void spislave_init (void)
void spislave_deinit (void)
int32_t spislave_sendBuffer (uint8_t *buffer, size_t length)
int32_t spislave_sendByte (uint8_t byte)
size_t spislave_getTxBytesLeft (void)
void spislave_enableTransmitter (bool enable)
void spislave_enableReceiver (bool enable)
size_t spislave_getRxAvailableBytes (void)
int32_t spislave_receiveBuffer (uint8_t *buffer, size_t requestedLength, size_t *receivedLength, bool blocking, uint32_t timeout)
int32_t spislave_receiveByte (uint8_t *byte)
void spislave_flush (bool flushTx, bool flushRx)

Function Documentation

void spislave_init ( void )

Initialize the configured USART peripheral for SPI slave operation. Also sets up GPIO settings for MOSI, MISO, SCLK and SS. After initialization, the SPI slave will have RX enabled.

Returns
BOOTLOADER_OK if succesful, error code otherwise
void spislave_deinit ( void )

Disable the configured USART peripheral for SPI operation.

int32_t spislave_sendBuffer ( uint8_t * buffer,
size_t length
)

Write a data buffer to the master next time the master starts clocking SCLK. This transfer will be non-blocking, and its progress can be tracked through spislave_getTxBytesLeft

Parameters
[in] buffer The data buffer to send
[in] length Number of bytes in the buffer to send
Returns
BOOTLOADER_OK if successful, error code otherwise
int32_t spislave_sendByte ( uint8_t byte )

Write one byte to the master in a blocking fashion.

Warning
If the master goes down, this will block forever.
Parameters
[in] byte The byte to send
Returns
BOOTLOADER_OK if succesful, error code otherwise
size_t spislave_getTxBytesLeft ( void )

Gets the amount of bytes left in the TX data buffer.

Returns
Number of bytes in the transmit buffer still needing to go out
void spislave_enableTransmitter ( bool enable )

Enable/disable MISO output

Parameters
[in] enable True to enable the transmitter, false to disable
void spislave_enableReceiver ( bool enable )

Enable/disable receiving bytes from the master into our internal buffer. The purpose of this function is to avoid filling up the buffer with 0xFF while a master is polling for new data.

Parameters
[in] enable True to enable the receiver, false to disable
size_t spislave_getRxAvailableBytes ( void )

Gets the amount of bytes ready for reading.

Returns
Number of bytes in the receive buffer available for reading with spislave_receiveBuffer
int32_t spislave_receiveBuffer ( uint8_t * buffer,
size_t requestedLength,
size_t * receivedLength,
bool blocking,
uint32_t timeout
)

Read from the RX buffer into a local buffer.

Parameters
[out] buffer The data buffer to receive into
[in] requestedLength Number of bytes we'd like to read
[out] receivedLength Number of bytes read
[in] blocking Indicate whether we should wait for requestedLength bytes to be available and read before returning, or we can read out whatever is currently in the buffer and return.
[in] timeout Number of milliseconds to wait for data in blocking mode
Returns
BOOTLOADER_OK if succesful, error code otherwise
int32_t spislave_receiveByte ( uint8_t * byte )

Get one byte from the SPI slave in a blocking fashion.

Warning
If the master never clocks in a byte, this function will block forever.
Parameters
[out] byte Pointer to where to put the received byte
Returns
BOOTLOADER_OK if succesful, error code otherwise
void spislave_flush ( bool flushTx,
bool flushRx
)

Flush one or both buffers.

Parameters
[in] flushTx Flush the transmit buffer when true
[in] flushRx Flush the receive buffer when true