WM8731 Codec
Nim wrapper for the Cirrus Logic (Wolfson) WM8731 audio codec.
The WM8731 is an I2C-controlled codec used on Daisy Seed 1.1 and provides more configuration options than the basic AK4556.
Features:
- 24-bit stereo ADC and DAC
- I2C control interface
- Configurable audio format (I2S, LJ, RJ, DSP)
- Configurable word length (16/20/24/32-bit)
- Volume control and mute
- 48kHz sample rate (other rates not yet supported)
Example:
import nimphea/src/nimphea import nimphea/src/dev/codec_wm8731 import nimphea/src/per/i2c var i2c: I2CHandle var codecCfg: Wm8731Config var codec: Wm8731 codecCfg.defaults() # MCU is master, 24-bit, MSB LJ let result = codec.init(codecCfg, i2c) if result == Wm8731Result.OK: echo "Codec initialized successfully"
Types
Wm8731 {.importcpp: "daisy::Wm8731".} = object
-
WM8731 codec driver
I2C-controlled audio codec with configurable format and word length. Used on Daisy Seed 1.1 and other platforms requiring advanced codec features.
Source Edit Wm8731Config {.importcpp: "daisy::Wm8731::Config".} = object mcu_is_master*: bool ## Set true for MCU master mode lr_swap*: bool ## Set true to swap left/right channels csb_pin_state*: bool ## CSB pin state (determines I2C address) fmt*: Wm8731Format ## Communication format wl*: Wm8731WordLength ## Word length
-
Configuration struct for WM8731 initialization
For now, only 48kHz is supported. USB Mode is not yet supported.
Source Edit Wm8731Format {.importcpp: "daisy::Wm8731::Config::Format", size: 4.} = enum MSB_FIRST_RJ = 0, ## MSB first, right-justified MSB_FIRST_LJ = 1, ## MSB first, left-justified (default) I2S = 2, ## I2S format DSP = 3 ## DSP format
- Communication format options Source Edit
Wm8731Result {.importcpp: "daisy::Wm8731::Result", size: 4.} = enum OK, ## Operation successful ERR ## Operation failed
- Return values for WM8731 functions Source Edit
Wm8731WordLength {.importcpp: "daisy::Wm8731::Config::WordLength", size: 4.} = enum BITS_16 = 0, ## 16-bit samples BITS_20 = 4, ## 20-bit samples BITS_24 = 8, ## 24-bit samples (default) BITS_32 = 12 ## 32-bit samples
- Sample word length in bits This is for communication only; the device processes audio at 24-bits Source Edit
Procs
proc defaults(this: var Wm8731Config) {.importcpp: "#.Defaults()", ...raises: [], tags: [], forbids: [].}
-
Set default configuration values
Sets the following:
- MCU is master = true
- L/R swap = false
- CSB pin state = false
- Format = MSB First LJ
- Word length = 24-bit
Example:
var cfg: Wm8731Config cfg.defaults() # Optionally override specific settings cfg.fmt = Wm8731Format.I2S
Source Edit proc init(this: var Wm8731; config: Wm8731Config; i2c: I2CHandle): Wm8731Result {. importcpp: "#.Init(#, #)", ...raises: [], tags: [], forbids: [].}
-
Initialize the WM8731 codec
Parameters:
- config - Configuration struct (use defaults() for typical setup)
- i2c - Initialized I2C handle for communication
Returns: Wm8731Result.OK on success, Wm8731Result.ERR on failure
Example:
var i2c: I2CHandle var cfg: Wm8731Config var codec: Wm8731 # Initialize I2C first # ... i2c setup ... cfg.defaults() let result = codec.init(cfg, i2c) if result != Wm8731Result.OK: echo "Codec init failed"
Source Edit