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

mise en oeuvre CODEC TI sur AVR [résolu] - Nano-ordinateur, microcontrôleurs, FPGA - Electronique, domotique, DIY

Marsh Posté le 03-03-2019 à 19:46:35    

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
Reply

Marsh Posté le 03-03-2019 à 19:46:35   

Reply

Marsh Posté le 07-03-2019 à 20:18:32    

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.

Reply

Marsh Posté le 07-03-2019 à 21:56:10    

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


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 08-03-2019 à 11:09:32    

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é??

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed