предаване на 32-битов регистърен адрес към I2C_RDWR

Трябва да напиша I2C програма, която може да записва данни в 32-битов и 16-битов регистърен адрес, използвайки I2C_RDWR ioctl.

От това, което знам, адресът на устройството и данните се предават заедно в устройството, използвайки същия буфер buf в структура i2c_msg, дефинирана в i2c драйвера на Linux:

struct i2c_msg {
        __u16 addr;      slave address
        __u16 flags;
#define I2C_M_TEN       0x10     we have a ten bit chip address
#define I2C_M_RD        0x01
#define I2C_M_NOSTART   0x4000
#define I2C_M_REV_DIR_ADDR      0x2000
#define I2C_M_IGNORE_NAK        0x1000
#define I2C_M_NO_RD_ACK         0x0800
        __u16 len;               msg length
        __u8 *buf;               pointer to msg data
};

В момента предавам 32-битов регистърен адрес, както е показано по-долу:

    buf[3] = reg_addr & 0xff;
    buf[2] = (reg_addr >> 8) & 0xff;
    buf[1] = (reg_addr >> 16) & 0xff;
    buf[0] = (reg_addr >>24) & 0xff;
 //buf[4,5...] = data;
    msg.buf = buf;

Ако адресът на регистъра е 16 бита, се изпълнява следният код:

    buf[1] = (reg_addr & 0xff);
    buf[0] = (reg_addr >> 8);
    buf[2] = data;
 // buf[2,3...] = data;

Как да уведомя устройството колко буферни масива съдържат адреса?

Освен това този код правилен ли е?

За съжаление в момента нямам I2C устройство за тестване.

Всяка помощ е добре дошла.

Благодаря.


person zacurry    schedule 26.03.2012    source източник


Отговори (1)


Командата I2C ще изпрати поток от байтове към устройството, избрано от I2C адреса. Изцяло зависи от устройството как ще ги интерпретира и трябва да прочетете листа с данни на устройството, за да разберете.

Например, разгледайте Atmel I2C EEPROM. Устройствата 512kBit или по-малко използват фиксиран 16-битов адрес, а 1MBit AT24C1024B използва 17-битов адрес. 16 бита от това се появяват в I2C командния поток, а MSB се кодира в адреса на I2C устройството.

person Adrian Cox    schedule 26.03.2012