Forum: Mikrocontroller und Digitale Elektronik MAX9850 - DAC in C - Problem beim I2C Schreiben


von C. H. (hedie)


Lesenswert?

Hallo

Ich habe mir den MAX9850 ADC mit integriertem Headphone Amplifier 
besorgt....

Ich habe mir in C eine I2C Funktion geschrieben....
Mit einem EEPROM Funktioniert alles bestens doch mit dem MAX9850 leider 
nicht....

Meine C Funktionen für I2C:
1
void I2CStop(void)
2
{
3
  SDA = 0;
4
  SCL = 1;
5
  Wait100ms(1);
6
  SDA = 1;
7
  Wait100ms(1);
8
  SCL = 1;  
9
}
10
11
void I2CStart(void)
12
{
13
  SDA = 1;
14
  SCL = 1;
15
  Wait100ms(1);
16
  SDA = 0;
17
  Wait100ms(1);
18
  SCL = 0;  
19
}
20
21
void writeI2C(unsigned char ucData)
22
{
23
  unsigned char ucCount = 0;
24
  unsigned char ucMasked = 0;
25
  
26
  while(ucCount != 8)
27
  {
28
    ucMasked = (0x80 & ucData);
29
    if(ucMasked > 0)  SDA = 1;
30
    if(ucMasked == 0) SDA = 0;
31
    
32
    SCL = 1;
33
    Wait100ms(1);
34
    SCL = 0;
35
    Wait100ms(1);
36
    
37
    ucCount ++;
38
    ucData = (ucData << 1);
39
  }  
40
  
41
  IO.PCR6 = 0xFE;           //SDA als Eingang
42
  SCL = 1;              //Auf acknowledge warten
43
  while(SDA != 0);
44
  Wait100ms(1);
45
  SCL = 0;
46
  Wait100ms(1);
47
  IO.PCR6 = 0xFF;           //SDA als Ausgang
48
}
49
50
unsigned char readI2C(void)
51
{
52
  unsigned char ucCount = 0;
53
  unsigned char ucMasked = 0;
54
  
55
  IO.PCR6 = 0xFE;           //SDA als Eingang
56
  
57
  while(ucCount != 8)
58
  {
59
    SCL = 1;
60
    Wait100ms(1);
61
    if(SDA == 1) ucMasked = (ucMasked | 0x01);
62
    if(SDA == 0) ucMasked = (ucMasked & 0xFE);
63
    if(ucCount < 7) ucMasked = (ucMasked << 1);
64
    
65
    SCL = 0;
66
    Wait100ms(1);
67
    
68
    ucCount ++;    
69
  }
70
  IO.PCR6 = 0xFF;           //SDA als Ausgang
71
  
72
  SDA = 1;
73
  SCL = 1;
74
  Wait100ms(1);
75
  SCL = 0;
76
  Wait100ms(1);
77
  
78
  return ucMasked;
79
}

Hier das Datenblatt des Chips: 
http://datasheets.maxim-ic.com/en/ds/MAX9850.pdf

Nun das Problem...

Wenn ich über meine Funktion an der Register adresse 0x09 0x40 hinein 
schreibe und danach dieses Register wieder auslese bekomme ich 0x40...

dies klappt bis zum wert 0x7F einwandfrei... Sobald ich jedoch 0x80 oder 
mehr schreibe kommt immer! 0xFF zurück....

Getestet wurden meine Funktionen mit einem EEPROM da kam immer das 
korrekte zurück...

Getestet habe ich auch mit zwei verschiedenen Chips... somit schliesse 
ich mal eine Fehlfunktion aus...

Ich bin echt verzweifelt... weshalb kommt ab 0x7F immer 0xFF zurück?

Ich hoffe ihr könnt mir helfen...

Liebe Grüsse
Claudio

von Claudio H. (Gast)


Lesenswert?

Push.....

Bitte hilfe....

von Fred (Gast)


Lesenswert?

push

von Thomas (kosmos)


Lesenswert?

ich verstehe den Sinn nicht die Daten die man an einen DAC übertragen 
hat wieder auszulesen. Ein EEPROM ist ja für Schreib- und Lesezugriffe 
gedacht, ein DAC aber doch nur zum Empfang digitaler Daten und zur 
Ausgabe analoger Signale.

von Michelle K. (Firma: electronica@tdnet) (michellekonzack) Benutzerseite


Lesenswert?

Claudio H. schrieb:
> Hallo
>
> Ich habe mir den MAX9850 ADC mit integriertem Headphone Amplifier
> besorgt....

Den hab ich auch, nur noch nicht im Einsatz...

> Nun das Problem...
>
> Wenn ich über meine Funktion an der Register adresse 0x09 0x40 hinein
> schreibe und danach dieses Register wieder auslese bekomme ich 0x40...

Ehm, das ist das "LRCLK LSB" und kann meines erachtens nicht mehr als 
0x7F. Der zweite Teil ist ja Register 8 "LRCLK MSB"

Grüße
Michelle

von Marius S. (lupin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hey Claudio, ich hab auch mal angefangen mit meinem MAX9850 zu basteln 
(seit ein paar jahren plane ich das ja schon hehe).

Bist du noch an der Adapterplatine interessiert? Im Anhang kannst die 
sehen (und den Rest meines Versuchsaufbaus). Hab letztens noch eine 
bestückt.

Auf dem Display steht "read: aa", da habe ich Register 0x2 mit 0xAA 
beschrieben und zurück gelesen. Der Font ist weichgezeichnet btw. :)

Jetzt muss ich das I2S ans laufen bringen...

von Phil S. (zippi)


Lesenswert?

Ob Claudio das noch liest^^

Naja ich hab vor 1 Jahr auch mal mit dem IC gearbeitet. Hier ist mal 
meine init:

SEND_TWI(0x06, 0x00);
SEND_TWI(0x07, 0x44);
SEND_TWI(0x08, 0x80);
SEND_TWI(0x09, 0x11);
SEND_TWI(0x0a, 0x00);
SEND_TWI(0x05, 0x30);
wait_msdac(100000);
SEND_TWI(0x05, 0x7f);
wait_msdac(100000);
SEND_TWI(0x05, 0xff);

aufbau:
SEND_TWI("register","wert");

gruß

von Lupin (Gast)


Lesenswert?

Danke zippi. 100 Sekunden Wartezeiten? :)

Womit hast du den angesteuert? Wenn es ein SAM7 war kannst gerne mehr 
blicken lassen :-)

von Phil S. (zippi)


Lesenswert?

Lupin schrieb:
> Danke zippi. 100 Sekunden Wartezeiten? :)
>
> Womit hast du den angesteuert? Wenn es ein SAM7 war kannst gerne mehr
> blicken lassen :-)

Hehe, ne das sind eigentlich us. Also 100ms warte zeiten^^.

Der code war für ein altes AVR32 board. Habe auch schön musik damit 
abgespielt. Bin aber umgestiegen auf den "tlv320dac32".

gruß

von Marius S. (lupin) Benutzerseite


Lesenswert?

Warum bist du auf den tlv32dac32 umgestiegen?

Gibt es eigentlich noch einen anderen DAC außer den MAX9850 der ohne die 
großen Entkoppel-Kondensatoren auskommt? Das finde ich beim MAX9850 ein 
feature welches ihn von anderen unterscheidet.

von Phil S. (zippi)


Lesenswert?

>Gibt es eigentlich noch einen anderen DAC außer den MAX9850 der ohne die
>großen Entkoppel-Kondensatoren auskommt?
Jap das kann der TLV320dac32.

Aber ich nutze eine Schaltung in der ich 1. ein headphone out habe und 
einmal eine kleine audio box. Mit dem TLV320dac32 kann man dann zwischen 
box oder kopfhörer hin und her schalten. Deswegen bin ich umgestiegen.

Bei dieser schaltung brauchte man dann aber die 2 koppel Cs. Gibt da 
also viele verschaltungs varianten.

Ein weiterer vorteil ist, dass der DAC auch 24bit und 96khz kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.