почему i2cset отправляет дополнительные байты? - PullRequest
0 голосов
/ 27 сентября 2018

Я работаю над чипом PIC18F55K42 некоторое время.PIC настроен как ведомый, и он правильно получает байты.Но я столкнулся с несколькими проблемами.

Например, когда я делаю:

i2cset -y 1 0x54 0x80 0x01

Это выглядит правильно на стороне контроллера, и я вижу адрес 0x80 (адрес данных) и значение байта0x01.

Когда я отправляю в режиме блокировки, например:

i2cset -y 1 0x54 0x80 0x01 0x02 0x03 0x04 i

Я вижу ложные байты, появляющиеся на контроллере.Точнее, это выглядит так:

ADDRESS 80 6c 00 2f 01 02 03 04 STOP

Salae Logic Analyser trace

Сначала я подумал, что это как-то связано с моим контроллером, и даже попытался закопать егонастройки часов.Использовал логический анализатор Salae тоже.Там нет ничего плохого с контроллером или он настроен.Единственное место, о котором я могу думать, - это сложное распределение драйверов лука, которое выполняет Linux.

Я хотел бы знать, почему Linux отправляет 3 дополнительных байта (6c 00 2f).Почему i2c_smbus_write_block_data отправляет дополнительные байты и как этого избежать?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Это ошибка в реализации i2cset в Busybox.См. miscutils/i2c_tools.c:

    /* Prepare the value(s) to be written according to current mode. */
    switch (mode) {
    case I2C_SMBUS_BYTE_DATA:
        val = xstrtou_range(argv[3], 0, 0, 0xff);
        break;
    case I2C_SMBUS_WORD_DATA:
        val = xstrtou_range(argv[3], 0, 0, 0xffff);
        break;
    case I2C_SMBUS_BLOCK_DATA:
    case I2C_SMBUS_I2C_BLOCK_DATA:
        for (blen = 3; blen < (argc - 1); blen++)
            block[blen] = xstrtou_range(argv[blen], 0, 0, 0xff);
        val = -1;
        break;
    default:
        val = -1;
        break;
    }

Должно быть block[blen - 3] = xstrtou_range(argv[blen], 0, 0, 0xff);.В результате ошибки отправляется 3 лишних байта из стека.

0 голосов
/ 27 сентября 2018

Использование i2c_smbus_write_i2c_block_data для необработанных передач i2c

i2c_smbus_write_block_data выполняет передачу данных по протоколу SMBUS

...