I2c переменного размера читает Raspberry - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь связать A71CH с Raspberry PI 3 через i2c, устройство требует повторных запусков, и когда делается запрос на чтение, первый отправляемый устройством байт всегда равен длине всего сообщения.Когда я пытаюсь выполнить чтение, вместо чтения сообщения фиксированного размера, я хочу прочитать первый байт, а затем отправить сигнал NACK на ведомое устройство после получения определенного количества байтов, которое указано первым байтом.Я использовал следующий код, но не смог получить ожидаемые результаты, потому что он читает только один байт, чем посылает сигнал NACK, как вы можете видеть ниже.

struct i2c_rdwr_ioctl_data packets;
struct i2c_msg messages[2];
int r = 0;
int i = 0;

if (bus != I2C_BUS_0) // change if bus 0 is not the correct bus
{
    printf("axI2CWriteRead on wrong bus %x (addr %x)\n", bus, addr);
}

messages[0].addr  = axSmDevice_addr;
messages[0].flags = 0;
messages[0].len   = txLen;
messages[0].buf   = pTx;

// NOTE:
// By setting the 'I2C_M_RECV_LEN' bit in 'messages[1].flags' one ensures
// the I2C Block Read feature is used.
messages[1].addr  = axSmDevice_addr;
messages[1].flags = I2C_M_RD | I2C_M_RECV_LEN|I2C_M_IGNORE_NAK;
messages[1].len   = 256;
messages[1].buf   = pRx;
messages[1].buf[0] = 1;

// NOTE:
// By passing the two message structures via the packets structure as
// a parameter to the ioctl call one ensures a Repeated Start is triggered.
packets.msgs      = messages;
packets.nmsgs     = 2;

// Send the request to the kernel and get the result back
r = ioctl(axSmDevice, I2C_RDWR, &packets);

Signals

Есть ли способ, позволяющий мне делать чтения i2c переменного размера?Что я могу сделать, чтобы это работало?Спасибо за поиск.

1 Ответ

0 голосов
/ 28 марта 2019

Raspbery не поддерживает чтение блоков SMBUS, единственный способ преодолеть это состоит в том, чтобы делать битовые удары по выводам GPIO.Как упомянул выше @Ian Abbott, мне удалось изменить функцию bbI2CZip в соответствии с моими потребностями, проверив первый байт полученного сообщения и обновив длину чтения после этого.

...