rat de combat attention rongeur méchant! | Bonsoir,
je désespère concernant l'utilisation du CODEC TI TLV320AIC1106. 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.
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 :
- //XTAL 8,192MHz
- #include <avr/io.h>
- #include <util/delay.h>
- #include <stdint.h>
- #define BAUD 9600
- #include <util/setbaud.h>
- #include <stdio.h>
- #include <avr/interrupt.h>
- #include <string.h>
- static const uint8_t wave[800]={0xff, 0x9e, 0x8f, 0x89, .......... };
- static uint16_t i=0;
- uint8_t send_receive_sample(const uint8_t sample)
- {
- PORTD|=(1<<PCMSYNC);
- _NOP();_NOP();_NOP(); //testé entre 0 et 3
- PORTD&=~(1<<PCMSYNC);
- UDR1=sample;
- while(!(UCSR1A&(1<<TXC1)));
- return UDR1;
- }
- ISR(TIMER1_COMPA_vect)
- {
- uint8_t sample;
- sample=send_receive_sample(wave[i++]);
- if(i>800)
- i=0;
- }
- int main(void)
- {
- //init timer0 (master clock 2,048MHz) prescaler 1 ctc
- DDRB|=(1<<PB3);
- OCR0A=1;
- TCCR0A=(1<<COM0A0)|(1<<WGM01);
- TCCR0B=(1<<CS00);
-
- //init timer1 1/8000s interrupt prescaler 64 ctc
- OCR1A=15;
- TCCR1B=(1<<WGM12);
- TIMSK1=(1<<OCIE1A);
- TCCR1B|=(1<<CS11)|(1<<CS10); //go
- //init USART1 SPI 2,048MHz - SPI mode 1 MSB first
- DDRD|=(1<<PD4); //clock out, must be set to output
- UCSR1B=(1<<RXEN1)|(1<<TXEN1);
- UCSR1C=(1<<UMSEL11)|(1<<UMSEL10)|(1<<UCPHA1);
- UBRR1=1; //write after enabling transmitter
-
- DDRD|=(1<<PCMSYNC);
- DDRA|=(1<<TLV_RESET)|(1<<LINSEL)|(1<<MICMUTE)|(1<<EARMUTE);
- PORTA|=(1<<TLV_RESET);
- _delay_ms(1);
- PORTA&=~(1<<TLV_RESET); //reset
- _delay_ms(1);
- PORTA|=(1<<TLV_RESET);
- PORTA|=(1<<LINSEL); //enable ulaw
-
- sei();
- while(1);
-
- return 0;
- }
|
Code :
- 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
|