Безопасна ли принудительная связь I2C?

Для проекта, над которым я работаю, мне нужно общаться с многофункциональным чипом через I2C. Я могу сделать это из пользовательского пространства Linux через интерфейс I2C /dev/i2c-1.

Однако кажется, что драйвер одновременно разговаривает с одним и тем же чипом. Это приводит к тому, что мой доступ к I2C_SLAVE завершается с ошибкой с ошибкой EBUSY. Что ж, я могу переопределить это через ioctl I2C_SLAVE_FORCE. Я попробовал, и это работает. Мои команды доходят до чипа.

Вопрос: Безопасно ли это делать? Я точно знаю, что диапазоны адресов, которые я пишу, никогда не доступны ни одному драйверу ядра. Однако я не уверен, что форсирование связи I2C таким образом может сбить с толку какой-то внутренний конечный автомат или что-то в этом роде (я не это в I2C, я просто использую его...)

Для справки, аппаратные факты:

 OS:           Linux
 Architecture: TI OMAP3 3530
 I2C-Chip:     TWL4030 (does power, audio, usb and lots of other things..)

person Nils Pipenbrinck    schedule 31.12.2009    source источник
comment
Вы пытались задать этот вопрос на chiphacker.com? Это сайт, похожий на SO, но для электроники (хотя и не такой активный, как сам SO).   -  person Wim    schedule 03.01.2010


Ответы (2)


Я не знаю этот конкретный чип, но часто у вас есть команды, требующие последовательности операций записи, сначала по одному адресу для установки определенного режима, затем вы читаете или записываете другой адрес, где функция второго адреса изменяется в зависимости от то, что вы написали первому. Таким образом, если драйвер находится в середине одной из этих операций, а вы прерываете ее (или наоборот), возникает состояние гонки, которое будет трудно отладить. Для надежного решения вам лучше общаться через драйвер чипа...

person Wim    schedule 31.12.2009
comment
Как мы справимся с этой проблемой, если пишем драйвер чипа. Насколько я понимаю, я использую I2C_SLAVE и I2C_SLAVE_FORCE в коде драйвера моего чипа. Так целесообразно ли использовать I2C_SLAVE_FORCE в коде драйвера чипа? - person saurabh agarwal; 25.05.2015

Я в основном согласен с @Wim. Но я хотел бы добавить, что это определенно может вызвать необратимые проблемы или разрушение, в зависимости от устройства.

Я знаю гироскоп (L3GD20), который требует, чтобы вы не писали в определенные места. В зависимости от того, как настроен чип, эти места содержат настройки производителя, которые определяют, как устройство работает и работает.

Это может показаться легкой проблемой, которую можно избежать, но если вы думаете о том, как работает I2C, все байты передаются по одному биту за раз. Если вы прервете передачу другого байта в середине, результаты могут быть не только действительно непредсказуемыми, но и экспоненциально увеличить риск необратимого повреждения. Это, конечно, полностью зависит от того, как справиться с проблемой.

Поскольку микроконтроллеры, как правило, работают на скоростях, намного превышающих скорости шины, разрешенные для I2C, и поскольку сами скорости шины являются динамическими в зависимости от скоростей, с которыми устройства обрабатывают информацию, лучше всего вставлять паузы или циклы между передачами, которые ожидают дела закончить. Если вам нужно, вы даже можете вставить тайм-аут. Если эти паузы не работают, значит что-то не так с реализацией.

person Bobby    schedule 07.03.2014