🛠 Lecture audio sur le codec CS43L22 : I2S, classe D et les limitations du BSP

STM32F4DISCOVERY (kit Discovery STM32F407VGT6) · intermediaire · Schéma : chaîne audio de la STM32F4DISCOVERY — MCU STM32F407 sortant en I2S3 vers le codec CS43L22 (DAC + ampli classe D), piloté en I2C1 (adresse 0x94, reset PD4), avec sortie casque et connecteur haut-parleur ; encart sur les limitations : stéréo 16 bits uniquement, bruit sous 48 kHz.

Objetivo

La STM32F4DISCOVERY fue vendida por ST como la placa « para desarrollar aplicaciones de audio fácilmente ». El equipamiento es real: un códec CS43L22 (DAC estéreo + amplificador clase D para altavoz), una toma de auriculares, un conector de altavoz y un micrófono digital — todo ello controlado por el STM32F407VGT6. Este tutorial reproduce un sonido mediante el BSP CubeF4 y, sobre todo, sus limitaciones documentadas, que explican el 90 % de las decepciones.

Arquitectura de hardware

Las limitaciones del BSP (fuente: sección Known Limitations)

  1. Solo estéreo de 16 bits: un archivo mono debe duplicarse en ambos canales.
  2. Ruido a baja frecuencia de muestreo: los archivos de mala calidad producen un « nivel de ruido alto e incómodo » en el altavoz clase D — aumente la frecuencia a más de 48 kHz.
  3. Posible corrupción I2C: la comunicación con el CS43L22 puede corromperse si se interrumpe por rutinas de interrupción del usuario — mantenga las ISR cortas o enmascare las interrupciones alrededor de los accesos al códec.
  4. El volumen y el silencio (mute) se gestionan mediante registros del códec (BSP_AUDIO_OUT_SetVolume, ..._SetMute), no por el MCU.
  5. La inicialización falla si el ID leído en I2C1 no coincide: verifique el reset PD4 antes de compilar.

Esqueleto de código

#include "stm32f4_discovery.h"
#include "stm32f4_discovery_audio.h"

/* Buffer stereo 16 bits, 48 kHz mini pour eviter le bruit classe D */
static int16_t audioBuffer[2 * 480];   /* 10 ms de sine 440 Hz */

int main(void)
{
  HAL_Init;
  SystemClock_Config;               /* 168 MHz */

  /* Init codec : I2C1 addr 0x94, reset PD4, verif CS43L22_ID */
  BSP_AUDIO_OUT_Init(AUDIO_FREQUENCY_48K, 70);  /* volume 70 */
  BSP_AUDIO_OUT_SetAudioFrameFilter(CODEC);

  FillSine(audioBuffer, 480, 440, 48000);       /* a ecrire : stereo 16b */
  BSP_AUDIO_OUT_Play((uint16_t *)audioBuffer,
                     sizeof(audioBuffer));       /* DMA I2S circulaire */

  while (BSP_AUDIO_OUT_Playing) { }           /* attente fin */
  BSP_AUDIO_OUT_Stop(CODEC_DURING);
}

Procedimiento

  1. Abra la demo de audio de CubeF4 (Projects/STM32F4-Discovery/) como referencia de cableado I2S.
  2. Prepare sus muestras en estéreo de 16 bits, ≥ 48 kHz — conviértalas con ffmpeg si es necesario (-ac 2 -ar 48000 -sample_fmt s16).
  3. Alimente el buffer en modo circular mediante DMA y recárguelo en la callback de transferencia a medio llenar (HalfTransfer) para un flujo continuo.
  4. Ajuste el volumen con BSP_AUDIO_OUT_SetVolume; la salida de auriculares y el conector de altavoz comparten el mismo DAC.

Verificación esperada

Un tono limpio de 440 Hz sale del altavoz (o de los auriculares). Si escucha un silbido desagradable, su frecuencia de muestreo es demasiado baja — es la limitación n.º 2, no un defecto de hardware. Si el códec no se inicializa (CS43L22_ID inválido), verifique la línea de reset PD4 y la dirección 0x94 en I2C1 con un analizador lógico.

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales