Présentation du Système
Schéma d’Ensemble
|
|
REMARQUE : Le clavier maître utilisé est un swissonic easykey25.
Documents
- STM32F746 Reference Manual
- Discovery F746 User Manual
- stm32f745ie Datasheet
- Discovery F746 Schematics
- Codec WM8994.pdf
Workflow I2S
Les conversion Analogique-Numérique et Numérique-Analogique sont réalisées par
un codec audio WM8994.
Le dialogue entre ce codec audio et le microcontrôleur STM32F746 se fait via une liaison I2S
La liaison I2S
La liaison I2S est une liaison SPI pour les applications audio.
En plus du signal d’horloge ( la liaison SPI étant une liaison synchrone ) ,
des 2 fils pour les données ( MOSI et MISO ), la liaison I2S comporte un signal FS ( Start of Frame ) permettant de distinguer les signaux pour la voie gauche et la voie droite.
Ce signal FS a une fréquence correspondant à la fréquence d’échantillonnage.
Le périphérique utilisé côté microcontôleur est le SAI ( Serial Audio Interface ).
Ce périphérique peut gérer d’autres formats de trames que l’I2S.
Le codec WM8994 peut fonctionner en mode TDM ( Time Division Multiplexer ) Il est donc possible de convertir en numérique des échantillons depuis :
- l’entrée ligne audio ( SLOT0 et SLOT2 pour voie gauche et voie droite )
- le micro sur la carte discovery ( SLOT1 et SLOT3 )
et de convertir des échantillons en tension analogiques à destination de :
- la sortie ligne audio ( SLOT0 et SLOT2 pour voie gauche et voie droite )
- hauts parleurs ( SLOT1 et SLOT3)
Pour notre application, nous traiterons des signaux depuis l’entrée ligne, et vers la sortie ligne.
Seuls SLOT0 et SLOT2 seront utilisés.
Contraintes temporelles
Le schéma ci dessous fait apparaitre que tout calcul sur les échantillons doit se faire
en un temps inférieur à la période d’acquisition des échantillons ( période d’échantillonage Te ).
Pour Fe=44100Hz –> Te=22.68 us.
Programme BYPASS
Algorithme
rx_sample_L et rx_sample_R sont des variables globales mises à jour toutes les périodes Te dans l’interruption SAI_Receive_IT16Bit du périphériphérique SAI.
Elles correspondent aux données converties par l’ADC du codec.
tx_sample_L et tx_sample_R correspondent aux variables à convertir par le DAC du codec.
Ces variables sont des valeurs entières sur 16 bits.
void BSP_AUDIO_SAI_Interrupt_CallBack()
{
int16_t x_L = 0;
int16_t x_R = 0;
int16_t y_L = 0;
int16_t y_R = 0;
BSP_LED_On(LED1);
x_L = rx_sample_L;
x_R = rx_sample_R;
// SIGNAL PROCESSING ALGORITHM
y_L = x_L;
y_R = x_R;
tx_sample_L = (int16_t)y_L ;
tx_sample_R = (int16_t)y_R;
BSP_LED_Off(LED1);
return;
}
PROJET SOURCE
WORKSPACE_STM32F746DISCO_STM32CUBE.zip
REMARQUE : cf tuto STM32CUBEIDE
Q1. Tester le programme bypass, en faisant lire un fichier audio au PC.
Q2. Placer un point d’arrêt dans la fonction BSP_AUDIO_SAI_Interrupt_CallBack() et vérifier les valeurs des échantillons. Quel est l’intervalle des valeurs des échantillons d’entrée et de sortie ?
Vérification de la période d’échantillonnage à l’oscilloscope
La LED1 est branchée sur la broche PI1. Son allumage est géré par les fonctions BSP_LED_On(LED1) et BSP_LED_Off(LED1)
Q3. Vérifier la période d’échantillonage en observant la broche PI1 à l’oscilloscope. s