Forum: Mikrocontroller und Digitale Elektronik ADC121C021 antwortet nicht (I2C)


von Florian K. (f-kae)


Angehängte Dateien:

Lesenswert?

Hallo zusammen und wieder einmal habe ich ein Kommunikationsproblem.

Ich versuche über I2C ein Register des ADC121C021(MSOP-8) auszulesen.

Leider bekomme ich vom ADC121 aber garkeine Reaktion. Ich kenne mich 
noch nicht allzu gut mit der Kommunikation aus, aber meine Vermutung 
ist, dass die DEVICE-Adresse des ADC121 falsch ist.

Im Anhang sind zwei Osziaufnahmen, wobei die eine von einem Sensor ist, 
dessen ID ich überprüfe.(Soll die grundsätzliche Funktionsfähigkeit des 
I2C2BUS zeigen)
Die andere Aufnahme ist vom ADC121.

Ich nutze 0xA0 als Device Adresse für den ADC, da die beiden PINS: ADR0 
und ADR1 floaten.

Am ADC121 habe ich alle Leitungen überprüft und auch die Spannungen sind 
wie zu erwarten!

CODE:
1
uint8_t test;
2
uint8_t addr = I2C2BUS::SMON::ADC121C021::Alert_Status_Reg;
3
4
while (1)
5
{    if(!(I2C2BUS::write_read(I2C2BUS::SMON::ADC121C021::DEVICE_ADDRESS, &addr, 1, &test, 1)))
6
    {
7
      LED::Red_ON();
8
    }
9
    else
10
    {
11
      LED::Green_ON();
12
    }
13
    xpcc::delay_ms(1000);
14
    LED::Green_OFF();
15
    LED::Red_OFF();
16
17
    xpcc::delay_ms(1000);
18
    I2C2BUS::MAG::LSM303DLHC::checkID();
19
    xpcc::delay_ms(1000);
20
21
  }

Kann mir jemand erklären ob das Problem an der DEVICE-ADRESSE liegt oder 
die Verschaltung fehlerhaft sein muss, oder zumindest eine Richtung 
weisen in die ich "ermitteln" muss :)

Gruß,
Florian

von Gregor B. (Gast)


Lesenswert?

Florian K. schrieb:
> Ich nutze 0xA0 als Device Adresse für den ADC, da die beiden PINS: ADR0
>
> und ADR1 floaten.

1010000 = 0101 0000 = 0x50

Die Adresse sind nur 7 Bit.

von Florian K. (f-kae)


Lesenswert?

Aber hinter die Adresse kommt ja noch das R/W-Bit also von den 8Byte 
Adresse sind Bit(1-7) die Slave-Adresse und Bit(0) das R/W Bit.
Ich meine auch schon anfangs 0x50 ausprobiert zu haben. Allerdings habe 
ich mir das nicht auf dem Oszi angeschaut.

Kann ich denn irgendwie den I2C2BUs nach allen vorhandenen Adressen 
durchsuchen?

von Florian K. (f-kae)


Lesenswert?

OK, mit folgendem Code und einem LCD konnte ich die Adresse heraus 
finden:

Vielleicht hilft das jemand anderem ja irgendwann mal weiter!
1
  uint8_t test;
2
  uint8_t addr = I2C2BUS::SMON::ADC121C021::Alert_Status_Reg;
3
4
  uint8_t address_searching = 0;
5
  uint8_t x = 0;
6
  bool once = false;
7
  while (1)
8
  {
9
10
11
    if(address_searching==0xFE)
12
    {
13
      Buzzer::beep_onetime();
14
      return 0;
15
    }
16
    /*
17
    if (alarmAlarm.isExpired()){
18
      if (I2C2BUS::MOT::getSupplyAlarm()){
19
        Buzzer::beep_onetime();
20
        LED::Red_ON();
21
      }
22
    }
23
24
25
    I2C2BUS::MOT::testing();
26
    */
27
28
    if(I2C2BUS::write_read(address_searching, &addr, 1, &test, 1))
29
    {
30
      x++;
31
      once = true;
32
    }
33
    if(once && x==1)
34
    {
35
      senddecimalasbinarytolocation(1,1,address_searching);
36
      LED::Green_ON();
37
      once = false;
38
    }
39
    if(once && x==2)
40
    {
41
      LED::Red_ON();
42
      senddecimalasbinarytolocation(1,2,address_searching);
43
      once = false;
44
    }
45
    if(once && x==3)
46
    {
47
      LED::Blue_ON();
48
      senddecimalasbinarytolocation(1,3,address_searching);
49
      once = false;
50
    }
51
    if(once && x==4)
52
    {
53
      LED::Yellow_ON();
54
      senddecimalasbinarytolocation(1,4,address_searching);
55
      once = false;
56
    }
57
    address_searching += 0x02;
58
59
    xpcc::delay_ms(100);
60
61
62
63
  }

Die Adresse lautet demnach 0b10110000 (0xB0). Ich habe daraufhin extra 
nochmal beide ADR-Pins mit einem Multimeter überprüft: Es gibt definitv 
keine Lötbrücke oder ähnliches!

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.