Raspberry PI / I2C-SMBus / repeated start

Hali,

Jobb hijjan ebbe a topic-ba kerult.

Kernel divert barkacsolnek egy ho- es paratartalommero szenzorhoz.

A gond az, hogy a fuggveny amit hasznalnek (i2c_smbus_read_word_data) ket reszletben kuldi / fogadja a dolgokat (start iras stop start olvasas stop), nekem viszont ugy kellene, hogy start iras restart olvasas stop.

Az eszkozzel nem tudok mit tenni, ha nem a masodik modszerrel kuldom, nem jo neki.

Van erre megodas? (Mondjuk nem egy sajat I2C driver irasa...)

Koszi,

/sza2

Hozzászólások

Persze, erre rajottem en is, csak egy sohajtas volt, hogy miert nem lehet ugyanilyen egyszeruen repeated start-os megoldas is.

Viszont ugy tunik (Raspberry-n legalabbis) az i2c_transfer()-rel sem jo. Ugyanugy 2 transzfer van, van stop az elso vegen is:-(


    u8 data_addr = CS114_DATA;
    u8 temp_value[2];
    struct i2c_msg temp_msg[2] = {
        {client->addr, 0, 1, &data_addr},
        {client->addr, I2C_M_RD, 2, temp_value}
    };
    i2c_transfer(client->adapter, temp_msg, 2);

/sza2

Nem szkoppal mertem, de van egy I2C eszkozom ami tud monitor modban mukodni.

RPi:
(2012-10-28 21:41:07) [S] <20:w> 01 [P]
(2012-10-28 21:41:07) [S] <20:r> 01 24* [P]

Normalis cucc ami tud repeated start-ot:
(2012-10-28 22:05:17) [S] <20:w> 01
(2012-10-28 22:05:17) [S] <20:r> 24 38* [P]

A gond az, hogy a szenzorban levo state machine stop hatasara beallitja nullara az address register-t. Vegulis talan lehet workaround, ha egyel tobb byte-ot olvasok (a homeseklet adat az 1-es cimen kezdodok es ket byte), az elso kidobom a kukaba. De ez azert eleg csunya :-(

/sza2

Gondolom, itt nem a slave address-ről beszélsz, hanem az eszközben elérhető regiszter címéről. Ha törlődik a belső pointer, akkor igen, szerintem jó az, ha kiolvasod addig, amíg kell, s az elejét eldobálod. Tegyük hozzá, én ebben semmi rondaságot nem látok.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Igen, azokrol a cimekrol. Megcsinaltam, mukodik, szerencsere nem okoz gondot, vegulis a 0-s cimen a statusz van.

Viszont okozhatna, pl. ha egy clear on read regiszter lenne ott, es mondjuk elveszne az az adat ami ott tarolodik (jo, tegyem el valami tmp-be). De azert fel tudnek vazolni olyan helyzetet, amikor ez komoly gondot okozna.

Viszont ugy tunik a 10 bit-es slave cimek kezelesenek repeated start-ot alkalmaznak (az adatlapban ez all), bar nem ertelmeztem tuzetesebben. Szoval lehet, hogy megis mukodi valahogy.
http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Perip… 36. oldal alja.

/sza2

Ez egy kicsit rosszul hangzik:

by Tripel Hop » Tue Aug 28, 2012 10:25 pm

I did some direct programming of the I2C controller (BSC0) from user-space. It occured to me the BCM2835 doesn't support I2C repeated start. See the BCM2835 datasheet chapter 3 for more information.

(http://www.raspberrypi.org/phpBB3/viewtopic.php?t=15840&p=161973)

/sza2

Pontosan hogyan probalod?

---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"

userspace driver az i2c-dev kernel modullal nem jó? Ott az ioctl I2C_RDWR mintha ezt csinálná.

Egy darabig foglalkoztam vele, de mivel a szutykos workaround-om megy, egy ideje nem nyultam hozza.

"Our distro is based on "Wheezy" but comes with hardware SPI, I2C, one wire, and WiFi support for our wifi adapters."

En a Raspbian-t hasznalom custom kernel-lel. A "with hardware SPI, I2C" reszt nem tudom ertelmezni. Mar nem emlekszem de a gyari Rasbpian-os kernelben vagy nincs beleforditva az SPI es az I2C, vagy hardveres.

/sza2