🛠 Lecture audio sur le codec CS43L22 : I2S, classe D et les limitations du BSP
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
- Control: I2C1, dirección de dispositivo 0x94, pin de reset PD4; el BSP verifica la presencia del códec leyendo
CS43L22_ID. - Flujo de audio: el I2S envía muestras de 16 bits estéreo al CS43L22; la reproducción (playback) en el BSP CubeF4 utiliza I2S3, mientras que la captura del micrófono PDM utiliza I2S2.
- Ejemplos oficiales:
Projects/STM32F4-Discovery/en STM32CubeF4 (demos de audio play/record).
Las limitaciones del BSP (fuente: sección Known Limitations)
- Solo estéreo de 16 bits: un archivo mono debe duplicarse en ambos canales.
- 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.
- 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.
- El volumen y el silencio (mute) se gestionan mediante registros del códec (
BSP_AUDIO_OUT_SetVolume,..._SetMute), no por el MCU. - 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
- Abra la demo de audio de CubeF4 (
Projects/STM32F4-Discovery/) como referencia de cableado I2S. - 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). - Alimente el buffer en modo circular mediante DMA y recárguelo en la callback de transferencia a medio llenar (
HalfTransfer) para un flujo continuo. - 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
- Reproducir audio mono sin duplicarlo: el BSP solo acepta estéreo de 16 bits (limitaciones 4 y 5 del BSP).
- Realizar llamadas
BSP_AUDIO_OUT_*dentro de una ISR larga: el BSP advierte que el I2C del códec puede corromperse por las interrupciones del usuario. - Confundir el micrófono MP45DT02 (PDM, captura en I2S2) con el códec de reproducción: son dos periféricos distintos, con dos inicializaciones distintas.
- Usar PC7 (MCLK del códec) como pin libre: está ocupado por el reloj de audio mientras el códec está activo.
Otros tutoriales para esta placa
- Premier téléversement sur la STM32F4DISCOVERY avec l'Arduino STM32duino
- Zephyr RTOS sur la STM32F4DISCOVERY : west build et west flash
- MicroPython sur la STM32F4DISCOVERY : REPL interactif et pilotage des LED
- STM32Cube HAL et BSP officiel : LED, bouton et accéléromètre avec détection automatique
- USB OTG FS sur le port micro-AB : se faire passer pour un périphérique classe CDC
- Acquérir le micro PDM MP45DT02 : I2S2, filtre PDM-vers-PCM et contraintes de sortie