Generic SPI#
Introduction#
The Generic SPI Master is available in MCU HP peripherals. It provides an I/O interface for a large range of SPI-compatible peripheral devices. SPI is a synchronous four-wire interface made up of two data pins (MOSI and MISO), a device select pin (CSN), and a gated clock pin (SCLK). With two data pins, it supports full-duplex operation with other SPI-compatible devices.
Typical SPI-compatible peripheral devices that can be used to interface include: LCD displays, A/D converters, D/A converters, Codecs, Micro-controllers and Flashes.
GSPI (General Serial Peripheral Interface) can be used in various applications within embedded systems where high-speed, synchronous serial communication is required. Here are some common areas where GSPI can be employed in embedded systems:
Test and Measurement Equipment
Sensor Interfacing
Display Interfaces
Memory Devices
Communication Interfaces
Motor Control
Audio Processing
Wireless Communication
Configuration#
Configuring GSPI (General Serial Peripheral Interface) in a micro-controller involves several steps, including setting up the peripheral registers, configuring GPIO pins, and selecting the appropriate operating mode and settings.
To configure the GSPI operating mode, modify clock_mode_typedef_t (Mode-0 and Mode-3 can be configured), Bit Rate (Range 1 - 40000000), Data Width (Range 1- 15), and configure the GSPI slave select mode by configuring slave_select_mode_typedef_t. All of these must be configured in the structure sl_gspi_control_config_t and call the API sl_si91x_gspi_set_configuration().
For more information on configuring available parameters refer to the respective peripheral example readme document.
Usage#
The common GSPI functions can be used after the GSPI Structures are specified, passing an instance of sl_gspi_control_config_t. These functions will initiate and configure the GSPI below, which is the flow for implementation.
Modules#
Enumerations#
Enumeration for different GSPI callback events.
Enumeration for GSPI power state.
Enumeration for GSPI clock modes.
Enumeration for GSPI master modes.
Enumeration for GSPI secondary select mode.
Enumeration for GSPI Master instance, enum for one member, future provision is provided.
Enumeration for GSPI secondary numbers.
Typedefs#
Renamed signal event structure.
Renamed status structure.
Renamed GSPI driver structure.
Created GSPI handle type.
Variables#
true to enable and false to disable swap read
true to enable and false to disable swap write
Bit width either 8 bit or 16 bit.
Mode 0 or Mode 3 of GSPI.
Secondary select mode either software of hardware output.
Bitrate for setting the clock division factor.
SoC PLL count value.
Int PLL control value.
Intf PLL clock frequency.
Intf PLL reference clock frequency.
SoC PLL clock frequency.
SoC PLL reference clock frequency.
Clock Division Factor.
Release version number.
sqa version number
dev version number
Functions#
This API will configure the clock for GSPI module.
This API will initializes the GSPI.
This API will Uninitialize the GSPI.
This API will be used to configure the GSPI module.
This API will receives data from the secondary device.
This API will Send data to the secondary device.
This API will Send and receive data to the secondary device simultaneously.
This API will set the master state as active or de-active.
This API will Register the user callback function.
This API will Un-register the user callback function.
This API will Gets the GSPI version.
This API will Get the transfer status GSPI.
This API will Get data receive count of the GSPI.
This API will Get the transmit data count of GSPI.
This API will fetch the clock division factor.
This API will Fetch the frame length, i.e., bit width.
This API will Set the secondary number in multi-secondary operation.
Enumeration Documentation#
gspi_event_typedef_t#
gspi_event_typedef_t
Enumeration for different GSPI callback events.
Enumerator | |
---|---|
SL_GSPI_TRANSFER_COMPLETE | Transfer complete event. |
SL_GSPI_DATA_LOST | Data lost event. |
SL_GSPI_MODE_FAULT | Mode fault event. |
sl_gspi_power_state_t#
sl_gspi_power_state_t
Enumeration for GSPI power state.
Enumerator | |
---|---|
SL_GSPI_POWER_OFF | Power mode OFF. |
SL_GSPI_LOW_POWER | Low power mode. |
SL_GSPI_FULL_POWER | Full power mode. |
SL_GSPI_POWER_MODE_LAST | Last member of enum for validation. |
clock_mode_typedef_t#
clock_mode_typedef_t
Enumeration for GSPI clock modes.
Enumerator | |
---|---|
SL_GSPI_MODE_0 | Mode 0 CPOL0_CPHA0. |
SL_GSPI_MODE_3 | Mode 1 CPOL1_CPHA1. |
master_mode_typedef_t#
master_mode_typedef_t
Enumeration for GSPI master modes.
Enumerator | |
---|---|
SL_GSPI_MASTER_INACTIVE | Master mode inactive. |
SL_GSPI_MASTER_ACTIVE | Master mode active. |
SL_GSPI_MASTER_MODE_LAST | Last member of enum for validation. |
slave_select_mode_typedef_t#
slave_select_mode_typedef_t
Enumeration for GSPI secondary select mode.
Enumerator | |
---|---|
SL_GSPI_MASTER_UNUSED | Master unused mode. |
SL_GSPI_MASTER_SW | Master software mode. |
SL_GSPI_MASTER_HW_OUTPUT | Master hardware output mode. |
SL_GSPI_SLAVE_SELECT_MODE_LAST | Last member of enum for validation. |
sl_gspi_instance_t#
sl_gspi_instance_t
Enumeration for GSPI Master instance, enum for one member, future provision is provided.
Enumerator | |
---|---|
SL_GSPI_MASTER | GSPI Master Instance. |
SL_GSPI_INSTANCE_LAST_ENUM | Last member of enum for validation. |
sl_gspi_slave_number_t#
sl_gspi_slave_number_t
Enumeration for GSPI secondary numbers.
Enumerator | |
---|---|
GSPI_SLAVE_0 | Slave No. 1. |
GSPI_SLAVE_1 | Slave No. 2. |
GSPI_SLAVE_2 | Slave No. 2. |
GSPI_SLAVE_LAST_ENUM | Last member of enum for validation. |
Typedef Documentation#
sl_gspi_signal_event_t#
typedef ARM_SPI_SignalEvent_t sl_gspi_signal_event_t
Renamed signal event structure.
Variable Documentation#
swap_read#
boolean_t sl_gspi_control_config_t::swap_read
true to enable and false to disable swap read
swap_write#
boolean_t sl_gspi_control_config_t::swap_write
true to enable and false to disable swap write
slave_select_mode#
uint32_t sl_gspi_control_config_t::slave_select_mode
Secondary select mode either software of hardware output.
intf_pll_500_control_value#
uint16_t sl_gspi_clock_config_t::intf_pll_500_control_value
Int PLL control value.
intf_pll_reference_clock#
uint32_t sl_gspi_clock_config_t::intf_pll_reference_clock
Intf PLL reference clock frequency.
soc_pll_reference_clock#
uint32_t sl_gspi_clock_config_t::soc_pll_reference_clock
SoC PLL reference clock frequency.
Function Documentation#
sl_si91x_gspi_configure_clock#
sl_status_t sl_si91x_gspi_configure_clock (sl_gspi_clock_config_t * clock_configuration)
This API will configure the clock for GSPI module.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_clock_config_t * | N/A | clock_configuration | Pointer to the clock configuration structure sl_gspi_clock_config_t |
Set the clock for the GSPI peripheral, Configures the PLL clock and SOC clock with the value set by the user in the clock configuration structure. Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_FAIL (0x0001) - The function has failed
SL_STATUS_NOT_INITIALIZED (0x0011) - Clock is not initialized
sl_si91x_gspi_init#
sl_status_t sl_si91x_gspi_init (sl_gspi_instance_t instance, sl_gspi_handle_t * gspi_handle)
This API will initializes the GSPI.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_instance_t | [in] | instance | GSPI Instance. sl_gspi_instance_t |
sl_gspi_handle_t * | [in] | gspi_handle | Double Pointer to the GSPI driver handle sl_gspi_handle_t |
as partof GSPI initialization if the DMA is enabled, it also initializes the DMA module. Passing the address of the pointer for storing the GSPI master handle, which can be used in the future for other function calls.
Pre-condition:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_BUSY (0x0004) - Driver is busy
sl_si91x_gspi_deinit#
sl_status_t sl_si91x_gspi_deinit (sl_gspi_handle_t gspi_handle)
This API will Uninitialize the GSPI.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle sl_gspi_handle_t |
This will Uninitialize the GSPI and if the DMA is enabled, it also uninitializes the DMA module.
Pre-condition:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
Note
When the GSPI module is used in combination with other peripherals, while de-initializing in the application, refer to the notes below:
Whenever sl_si91x_gspi_deinit() gets called, it will power down the domain (PERI_EFUSE) which contains different peripherals mentioned below: USART, UART, I2C, SSI Master, SSI Slave, Generic-SPI Master, I2S Master, I2S Slave, Micro-DMA Controller, Config Timer, Random-Number Generator, CRC Accelerator, SIO, QEI, MCPWM and EFUSE. Since deinit power downs the PERI_EFUSE doamin, it's recommended to call the sl_si91x_gspi_deinit() API at the end of the application.
Few peripherlas (ULP Peripherals, UULP Peripherals, GPDMA and SDIO-SPI) have seperate domains that can be powered down indepedently. For additional details, refer to the Power architecture section in the Hardware Reference Manual e.g., To power down ULP UART, use the API below: RSI_PS_M4ssPeriPowerDown(ULPSS_PWRGATE_ULP_UART); Here, ULP_UART has seperate power domain ULPSS_PWRGATE_ULP_UART, which can be power down indepedently. Refer to the rsi_power_save.h file for all power gates definitions.
sl_si91x_gspi_set_configuration#
sl_status_t sl_si91x_gspi_set_configuration (sl_gspi_handle_t gspi_handle, sl_gspi_control_config_t * control_configuration)
This API will be used to configure the GSPI module.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle sl_gspi_handle_t |
sl_gspi_control_config_t * | [in] | control_configuration | pointer to the configuration structure sl_gspi_control_config_t |
The GSPI control and configuration options are listed below:
The configurations are listed below:
swap_read (enable/disable)
swap_write (enable/disable)
bit_width (8_bit/16_bit)
clock_mode (mode0/mode3)
slave_select_mode (hw_output/sw)
bitrate
Pre-conditions:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_FAIL (0x0001) - The function has failed
SL_STATUS_NOT_SUPPORTED (0x000F) - Parameter is not supported
SL_STATUS_BUSY (0x0004) - Driver is busy
SL_STATUS_INVALID_MODE (0x0024) - Secondary select Mode is invalid
SL_STATUS_INVALID_TYPE (0x0026) - SPI frame format is not valid
SL_STATUS_INVALID_RANGE (0x0028) - Data bits (frame length) are not in range
sl_si91x_gspi_receive_data#
sl_status_t sl_si91x_gspi_receive_data (sl_gspi_handle_t gspi_handle, void * data, uint32_t data_length)
This API will receives data from the secondary device.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle sl_gspi_handle_t |
void * | [in] | data | pointer to the variable that will store the received data |
uint32_t | [in] | data_length | (uint32_t) number of data items to receive |
If DMA is enabled, it configures the DMA channel and required parameters. When the received data is equal to data_length passed in this function, a callback event is generated which can be registered using sl_si91x_gspi_register_event_callback
Pre-conditions:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_FAIL (0x0001) - The function has failed
SL_STATUS_BUSY (0x0004) - Driver is busy
sl_si91x_gspi_send_data#
sl_status_t sl_si91x_gspi_send_data (sl_gspi_handle_t gspi_handle, const void * data, uint32_t data_length)
This API will Send data to the secondary device.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
const void * | [in] | data | const pointer to the variable that has data which needs to be sent |
uint32_t | [in] | data_length | (uint32_t) number of data items to send |
If DMA is enabled, it configures the DMA channel and required parameters. When the send data is equal to data_length passed in this function, a callback event is generated which can be registered using sl_si91x_gspi_register_event_callback
Pre-conditions:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_FAIL (0x0001) - The function has failed
SL_STATUS_BUSY (0x0004) - Driver is busy
sl_si91x_gspi_transfer_data#
sl_status_t sl_si91x_gspi_transfer_data (sl_gspi_handle_t gspi_handle, const void * data_out, void * data_in, uint32_t data_length)
This API will Send and receive data to the secondary device simultaneously.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
const void * | [in] | data_out | const pointer to the variable that has data which needs to be sent |
void * | [in] | data_in | pointer to the variable that will store the received data |
uint32_t | [in] | data_length | (uint32_t) number of data items to receive |
If DMA is enabled, it configures the DMA channel and required parameters. When the received data and send data is equal to data_length passed in this function, a callback event is generated which can be registered using sl_si91x_gspi_register_event_callback.
Pre-conditions:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_INVALID_PARAMETER (0x0021) - Parameters are invalid
SL_STATUS_FAIL (0x0001) - The function has failed
SL_STATUS_BUSY (0x0004) - Driver is busy
sl_si91x_gspi_set_master_state#
sl_status_t sl_si91x_gspi_set_master_state (sl_gspi_handle_t gspi_handle, boolean_t value)
This API will set the master state as active or de-active.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
boolean_t | [in] | value | (boolean_t) Enable or Disable |
Set the main state, i.e., activate/de-activate. If the master is not required in the application for a specific time, it can be turned on/off in runtime by using this API.
Pre-conditions:
Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_BUSY (0x0004) - Driver is busy
SL_STATUS_INVALID_MODE (0x0024) - Mode is invalid (Fails to activate master)
sl_si91x_gspi_register_event_callback#
sl_status_t sl_si91x_gspi_register_event_callback (sl_gspi_handle_t gspi_handle, sl_gspi_signal_event_t callback_event)
This API will Register the user callback function.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
sl_gspi_signal_event_t | [in] | callback_event | Pointer to the function that needs to be called at the time of interrupt ( sl_gspi_signal_event_t) |
At the time of events, the function passed in the parameter is called with the respective event as the parameter. Before calling this function again, it is mandatory to call the sl_si91x_gspi_unregister_event_callback function to unregister the callback, otherwise it returns SL_STATUS_BUSY error code. Returns
status
SL_STATUS_OK (0x0000) - Success
SL_STATUS_NULL_POINTER (0x0022) - The parameter is a null pointer
SL_STATUS_BUSY (0x0004) - Driver is busy
sl_si91x_gspi_unregister_event_callback#
void sl_si91x_gspi_unregister_event_callback (void )
This API will Un-register the user callback function.
Type | Direction | Argument Name | Description |
---|---|---|---|
void | [in] |
Note
It is mandatory to call this function before registering the callback again.
Pre-condition:
Returns
none
sl_si91x_gspi_get_version#
sl_gspi_version_t sl_si91x_gspi_get_version (void )
This API will Gets the GSPI version.
Type | Direction | Argument Name | Description |
---|---|---|---|
void | [in] |
This will read the current API vesion of GSPI and It returns same. Returns
sl_gspi_version_t type structure
sl_si91x_gspi_get_status#
sl_gspi_status_t sl_si91x_gspi_get_status (sl_gspi_handle_t gspi_handle)
This API will Get the transfer status GSPI.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
It returns the sl_gspi_status_t type structure. The members are:
Busy
Data Lost
Mode Fault It is used to poll the busy status of GSPI Master.
Returns
sl_gspi_status_t type structure
sl_si91x_gspi_get_rx_data_count#
uint32_t sl_si91x_gspi_get_rx_data_count (sl_gspi_handle_t gspi_handle)
This API will Get data receive count of the GSPI.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
If a receive operation is started, this function can be used to get number of data bytes received.
Returns
uint32_t value of the RX data count
sl_si91x_gspi_get_tx_data_count#
uint32_t sl_si91x_gspi_get_tx_data_count (void )
This API will Get the transmit data count of GSPI.
Type | Direction | Argument Name | Description |
---|---|---|---|
void | [in] | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
If a send operation is started, this function can be used to get number of data bytes sent.
Returns
uint32_t value of the tx data count
sl_si91x_gspi_get_clock_division_factor#
int32_t sl_si91x_gspi_get_clock_division_factor (sl_gspi_handle_t gspi_handle)
This API will fetch the clock division factor.
Type | Direction | Argument Name | Description |
---|---|---|---|
sl_gspi_handle_t | [in] | gspi_handle | Pointer to the GSPI driver handle ( sl_gspi_handle_t) |
The clock division factor is calculated on the based of peripheral clock configured. It decides the baud rate of GSPI. Returns
factor (int32_t) The value of the clock division factor
sl_si91x_gspi_get_frame_length#
uint32_t sl_si91x_gspi_get_frame_length (void )
This API will Fetch the frame length, i.e., bit width.
Type | Direction | Argument Name | Description |
---|---|---|---|
void | [in] |
This will get the frame length and the frame length ranges between 1 and 15.
Returns
frame_length (uint32_t) The value of the frame length
sl_si91x_gspi_set_slave_number#
__STATIC_INLINE sl_status_t sl_si91x_gspi_set_slave_number (uint8_t number)
This API will Set the secondary number in multi-secondary operation.
Type | Direction | Argument Name | Description |
---|---|---|---|
uint8_t | [in] | number | Secondary number ( sl_gspi_slave_number_t) |
For a single secondary also, this API needs to be called before transferring the data.
Returns
none