Pulse Code Modulation (PCM) Usage Scenarios#
Pulse Code Modulation (PCM) on SiWx917 enables low-latency, synchronous digital audio for applications that require deterministic timing, simple framing, and consistent sample delivery. Typical use cases include telephony, voice pipelines, narrowband audio processing, modem-style audio streams, and communication with external codecs or digital signal processors (DSPs).
This section describes common PCM usage scenarios and provides recommended configurations for each.
Scenario 1: Voice Communication System#
This scenario shows how to configure PCM for digital telephony and related applications. It highlights the standard telephony sampling rate and full-duplex operation, which are critical for two-way voice communication.
Description#
Implement a voice communication system using PCM for digital telephony, Voice over Internet Protocol (VoIP) systems, or intercom devices.
Configuration#
Mode: Primary
Sample Rate: 8 kHz (standard telephony rate)
Bit Depth: 16-bit
Frame Size: 16-bit
Transfer Type: Full-duplex (simultaneous transmit and receive)
Use Case#
// Voice communication PCM configuration sl_i2s_xfer_config_t voice_config = { .mode = SL_I2S_MASTER, .sync = SL_I2S_SYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_16, .data_size = SL_I2S_DATA_SIZE16, .sampling_rate = SL_I2S_SAMPLING_RATE_8000, .transfer_type = SL_I2S_TRANSMIT | SL_I2S_RECEIVE }; // Initialize PCM for voice communication status = sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); status = sl_si91x_i2s_configure_power_mode(i2s_handle, SL_I2S_FULL_POWER); status = sl_si91x_i2s_configure_transfer(i2s_handle, &voice_config);
Applications#
Digital telephony systems
VoIP endpoints
Intercom devices
Two-way radio systems
Scenario 2: High-Quality Audio Recording#
This scenario focuses on capturing professional-quality audio using PCM. The configuration prioritizes fidelity through higher sample rates and bit depth.
Description#
Configure PCM for high-quality audio recording applications that require professional audio fidelity.
Configuration#
Mode: Secondary
Sample Rate: 48 kHz (professional audio standard)
Bit Depth: 24-bit
Frame Size: 24-bit
Transfer Type: Receive only
Use Case#
// High-quality audio recording PCM configuration sl_i2s_xfer_config_t recording_config = { .mode = SL_I2S_SLAVE, .sync = SL_I2S_SYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_24, .data_size = SL_I2S_DATA_SIZE32, .sampling_rate = SL_I2S_SAMPLING_RATE_48000, .transfer_type = SL_I2S_RECEIVE }; // Buffer for high-quality audio data uint32_t audio_buffer[AUDIO_BUFFER_SIZE]; // Initialize PCM for recording status = sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); status = sl_si91x_i2s_configure_transfer(i2s_handle, &recording_config); // Start audio recording status = sl_si91x_i2s_receive_data_blocking(i2s_handle, audio_buffer, AUDIO_BUFFER_SIZE);
Applications#
Professional audio recording equipment
Audio data loggers
Music production interfaces
Sound analysis systems
Scenario 3: Audio Playback System#
This scenario demonstrates how to configure PCM for high-quality audio playback. It uses CD-quality settings, which balance fidelity and efficiency for media applications.
Description#
Implement PCM for audio playback in multimedia devices or audio streaming systems.
Configuration#
Mode: Primary
Sample Rate: 44.1 kHz (CD quality)
Bit Depth: 16-bit
Frame Size: 16-bit
Transfer Type: Transmit only
Use Case#
// Audio playback PCM configuration sl_i2s_xfer_config_t playback_config = { .mode = SL_I2S_MASTER, .sync = SL_I2S_SYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_16, .data_size = SL_I2S_DATA_SIZE16, .sampling_rate = SL_I2S_SAMPLING_RATE_44100, .transfer_type = SL_I2S_TRANSMIT }; // Audio data buffer uint16_t audio_samples[PLAYBACK_BUFFER_SIZE]; // Initialize PCM for playback status = sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); status = sl_si91x_i2s_configure_transfer(i2s_handle, &playback_config); // Play audio data status = sl_si91x_i2s_send_data_blocking(i2s_handle, audio_samples, PLAYBACK_BUFFER_SIZE);
Applications#
Audio players and media devices
Sound systems and amplifiers
Notification and alert systems
Audio streaming devices
Scenario 4: Real-Time Audio Processing#
This scenario explains how to configure PCM for real-time audio processing. It emphasizes low-latency, bidirectional streaming with direct memory access (DMA).
Description#
Configure PCM for real-time audio processing applications that require minimal latency.
Configuration#
Mode: Primary
Sample Rate: 32 kHz
Bit Depth: 32-bit
Frame Size: 32-bit
Transfer Type: Full-duplex with DMA
Use Case#
// Real-time processing PCM configuration sl_i2s_xfer_config_t realtime_config = { .mode = SL_I2S_MASTER, .sync = SL_I2S_ASYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_32, .data_size = SL_I2S_DATA_SIZE32, .sampling_rate = SL_I2S_SAMPLING_RATE_32000, .transfer_type = SL_I2S_TRANSMIT | SL_I2S_RECEIVE }; // Callback for real-time processing void pcm_realtime_callback(uint32_t event) { if (event == SL_I2S_RECEIVE_COMPLETE) { // Process incoming audio data process_audio_data(rx_buffer, FRAME_SIZE); // Send processed data sl_si91x_i2s_send_data_non_blocking(i2s_handle, tx_buffer, FRAME_SIZE); } } // Initialize real-time PCM processing status = sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); status = sl_si91x_i2s_register_event_callback(i2s_handle, pcm_realtime_callback); status = sl_si91x_i2s_configure_transfer(i2s_handle, &realtime_config);
Applications#
Audio effects processors
Real-time audio filters
Echo cancellation systems
Audio conferencing systems
Scenario 5: Industrial Control Communication#
This scenario demonstrates how PCM can support reliable digital communication in industrial environments. It highlights bidirectional transfer and error handling.
Description#
Use PCM for industrial control applications that require reliable digital communication.
Configuration#
Mode: Secondary
Sample Rate: 16 kHz
Bit Depth: 16-bit
Frame Size: 16-bit
Transfer Type: Bidirectional with error handling
Use Case#
// Industrial control PCM configuration sl_i2s_xfer_config_t control_config = { .mode = SL_I2S_SLAVE, .sync = SL_I2S_SYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_16, .data_size = SL_I2S_DATA_SIZE16, .sampling_rate = SL_I2S_SAMPLING_RATE_16000, .transfer_type = SL_I2S_TRANSMIT | SL_I2S_RECEIVE }; // Error handling for industrial applications sl_status_t pcm_industrial_transfer(uint16_t *tx_data, uint16_t *rx_data, uint32_t length) { sl_status_t status; uint32_t retry_count = 0; do { status = sl_si91x_i2s_transfer_data(i2s_handle, tx_data, rx_data, length); if (status != SL_STATUS_OK) { retry_count++; // Implement error recovery sl_si91x_i2s_deinit(I2S_INSTANCE); sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); } } while ((status != SL_STATUS_OK) && (retry_count < MAX_RETRIES)); return status; }
Applications#
Industrial automation systems
Process control interfaces
Sensor data acquisition
Machine-to-machine communication
Scenario 6: Audio Codec Interface#
This scenario shows how to connect PCM with external audio codecs for analog-to-digital and digital-to-analog conversion. It focuses on high-resolution audio configurations.
Description#
Interface with external audio codecs using PCM for analog-to-digital and digital-to-analog conversion.
Configuration#
Mode: Primary
Sample Rate: 96 kHz (high-resolution audio)
Bit Depth: 24-bit
Frame Size: 32-bit (with padding)
Transfer Type: Full-duplex
Use Case#
// Audio codec interface PCM configuration sl_i2s_xfer_config_t codec_config = { .mode = SL_I2S_MASTER, .sync = SL_I2S_SYNC, .protocol = SL_PCM_PROTOCOL, .resolution = SL_I2S_RESOLUTION_24, .data_size = SL_I2S_DATA_SIZE32, .sampling_rate = SL_I2S_SAMPLING_RATE_96000, .transfer_type = SL_I2S_TRANSMIT | SL_I2S_RECEIVE }; // Codec interface functions void init_external_codec(void) { // Initialize external codec via I2C/SPI codec_set_sample_rate(96000); codec_set_bit_depth(24); codec_enable_pcm_interface(); } // PCM codec interface status = sl_si91x_i2s_init(I2S_INSTANCE, &i2s_handle); init_external_codec(); status = sl_si91x_i2s_configure_transfer(i2s_handle, &codec_config);
Applications#
High-resolution audio systems
Professional audio interfaces
Measurement and test equipment
Audio development platforms
Best Practices#
1. Buffer Management#
Allocate buffers according to sampling rate and frame size.
Use circular buffers for continuous streaming.
Monitor buffer usage to avoid underrun and overrun conditions.
2. Timing Considerations#
Use stable clock sources for consistent audio sampling.
Account for jitter and synchronization accuracy.
Use DMA for throughput efficiency and minimal latency.
3. Error Handling#
Monitor PCM driver status codes.
Implement error recovery for underrun, overrun, and timeouts.
Reinitialize PCM after power transitions.
4. Power Management#
PCM operates in the High-Performance (HP) domain only.
Optimize power states (PS4, PS3) for performance or efficiency needs.
5. Pin Configuration#
Ensure FSYNC, BCLK, and DIN/DOUT are correctly assigned.
Verify signal integrity with a logic analyzer.
Add pull-ups or pull-downs as needed for stability.
Troubleshooting Common Issues#
Frame Sync Problems#
Verify FSYNC polarity and width settings.
Check MSB and LSB transmission alignment.
Ensure consistent frame size on all devices.
Clock Issues#
Validate BCLK frequency and duty cycle.
Check clock jitter and synchronization across devices.
Confirm clock source stability.
Data Integrity#
Monitor for FIFO underruns and overruns.
Verify bit depth, sample rate, and format alignment.
Use shielded cables and solid grounding to reduce noise.