Forum: Mikrocontroller und Digitale Elektronik LTC2945 - Probleme mit I2C-Kommunikation


von Linear2 (Gast)


Lesenswert?

Hi,

ich verwende für ein Projekt den LTC2945 Power Monitor:

http://www.linear.com/product/LTC2945

Dieser ist über I2C mit einen Raspberry Pi B+ verbunden auf dem ein 
aktuelles Linux läuft.

Mein Problem ist dass die Datenübertragung über I2C nicht richtig 
funktioniert bzw. ich das mit den i2c-tools irgendwie nicht hinbekomme.

Mit i2cdetect wird der Baustein im System gefunden:

~ # i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6f
70: -- -- -- -- -- -- -- --

Das Control-Register (Register 0) lässt sich auch auslesen:

~ # i2cget -y 1 0x6f 0x00
0x05

Ich denke daher dass der Baustein bzw. I2C grundsätzlich funktioniert.

Allerdings gelingt es mir nicht weitere Register zu lesen oder zu 
schreiben. Laut dem Datenblatt

http://www.linear.com/docs/42284

muss man zum Lesen eines Byte oder Wort zwei mal die Adresse auf den Bus 
legen ohne diesen freizugeben, also

Start -> Adresse -> Register -> Adresse

und erhält dann die Daten vom Slave.
Ich hab das mal so probiert, allerdings ohne Erfolg:

~ # i2cset -y 1 0x6f 0x24
~ # i2cget -y 1 0x6f
0x05

da nach i2cset die Register-Nr leider wieder auf 0 zurückgesetzt wird.

Kann mir evtl. jemand weiter helfen? Ist es nicht möglich mit den 
i2c-tools diesen Baustein anzusteuern?

Grüße

von Sven B. (scummos)


Lesenswert?

Der i2c-Controller des Raspberry Pi kann leider kein Repeated Start. 
Wenn du Pech hast, kommt dein Chip damit nicht klar und funktioniert gar 
nicht am Pi. Vielleicht geht es, wenn du die beiden Bytes direkt 
hintereinander schickst und ein Stopp zwischendrin, manche Slaves 
tolerieren das auch.

von Linear2 (Gast)


Lesenswert?

Sven B. schrieb:
> Der i2c-Controller des Raspberry Pi kann leider kein Repeated
> Start.
> Wenn du Pech hast, kommt dein Chip damit nicht klar und funktioniert gar
> nicht am Pi. Vielleicht geht es, wenn du die beiden Bytes direkt
> hintereinander schickst und ein Stopp zwischendrin, manche Slaves
> tolerieren das auch.

Danke für den Hinweis! Damit ist mir schon mal weiter geholfen.

Der Kernel bietet ja auch den "GPIO-based bitbanging I2C" Treiber, 
denkst du das es damit funktionieren könnte?

Grüße

von Sven B. (scummos)


Lesenswert?

Kann ich leider nicht sagen -- probier's aus. Gefühlsmäßig würde ich 
denken wenn dir das langsame i2c reicht hat das gute Chancen zu 
funktionieren.

von Linear2 (Gast)


Lesenswert?

Sven B. schrieb:
> Kann ich leider nicht sagen -- probier's aus. Gefühlsmäßig würde
> ich
> denken wenn dir das langsame i2c reicht hat das gute Chancen zu
> funktionieren.

So ich hab das gerade mal reingehackt... funktioniert! Zwar leider etwas 
lahm aber immerhin.

Falls jemand das gleiche Problem haben sollte ich habe es quick&dirty so 
gelöst:

-) In der Kernel-Config den BMC2708 BSC Treiber deaktivieren und den 
GPIO-I2C-Treiber aktivieren (CONFIG_I2C_GPIO=y)

-) Den GPIO-I2C Platform-Device hinzufügen, das hab ich kurz und 
schmerzlos in der Datei arch/arm/mach-bcm2708/bcm2708.c erledigt:

#include <linux/i2c-gpio.h>
...
static struct i2c_gpio_platform_data i2c_gpio_data = {
  .sda_pin  = 2,
  .scl_pin  = 3,
};

static struct platform_device i2c_gpio_device = {
  .name    = "i2c-gpio",
  .id    = 0,
  .dev    = {
    .platform_data  = &i2c_gpio_data,
  },
};
...
void __init bcm2708_init(void)
{
...
  bcm_register_device(&i2c_gpio_device);
...
}

-) linux-rebuild, kopieren und neustarten

Und zum Test:
~ # i2cget -y 0 0x6f 0x25
0xf0

Grüße

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.