nimphea/dev/codec_wm8731

Source   Edit  

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