Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1033 connectés 

  FORUM HardWare.fr
  Electronique, domotique, DIY
  Nano-ordinateur, microcontrôleurs, FPGA

  mise en oeuvre CODEC TI sur AVR [résolu]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

mise en oeuvre CODEC TI sur AVR [résolu]

n°249049
rat de com​bat
attention rongeur méchant!
Posté le 03-03-2019 à 19:46:35  profilanswer
 

Bonsoir,
 
je désespère concernant l'utilisation du CODEC TI TLV320AIC1106.  :cry: Est-ce que quelqu'un peut m'aider?
 
Ce CODEC est branché sur un µC AVR Atmega1284P:
Reset PA2 (active low, mis à 1 après un reset)
LinSel PA3 (mis à 1 -> 8 Bit µlaw)
MicMute PA4 (mis à 0)
EarMute PA5 (mis à 0)
MCLK PB3 = OC0A (master clock 2,048MHz)
PCMI PD3 (USART1 as SPI, MOSI)
PCMO PD2 (USART1 as SPI, MISO)
Le clock du SPI est branché nulle part, tout est basé sur le master clock fourni au CODEC.
PCMSYNC PD5
EarOut+/- directement sur un petit haut-parleur
Microphone branché comme indiqué dans la doc, ignoré pour l'instant
alimentation 3,3V avec découplage 2x100nF CMS
 
J'essaye de jouer un son (sinus 440Hz) dans le HP mais j'entends rien du tout. :(  
 
Au niveau logiciel tout est basé sur deux timers en mode CTC du AVR cadencé par un quartz de 8,192MHz et alimenté en 3,3V aussi.
Le premier est utilisé pour fournir le master clock de 2,048MHz au CODEC. Signal vérifié à l'oscilloscope.
Le deuxième provoque une interruption toutes les 125µs (1/8000). Dans cette interruption je crée une impulsion positive sur PCMSYNC puis je lance un transfer SPI (envoi+réception) avec une valeur prise dans un tableau de valeurs encodant le signal (correct, fabriqué par Audacity, encodage µlaw).
 
J'ai pu vérifier à l'analyzeur logique que l'envoi des données se fait en principe correctement, je retrouve les valeurs de mon tableau. MISO est tiré sur Vcc/2 en dehors des transferts (vérifié à l'oscilloscope), l'analyzeur logique enregistre donc n'importe quoi.
https://reho.st/thumb/self/2d5bec008965c9ae6f87d0b124297c21de30cf1f.pnghttps://reho.st/thumb/self/a0e773cd786faa715f4d9351737cc2eab1ddf812.png
 
Le seul problème que je vois (et il risque d'être de taille :( ) c'est un délai trop important entre l'impulsion PCMSYNC et le début du transfer SPI, mais cela n'explique (à mon avis) pas que je n'entende vraiment rien du tout. Je devrais - si mon sinus passe mal - au moins entendre une espèce de bruit ou autre??
 
Voilà le code simplifié:

Code :
  1. //XTAL 8,192MHz
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <stdint.h>
  5. #define BAUD 9600
  6. #include <util/setbaud.h>
  7. #include <stdio.h>
  8. #include <avr/interrupt.h>
  9. #include <string.h>
  10. static const uint8_t wave[800]={0xff, 0x9e, 0x8f, 0x89, .......... };
  11. static uint16_t i=0;
  12. uint8_t send_receive_sample(const uint8_t sample)
  13. {
  14.     PORTD|=(1<<PCMSYNC);
  15.     _NOP();_NOP();_NOP(); //testé entre 0 et 3
  16.     PORTD&=~(1<<PCMSYNC);
  17.     UDR1=sample;
  18.     while(!(UCSR1A&(1<<TXC1)));
  19.     return UDR1;
  20. }
  21. ISR(TIMER1_COMPA_vect)
  22. {
  23.     uint8_t sample;
  24.     sample=send_receive_sample(wave[i++]);
  25.     if(i>800)
  26.         i=0;
  27. }
  28. int main(void)
  29. {
  30.     //init timer0 (master clock 2,048MHz) prescaler 1 ctc
  31.     DDRB|=(1<<PB3);
  32.     OCR0A=1;
  33.     TCCR0A=(1<<COM0A0)|(1<<WGM01);
  34.     TCCR0B=(1<<CS00);
  35.    
  36.     //init timer1 1/8000s interrupt prescaler 64 ctc
  37.     OCR1A=15;
  38.     TCCR1B=(1<<WGM12);
  39.     TIMSK1=(1<<OCIE1A);
  40.     TCCR1B|=(1<<CS11)|(1<<CS10); //go
  41.     //init USART1 SPI 2,048MHz - SPI mode 1 MSB first
  42.     DDRD|=(1<<PD4); //clock out, must be set to output
  43.     UCSR1B=(1<<RXEN1)|(1<<TXEN1);
  44.     UCSR1C=(1<<UMSEL11)|(1<<UMSEL10)|(1<<UCPHA1);
  45.     UBRR1=1; //write after enabling transmitter
  46.    
  47.     DDRD|=(1<<PCMSYNC);
  48.     DDRA|=(1<<TLV_RESET)|(1<<LINSEL)|(1<<MICMUTE)|(1<<EARMUTE);
  49.     PORTA|=(1<<TLV_RESET);
  50.     _delay_ms(1);
  51.     PORTA&=~(1<<TLV_RESET);  //reset
  52.     _delay_ms(1);
  53.     PORTA|=(1<<TLV_RESET);
  54.     PORTA|=(1<<LINSEL); //enable ulaw
  55.    
  56.     sei();
  57.     while(1);
  58.    
  59.     return 0;
  60. }
Code :
  1. avr-gcc main.c -Wall -Os -mmcu=atmega1284p -o avr.elf -DF_CPU=8192000UL


 
Quelqu'un pour m'aider svp?


Message édité par rat de combat le 07-03-2019 à 20:18:47
mood
Publicité
Posté le 03-03-2019 à 19:46:35  profilanswer
 

n°249656
rat de com​bat
attention rongeur méchant!
Posté le 07-03-2019 à 20:18:32  profilanswer
 

Bon, j'ai perdu des heures à cause d'une erreur de débutant: J'avais pas vérifié le HP. Il est mort. J'ai honte. :o  
 
Concernant le délai entre PCMSYNC et la transmission SPI j'ai trouvé une astuce aussi:

Code :
  1. PORTD|=(1<<PCMSYNC);
  2. UDR1=sample; //délayé à cause du double-buffering sur le USART1
  3. PORTD&=~(1<<PCMSYNC);


Le CODEC, en tout cas la partie haut-parleur, fonctionne.

n°249663
TotalRecal​l
Modérateur
Posté le 07-03-2019 à 21:56:10  profilanswer
 

J'imagine le sentiment de désespoir après avoir passé des heures à se palucher la datasheet, vérifier le câblage, mesurer plein de trucs à l'oscillo et changer 12 fois le code et les registres pour se rendre compte que c'est le HP qui est hs [:macator].
J'espère au moins que ce fut instructif :o
 
Jamais pensé à brancher l'oscillo directement sur la sortie analogique du codec ? :p


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°249715
rat de com​bat
attention rongeur méchant!
Posté le 08-03-2019 à 11:09:32  profilanswer
 

TotalRecall a écrit :

Jamais pensé à brancher l'oscillo directement sur la sortie analogique du codec ? :p

Justement, c'est en vérifiant toutes les broches au scope que je me suis rendu compte que cette "tension continue" que m'affichait le multi était un sinus. :o Ensuite le diagnostic était vite fait.
Oui je sais, j'aurais dû vérifier au scope directement, mais qui s'attend à ce qu'un HP soit cassé??


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Electronique, domotique, DIY
  Nano-ordinateur, microcontrôleurs, FPGA

  mise en oeuvre CODEC TI sur AVR [résolu]

 

Sujets relatifs
Plus de sujets relatifs à : mise en oeuvre CODEC TI sur AVR [résolu]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR