Problem z komunikacja via I2C

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

formatting link
Pozdrawiam, Piotrek

Reply to
jotixel
Loading thread data ...

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.
Reply to
robmac

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

Reply to
jotixel

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

Reply to
jotixel

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

Reply to
jotixel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.