• Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
Вторник, 22 ноября 2022 16:39

Зависание шины i2c

Шина I2C очень удобна тем, что всего по двум проводам (не считая питания) можно подключить много датчиков и устройств одновременно. При этом она проста в реализации и модуль I2C есть практически во всех микроконтроллерах. Есть даже реализация "ногодрыгом". Но иногда бывает ситуация когда шина зависает. Датчик может захватить шину до выключения прибора или сброса. В этой статье расскажу как легко оживить зависшую шину.

Первый раз я столкнулся с этой проблемой когда делал прибор Измеритель УФ-индекса. Было удобно подключать к нему различные внешние датчики. Но когда я это делал, то прибор зависал. Позже, когда я делал квадрокоптер, то увидел код сброса шины и попробовал его - работало все отлично!

Итак, как же правильно сбросить шину до рабочего состояния. Оказалось - очень легко. Нужно установить линию данных SDA на вход (то есть не прижимать ее к LOW) - это будет сигнал NACK для датчика. И сделать 9 импульсов подряд на линии SCL. Для этого выводы нужно переключить в режим "ногодрыга", подать эти сигналы и вернуть шину в режим работы с перефирией. Вот нужный код на си:

  //выключаем модуль
  i2c_peripheral_disable(i2c);

  //SCL на выход , SDA на вход PUSH PULL
  gpio_setup_output(I2C1_GPIO_PORT, I2C1_GPIO_SCL);
  gpio_setup_input(I2C1_GPIO_PORT, I2C1_GPIO_SDA);

  //10 сигналов клок
  for (int i=0; i<10;i++) {
    i2c_scl_toggle(i2c);
    delay(10);//10us мкс
  }

  //выключаем клок на LOW
  i2c_scl_set(i2c);

  //включаем ноги на управление модулем
  i2c_setup_gpio(i2c);

  //сброс модуля МК
  i2c_reset(i2c);

  //включаем все обратно
  i2c_peripheral_enable(i2c);

Теперь, если шина часто зависает или прибор должен надежно отрабатывать все зависания, ты знаешь что делать.

Read 917 times