Lesen / schreiben von mit I2C unter Linux

Ich bin versucht zu Lesen/schreiben auf einem FM24CL64-GTR FRAM - chip, der verbunden ist über ein I2C-bus-Adresse 0b 1010 011.

Wenn ich versuche zu schreiben, 3 bytes (Daten, Adresse (2 bytes + Daten ein byte), bekomme ich eine kernel-Meldung ([12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout.), sowie das schreiben zurück != 3. Siehe code unten:

#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>

int file;
char filename[20];
int addr = 0x53; //0b1010011; /* The I2C address */
uint16_t dataAddr = 0x1234;
uint8_t val = 0x5c;
uint8_t buf[3];

sprintf(filename,"/dev/i2c-%d",0);
if ((file = open(filename,O_RDWR)) < 0)
    exit(1);

if (ioctl(file,I2C_SLAVE,addr) < 0)
    exit(2);

buf[0] = dataAddr >> 8;
buf[1] = dataAddr & 0xff;
buf[2] = val;

if (write(file, buf, 3) != 3)
    exit(3);

...

Aber wenn ich Schreibe 2 bytes, dann schreiben ein weiteres byte, bekomme ich kein kernel-Fehler, aber wenn man versucht zu Lesen, von der " FRAM, ich bekomme immer 0 zurück. Hier ist der code zum Lesen aus dem FRAM:

uint8_t val;

if ((file = open(filename,O_RDWR)) < 0)
    exit(1);

if (ioctl(file,I2C_SLAVE,addr) < 0)
    exit(2);

if (write(file, &dataAddr, 2) != 2) {
    exit(3);

if (read(file, &val, 1) != 1) {
    exit(3);

Keine der Funktionen einen Fehler zurück Wert, und ich habe es auch ausprobiert mit:

#include <linux/i2c.h>

struct i2c_rdwr_ioctl_data work_queue;
struct i2c_msg msg[2];
uint8_t ret;

work_queue.nmsgs = 2;
work_queue.msgs = msg;

work_queue.msgs[0].addr = addr;
work_queue.msgs[0].len = 2;
work_queue.msgs[0].flags = 0;
work_queue.msgs[0].buf = &dataAddr;

work_queue.msgs[1].addr = addr;
work_queue.msgs[1].len = 1;
work_queue.msgs[1].flags = I2C_M_RD;
work_queue.msgs[1].buf = &ret;

if (ioctl(file,I2C_RDWR,&work_queue) < 0)
    exit(3);

Was auch gelingt, aber es wird immer 0 zurückgegeben. Weist das auf ein hardware-Problem, oder mache ich etwas falsch?

Gibt es FRAM Treiber für FM24CL64-GTR über die I2C unter Linux, und was wäre die API werden? Jeder link wäre hilfreich.

InformationsquelleAutor der Frage TheSeeker | 2009-02-02

Schreibe einen Kommentar