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

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

Насколько я знаю, адрес устройства и данные вместе передаются в устройство с использованием одного и того же буфера buf в структуре i2c_msg, определенной в драйвере Linux i2c:

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. То, как оно их интерпретирует, полностью зависит от устройства, и вам нужно прочитать техническое описание устройства, чтобы узнать об этом.

Например, рассмотрим EEPROM Atmel I2C. Устройства 512 Кбит или меньше используют фиксированный 16-битный адрес, а 1 Мбит AT24C1024B использует 17-битный адрес. адрес. 16 бит появляются в потоке команд I2C, а старший бит кодируется в адресе устройства I2C.

person Adrian Cox    schedule 26.03.2012