Serial Synchronous Interface (SSI) Initialization and Configuration#
The SiWx917 WiSeConnect SDK provides a unified Serial Synchronous Interface (SSI) driver API.
It supports multiple configurable instances—primary (leader), secondary (follower), and ULP primary—as well as common frame formats (SPI/SSP/µWire), single/dual/quad data-line operation (where supported), and DMA-assisted transfers.
This guide describes the complete initialization and configuration flow for SSI communication on SiWx917 devices.
Initialization and Configuration#
Startup Sequence#
This section outlines the initialization procedure for both standard (single-line) and dual/quad Serial Peripheral Interface (SPI) modes.
It also explains project setup in Simplicity Studio.
Hardware and Software Requirements#
Hardware
Windows PC
Si917 Evaluation Kit: WPK (BRD4002) with one of the following radio boards: BRD4338A, BRD4342A, or BRD4343A
SiWx917 AC1 Module Explorer Kit: BRD2708A
Software
Simplicity Studio (latest version)
Serial console for runtime logging
Getting Started with Simplicity Studio#
Follow these steps to begin development with the SSI peripheral:
Install Simplicity Studio.
Download and install from the Silicon Labs website.
Connect Your Hardware.
Attach your SiWx917 development board via USB.
Launch Simplicity Studio.
Open the IDE and ensure your board is detected.


Create a New Project.
Select your target device or board.
Click Create New Project.
In the Examples view, search for SSI.


Choose a demonstration project (for example, SSI Primary, SSI Secondary, or ULP SSI Primary) from the WiSeConnect SDK.
Click Create to add the project to your workspace.
Review the included readme.md for project purpose and usage.


Build and Flash
Compile the project and flash it to your board.
Reference: For complete setup details, see the SSI Primary Example Project on GitHub.
SSI Master Example – Folder Structure#


Folder/File  | Description  | 
|---|---|
  | Auto-generated configuration files (headers, linker scripts).  | 
  | Platform-specific configuration headers.  | 
  | Documentation images and supporting resources.  | 
  | Gecko SDK platform layer and third-party libraries.  | 
  | WiSeConnect SDK components and drivers.  | 
  | Main application source and header files.  | 
  | Application entry point.  | 
  | Main project configuration file for Simplicity Studio.  | 
  | Project set file for managing multiple   | 
  | Pin Tool configuration file for SSI signal mapping.  | 
  | Documentation and example usage guide.  | 
Configuring SSI in Simplicity Studio#
The SSI component is accessible in the Simplicity Studio Project Configurator (Component Editor).
Follow the steps below to add and configure it.
Add the SSI Component#
Open your project’s
.slcpfile in Simplicity Studio.

Go to the Software Components tab.
Search for SSI or navigate to WiSeConnect 3 SDK → Device → Si91x → MCU → Peripheral.


Select the SSI component. If it’s not installed, click Install.


Follow the prompts to install and confirm the configuration.
Configure SSI Parameters#
Click Configure next to the SSI component to open the configuration UI.


Adjust parameters such as device mode, bit rate, data width, and pin assignments.


Alternatively, edit the generated configuration headers manually:
sl_si91x_ssi_primary_config.hsl_si91x_ssi_primary_common_config.h
SSI Configuration Parameters#
Parameter  | Description  | Options / Range  | 
|---|---|---|
Device Mode  | Operating role selection  | Primary, Secondary, ULP Primary  | 
Enable SSI  | Enables/disables SSI instance  | 0 (Disabled), 1 (Enabled)  | 
DMA Enable  | Enables DMA for SSI transfers  | On / Off  | 
Frame Format  | Protocol and CPOL/CPHA selection  | SPI Mode 0–3, TI SSP, Microwire  | 
Transfer Mode  | Number of data lines used  | Single (Standard), Dual, Quad  | 
Bit Rate  | Serial clock frequency (Hz)  | 500,000–40,000,000  | 
Data Width  | Number of bits per frame  | 4–16  | 
Receive Sample Delay  | Delay (in cycles) for sampling received data  | 0–63  | 
Chip Select Outputs  | Number of chip-select outputs (Primary only)  | 1–4  | 
Notes:
Match frame format and transfer mode to the connected device’s requirements.
Dual and quad modes support SPI Modes 0–3 only.
Maximum bit rates: HP SSI Primary up to 40 MHz, SSI Secondary up to 20 MHz, ULP SSI Primary up to 10 MHz.
Tune the Receive Sample Delay to optimize timing for high-speed operation.
For Quad SPI mode, define
SPI_QUAD_MODE=1in preprocessor macros.
SSI Pin Annotation#
The SSI peripheral supports multiple GPIO pin mappings, providing flexibility for hardware design.
SSI Primary – Pin Options#
Signal  | GPIO Options  | 
|---|---|
SSI_CLK  | GPIO_8, GPIO_25, GPIO_52  | 
SSI_CS0  | GPIO_9, GPIO_28, GPIO_53  | 
SSI_CS1  | GPIO_10  | 
SSI_CS2  | GPIO_15, GPIO_50  | 
SSI_CS3  | GPIO_51  | 
SSI_MOSI/DATA0  | GPIO_11, GPIO_26, GPIO_56  | 
SSI_MISO/DATA1  | GPIO_12, GPIO_27, GPIO_57  | 
SSI_DATA2  | GPIO_6, GPIO_29, GPIO_54  | 
SSI_DATA3  | GPIO_7, GPIO_30, GPIO_55  | 
SSI Secondary – Pin Options#
Signal  | GPIO Options  | 
|---|---|
SSI_CLK  | GPIO_8, GPIO_26, GPIO_47, GPIO_52  | 
SSI_CS  | GPIO_9, GPIO_25, GPIO_46, GPIO_53  | 
SSI_MISO  | GPIO_11, GPIO_28, GPIO_49, GPIO_57  | 
SSI_MOSI  | GPIO_10, GPIO_27, GPIO_48, GPIO_56  | 
ULP SSI (Low-Power) – Pin Options#
Signal  | ULP GPIO Options  | SoC GPIO Options  | 
|---|---|---|
ULP_SSI_CLK  | ULP_GPIO_0, ULP_GPIO_4, ULP_GPIO_8  | GPIO_6, GPIO_46  | 
ULP_SSI_CS0  | ULP_GPIO_7, ULP_GPIO_10  | GPIO_48  | 
ULP_SSI_CS1  | ULP_GPIO_4  | GPIO_10  | 
ULP_SSI_CS2  | ULP_GPIO_6  | GPIO_12  | 
ULP_SSI_MISO  | ULP_GPIO_2, ULP_GPIO_6, ULP_GPIO_9  | GPIO_8, GPIO_47  | 
ULP_SSI_MOSI  | ULP_GPIO_1, ULP_GPIO_5, ULP_GPIO_11  | GPIO_7, GPIO_49  | 
Notes:
Map ULP SSI to either ULP GPIOs or standard SoC GPIOs depending on power design.
The ULP SSI instance supports only single-bit SPI mode.
Avoid pin conflicts between SSI instances or other peripherals.
If Quad SPI mode is enabled, ensure DATA2 and DATA3 are configured.
SSI_DATA0 = MOSI (output with respect to Primary), DATA1 = MISO (input with respect to Primary).
Misconfigured DATA2/DATA3 pins may trigger build warnings.
For complete pin multiplexing details, refer to the SiWx917 Device Data Sheet (PDF).
Configuration Parameters#
The following structure defines user-configurable parameters for the SSI peripheral.
Populate this structure before calling (or indirectly through) the initialization and configuration APIs.
typedef struct {
    uint8_t  bit_width;             // Data frame width in bits (4–16).
    uint32_t device_mode;           // Primary / Secondary / ULP.
    uint32_t clock_mode;            // SPI mode 0–3 
    uint32_t baud_rate;             // Bit rate (Hz).
    uint32_t receive_sample_delay;  // RX sample delay (0–63 cycles).
    uint32_t transfer_mode;         // Single / Dual / Quad.
} sl_ssi_control_config_t;For detailed descriptions of sl_ssi_control_config_t and the latest parameter documentation, refer to the API reference:
API to Initialize#
The SSI peripheral initialization follows a standard sequence:
#include "sl_si91x_ssi.h"
// Configure SSI parameters
sl_ssi_control_config_t ssi_primary_config = {
    .bit_width            = 8,
    .device_mode          = SL_SSI_MASTER_ACTIVE,
    .clock_mode           = SL_SSI_PERIPHERAL_CPOL0_CPHA0,
    .baud_rate            = 1000000,      // 10 MHz
    .receive_sample_delay = 0,
    .transfer_mode        = SL_SSI_PRIMARY_TRANSFER_MODE
};
// Step 1: Initialize SSI instance
sl_ssi_handle_t ssi_handle;
sl_si91x_ssi_init(ssi_primary_config.device_mode, &ssi_handle);
// Step 2: Set slave number
sl_si91x_ssi_set_slave_number(SSI_SLAVE_0);
// Step 3: Configure SSI settings
sl_si91x_ssi_set_configuration(ssi_handle, &ssi_primary_config, SSI_SLAVE_0);
// Step 3: Register callback (optional)
sl_si91x_ssi_register_event_callback(ssi_handle, ssi_callback_function);
// Step 4: Begin data transfers
uint8_t tx_data[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
uint8_t rx_data[10] = {0};
sl_si91x_ssi_send_data(ssi_handle, tx_data, sizeof(tx_data));
sl_si91x_ssi_receive_data(ssi_handle, rx_data, sizeof(rx_data));Tip: Always verify the return values of SSI API calls (
sl_status_t) to ensure successful initialization and configuration.For non-blocking communication, register event callbacks to handle transfer completion and error events efficiently.