Guest
Wed Oct 24, 2007 12:59 pm
Witam, mam problem z wysterowaniem ukladu TDA8425 przez I2C. Procesor
ATMEGA32, uklad podlaczony pod sprzetowy I2C (PC0 oraz PC1) razem z
RTC PCF8583
RTC 8583 dziala bez najmniejszych problemow..
Procedury ktore uzywam do komunikacji:
void i2c_start(void)
{
TWBR = 32;
TWSR &= ~0x03;
TWCR= (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
while(! (TWCR & (1 << TWINT)) );
TWCR &= ~((1<<TWSTA)|(1<<TWINT));
}
void i2c_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
while ((TWCR & (1<<TWSTO)));
}
unsigned char i2c_write(unsigned char data_byte)
{
TWDR = data_byte;
TWCR |= 0b10000000;
while (!(TWCR & 0b10000000));
if (((TWSR & 0xF8) != 0x18) && ((TWSR & 0xF8) != 0x28) && ((TWSR &
0xF8) != 0x40)) return 1;
return 0;
}
nsigned char i2c_read(unsigned char ack)
{
if (ack == 1)
{
TWCR |= 0b10000000;
}
else
{
TWCR &= 0b10111111;
};
while (!(TWCR & 0b10000000));
if (((TWSR & 0xF8) != 0x50) && ((TWSR & 0xF8) != 0x58)) return 1;
return TWDR;
}
Moj problem polega na tym, ze program zapetla sie.
W/g noty katalogowej aby np ustawic glosnosc nalezy wyslac:
1) MAD
2) adres komorki w TDA
3) wartosc
No wiec wysylam:
i2c_start();
i2c_write(0x82); // adres
i2c_write(0x00); // volume
i2c_write(0xFF); // value
i2c_stop();
Po wyslaniu 0x00 program zapetla sie. Jezeli zamiast 0x82 wysle kazda
inna wartosc to przejdzie dalej, ale dane nie trafia do procka
audio...
Czy moglby ktos powiedziec co robie nie tak?
Tutaj nota katalogowa TDA8425 --->
http://pdf.elenota.pl/pdf/Philips/tda8425_cnv_2.pdf
Pozdrawiam, Piotrek
robmac
Guest
Wed Oct 24, 2007 5:34 pm
On 24 Pa , 13:59, joti...@gmail.com wrote:
Quote:
Witam, mam problem z wysterowaniem ukladu TDA8425 przez I2C. Procesor
ATMEGA32, uklad podlaczony pod sprzetowy I2C (PC0 oraz PC1) razem z
RTC PCF8583
RTC 8583 dziala bez najmniejszych problemow..
...
Moj problem polega na tym, ze program zapetla sie.
W/g noty katalogowej aby np ustawic glosnosc nalezy wyslac:
1) MAD
2) adres komorki w TDA
3) wartosc
No wiec wysylam:
i2c_start();
i2c_write(0x82); // adres
i2c_write(0x00); // volume
i2c_write(0xFF); // value
i2c_stop();
Po wyslaniu 0x00 program zapetla sie. Jezeli zamiast 0x82 wysle kazda
inna wartosc to przejdzie dalej, ale dane nie trafia do procka
audio...
Czy moglby ktos powiedziec co robie nie tak?
Tutaj nota katalogowa TDA8425 --->http://pdf.elenota.pl/pdf/Philips/tda8425_cnv_2.pdf
Hmm, na stronie 9 tejze noty jest cos o inicjacji po wlaczeniu
zasilania, cytuje:
"After a power-on reset all five functions have to be adjusted with
five data transmissions."
Moze sprobuj wyslac po starcie procka audio wszystko to co jest na rys.
4.
--
pozdrawiam
Robert
Guest
Thu Oct 25, 2007 12:29 pm
Wysylam radosnie wszystko tak:
unsigned char S1 = 0;
#define MU 5
#define EFL 4
#define STL 3
#define ML1 2
#define ML0 1
#define IS 0
i2c_start();
i2c_write(0x82); // adres
i2c_write(0x00); // volume VL
i2c_write(0xFF); // value
i2c_stop();
i2c_start();
i2c_write(0x82);
i2c_write(0x01); // volume VR
i2c_write(0xFF);
i2c_stop();
i2c_start();
i2c_write(0x82); // adres
i2c_write(0x02); // bass
i2c_write(0xFF); // value
i2c_stop();
i2c_start();
i2c_write(0x82); // adres
i2c_write(0x03); // treble
i2c_write(0xFF); // value
i2c_stop();
S1 &= ~(1 << MU); // 0 - mute off
S1 |= (1 << EFL); // /
S1 |= (1 << STL); // \spatial stereo
S1 |= (1 << ML0); // /
S1 |= (1 << ML1); // \stereo
S1 &= ~(1 << IS); // 1 - channel 2 , 0 - channel 1
i2c_start();
i2c_write(0x82);
i2c_write(0x08); // function.
i2c_write(S1 | 0xC0);
i2c_stop();
Ok teraz nie ma problemu z zawieszaniem sie programu. Okazalo sie, ze
trzeba bylo zwolnic nieco z wysylaniem. TWBR = 16 i smiga.
Jednak po wyslaniu takiej ramki danych procesor powinien wystartowac,
jednak na wyjsciu mam 0.0V AC oraz 6V DC (bias) [ czyli wychodzi na to
ze procek jest sprawny, ale nie zostaje skonfigurowany via i2c ]
Na wejsciu podaje sygnal z karty dzwiekowej o amplitudzie 0-0.5V AC
przez kondesator 470nF
Ma ktos jakies pomysly?:)
Pozdrawiam, Piotrek
Guest
Thu Oct 25, 2007 12:48 pm
Ok juz wiem na 100% ze winne sa procedury i2c z C, ktore przedstawilem
wyzej
Napisalem na szybko program w bascomie, ktory wysyla te same dane
co wyzej i TDA rusza...
Tylko teraz niech mi ktos powie co jest tam nie tak :(
Pozdrawiam, Piotrek
Guest
Thu Oct 25, 2007 4:18 pm
On 25 Pa , 16:18, Piotr Chmiel <pi...@topaz.zsel.lublin.pl> wrote:
Quote:
Ja mam.
Skoro zapisa e bajty po I2C to postaraj si je te odczyta i
zwerywikowac czy dobrze zapisa e .
Juz znalazlem przyczyne. Dla potomnych: TDA8425 nie pojdzie
po i2c szybciej niz 100kHz.
Wzorek: TWBR = (((f_osc/f_i2c)-16)/2)
Dla kwarcu 16MHz, 100kHz i2c, TWBR = 72;
Pozdrawiam, Piotrek