Hallo zusammen
ich versuche gerade verzweifelt mit einem Audio Prozessor TDA7318 über
den I2C Bus zu kommunizieren.
Aufbau: 2 Taster an digitalen Ports
Vcc vom TDA7318 an Vin
Gnd vom TDA7318 an GND
SCL vom TDA7318 an A4
SDA vom TDA7318 an A5
DigGnd vom TDA7318 an GND
Sollte das soweit passen?
an Left in 1 hab ich einen MP3 Player angeschlossen.
Folgender Code:
1
#include <Wire.h>
2
3
#define audioControl 0b1000100
4
void setup()
5
{
6
pinMode(13,OUTPUT);
7
pinMode(3,INPUT);
8
pinMode(4,INPUT);
9
10
//Wire.begin();
11
}
12
13
void loop()
14
{
15
if(digitalRead(3) == HIGH)
16
{
17
Wire.begin(audioControl);
18
Wire.beginTransmission(audioControl);
19
Wire.send(0);
20
Wire.send(1);
21
Wire.send(0b01011000);
22
Wire.send(0b00001100);
23
Wire.send(0b00001011);
24
Wire.send(0b11010011);
25
Wire.endTransmission();
26
}
27
28
if(digitalRead(4) == HIGH)
29
{
30
Wire.begin(audioControl);
31
Wire.beginTransmission(audioControl);
32
Wire.send(0);
33
Wire.send(1);
34
Wire.send(B01010001);
35
Wire.send(B00001100);
36
Wire.send(B10001001);
37
Wire.endTransmission();
38
}
Wenn ich die Tasten betätige sollte er ja umschalten.
Da mit im Moment noch passende Widerstände und Kondensatoren fehlen, hab
mich meinen Kopfhörer im Moment an OUT(L) angeschlossen, sollte ja nach
dem Schaltplan im Datenblatt direkt nach dem Umschalter kommen. Aber ich
höre nur ganz leise ein Signal Aber es ist egal welcher Input geschaltet
ist. Wo ist mein Fehler!?!?
Wäre nett wenn mir jemand helfen könnte...
Danke
Hi
Interessant wäre, was hinter den Routinen 'Wire.begin'... steckt.
Diese zeilen
> Wire.begin(audioControl);> Wire.beginTransmission(audioControl);
kommen mir schon etwas suspekt vor. Wozu zwei mal die Adresse?
MfG Spess
Hab mir mal versucht mit der Rückgabe eine Testumgebung zu bauen:
1
void loop()
2
{
3
digitalWrite(13,LOW);
4
if(digitalRead(3) == HIGH)
5
{
6
Wire.beginTransmission(audioControl);
7
digitalWrite(13,HIGH);
8
Wire.send(0b00001100);
9
Wire.requestFrom(audioControl,1);
10
if(Wire.available())
11
{
12
Serial.print(Wire.receive()); //Hab am PC am Seriellen Port ein Monitor laufen, aber er gibt nichts zurück. Oder was ist gemeint?
13
}
14
delay(500);
15
Wire.endTransmission();
16
}
Das mit der Adresse 2 mal übergeben hab ich hier von
http://www.arduino.cc/en/Reference/Wire
Bin ich echt zu blöde? Was tut der CREF Pin am TDA? Muss ich den mit auf
die 9Volt legen?
Grüße und Danke für eure Gedult :)
Boa, ich dachte gerade schon... aber meiner hat diese Pins leider
nicht...
Aber http://www.arduino.cc/en/Main/arduinoBoardUno sagt:
The Uno has 6 analog inputs, labeled A0 through A5, each of which
provide 10 bits of resolution (i.e. 1024 different values). By default
they measure from ground to 5 volts, though is it possible to change the
upper end of their range using the AREF pin and the analogReference()
function. Additionally, some pins have specialized functionality:
TWI: A4 or SDA pin and A5 or SCL pin. Support TWI communication
using the Wire library.
Sollte doch denn so passen oder?
Auch mit Pullup tut sich nix :(
Osci hab ich nicht da...
Manno, als ich mich da eingelesen hatte sah das nicht so schwer aus...
Danke schonmal für eure Hinweise
>Auch mit Pullup tut sich nix :(
Deine Schaltung sieht arg minimal aus.
Wenn das deine ganze Schaltung ist kann da nix rauskommen.
Also mindestens die Kondensatoren zwischen 7 und 6 sowie
17 und 16 müssen rein. Einen Kopfhörer treibt der TDA auch nicht ohne
Verstärker. Und dann muss die Software natürlich funktionieren;)
Jau, hab noch nicht mehr dran, weil ich die Kommunikation erst mal
testen wollte.
Kondensatoren stecken und mittlerweile ist auch ein Verstärker
angeschlossen. Gaaaanz leise ist auch was zu hören, aber immer, egal ob
der Input auf 1,2,3 oder 4 steckt...
hab noch folgendes gefunden:
if you are using the Wire-lib check the return value of
Wire.endTransmission().
It is 0 if the data was succesfully transmitted,
2 if your slave device did not ACK the address,
3 if the device did not ACK some data you send,
4 if there is some other TWI error.
Ich erhalte immer die 2 zurück.... Hat Conrad Dienstag offen? Dann muss
ich wohl mal einkaufen ;)
Das hab ich schon wieder mit drin...
Im Datenblatt auf Seite 8 steht wie genau die Kommunikation ablaufen
soll, aber ich vermute das die Wire.h genau das anbietet? Muss ich ein
Ack senden um eins zu empfangen? So ala Three-Way-Handshake im TCP/IP
Bereich?
Grüße und danke
Maddin89 schrieb:> Boa, ich dachte gerade schon... aber meiner hat diese Pins leider> nicht...
Da es offensichtlich unterschiede bei den Boards gibt, magst Du uns mal
mitteilen, welcher Prozessor da drauf sitzt?
Auch die Stromversorgung vom TDA sieht irgendwie unvollständig aus ...
Gruß
Jobst
Das "Schaltbild" (Bildschirmfoto_am_2011-12-24_17_06_42.png) kann man
nicht feststellen, wo der Fehler liegt, da fast alle passiven Bauteile
fehlen.
Im Datenblatt wird für den TDA eine Mindestspannung von 6V verlangt. In
diesem Schaltbild wird der TDA nur 5V gespeist.
Muss nachher mal schauen was dort drauf sitzt.
Stromversorgung: 9v an Vcc. Gnd. Cref übern C auf gnd. Sollte doch alles
sein oder?
Vermutlich hab ich beim testen das Bauteil gehimmelt. Ich glaub ich
hatte auf Cref mal +9v liegen.
Habe einen i2c scanner gefunden. Das IC wird nicht gefunden. Hatte noh
was anderes mit i2c Bus hier, das findet er sofort.
Nachher mal gucken.
Hallo Maddin89,
gleich vorweg - ich habe noch kein I2C mit dem Arduino gemacht. Die
Dokumentation der Wire-Lib verstehe ich aber so dass die TWI
Schnittstelle mit Wire.begin(addr) als Slave Device eingerichtet wird.
Benötigt wird hier aber ein Master. Dazu müßte nach meinem Verständnis
begin() ohne Adresse aufgerufen werden.
Die Übertragung dürfte dann so aussehen:
1
Wire.begin();
2
Wire.beginTransmission(0b00001100);
3
Wire.write(...);
4
Wire.write(...);
5
...
6
result=Wire.endTransmission();
Erst beim Aufruf von endTransmission() werden tatsächlich Daten
gesendet. Vorher wird nur gesammelt.
Die Adresse erscheint mir dabei suspekt. Der TDA hat soweit ich weiß
0b10001000. Ich habe mal relativ viel damit (bzw. seinem Nachfolger
TDA7348) gemacht.
Mit 9V am Cref könntest du den Chip in der Tat abgeschossen haben. Es
könnte aber gut sein dass es dann nur den Analogteil erwischt hat. Die
Kommunikation an sich geht vielleicht noch.
Es ist ein Jammer das ST die 7318 und 7348 nicht mehr herstellt. Die
sind ziemlich genial.
Maddin89 schrieb:> Sollte doch alles sein oder?
Mach doch mal einen vernünftigen Plan, der auch mit Deinem Aufbau
übereinstimmt. Sonst kann man da gar nichts sagen.
Maddin89 schrieb:> Vermutlich hab ich beim testen das Bauteil gehimmelt. Ich glaub ich> hatte auf Cref mal +9v liegen.> Habe einen i2c scanner gefunden. Das IC wird nicht gefunden. Hatte noh> was anderes mit i2c Bus hier, das findet er sofort.
Entweder hast Du das Bauteil tatsächlich kaputt gemacht oder immer noch
nicht korrekt angeschlossen.
Michael G. schrieb:> Der TDA hat soweit ich weiß 0b10001000.
I²C-Adressen haben immer 7 Bit.
Gruß
Jobst
> I²C-Adressen haben immer 7 Bit.
Ja, stimmt. Auch wenn das R/W Bit oft und gerne als Teil der Adresse
gesehen wird. In der Dokumentation des TDA7318 die ich gerade mal
hervorgekramt habe, wird das Bit z. B. mit keiner Silbe erwähnt. Unter
"Chip Address" steht dort tatsächlich 0b10001000.
Aber beginTransmission(addr) erwartet anscheinend 7Bit.
Ich würde es jetzt also mal so probieren:
>Ich würde es jetzt also mal so probieren:>>Wire.begin(); // I2C Init als Master>Wire.beginTransmission(0b1000100); // 7Bit Chip Adresse
Das macht er schon die ganze Zeit:
>#define audioControl 0b1000100
So hab einen neuen TDA, Die Ansteuerung scheint zu klappen, allerdings
hab ich so gut wie keinen Bass im Ausgangssignal.
Aufbau ist jetzt wie im Datenblatt.
Danke schonmal für eure Hilfe