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