🛠 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.

Objectif

La STM32F4DISCOVERY a été vendue par ST comme la carte « pour développer des applications audio facilement ». L'équipement est réel : un codec CS43L22 (DAC stéréo + amplificateur classe D pour haut-parleur), une prise casque, un connecteur haut-parleur, et un micro numérique — le tout piloté par le STM32F407VGT6. Ce tutoriel joue un son via le BSP CubeF4 et surtout ses limitations documentées, qui expliquent 90 % des déceptions.

Architecture matérielle

Les limitations du BSP (source : section Known Limitations)

  1. Stéréo 16 bits uniquement : un fichier mono doit être dupliqué sur les deux canaux.
  2. Bruit à faible fréquence d'échantillonnage : les fichiers de mauvaise qualité produisent un « niveau de bruit élevé et inconfortable » sur le haut-parleur classe D — remontez à plus de 48 kHz.
  3. Corruption I2C possible : la communication avec le CS43L22 peut être corrompue si elle est interrompue par des routines d'interruption utilisateur — gardez les ISR courtes ou masquez les interruptions autour des accès codec.
  4. Le volume et la mute passent par des registres du codec (BSP_AUDIO_OUT_SetVolume, ..._SetMute), pas par le MCU.
  5. L'initialisation échoue si l'ID lu sur I2C1 ne correspond pas : vérifiez le reset PD4 avant de compiler.

Squelette de code

#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 écrire : 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);
}

Démarche

  1. Ouvrez la démo audio de CubeF4 (Projects/STM32F4-Discovery/) comme référence de brochage I2S.
  2. Préparez vos échantillons en stéréo 16 bits, ≥ 48 kHz — convertissez avec ffmpeg si besoin (-ac 2 -ar 48000 -sample_fmt s16).
  3. Alimentez le buffer en circulaire via DMA et rechargez-le dans la callback de transfert à moitié plein (HalfTransfer) pour un flux continu.
  4. Réglez le volume avec BSP_AUDIO_OUT_SetVolume ; la sortie casque et le connecteur haut-parleur partagent le même DAC.

Vérification attendue

Un 440 Hz propre sort du haut-parleur (ou du casque). Si vous entendez un sifflement désagréable, votre fréquence d'échantillonnage est trop basse — c'est la limitation n°2, pas un défaut matériel. Si le codec n'initialise pas (CS43L22_ID invalide), vérifiez la ligne reset PD4 et l'adresse 0x94 sur I2C1 avec un analyseur logique.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels