Вопрос к знатокам I2C/TWI и библиотеки WIRE

Тема в разделе "Arduino & Shields", создана пользователем Paul_S, 23 май 2016.

  1. Paul_S

    Paul_S Нуб

    Доброго времени суток.
    Вопрос заключается в следующем: реализован ли арбитраж нескольких мастеров-ардуин в библиотеке WIRE?

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

    Скетчи стандартные из примеров библиотеки, только данные изменены.
     
  2. Alex19

    Alex19 Гуру

    Не являюсь знатоком в данном вопросе, как и не работаю стандартной библиотекой. Так же, не работал с несколькими мастерами.

    Но Вы без труда сможете ознакомится с кодом библиотеки Wire - https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/libraries/Wire/src. В частности файл - https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/libraries/Wire/src/utility/twi.c, обработчик прерывания TWI - ISR(TWI_vect).

    А там switch с проверкой статусных регистров, нас интересует следующий case.
    Код (C++):
    case TW_MT_ARB_LOST: // lost bus arbitration
          twi_error = TW_MT_ARB_LOST;
          twi_releaseBus();
          break;
     
    Тут происходит обработка потери арбитража. Дальше идем и смотрим, по коду.

    Почитайте отличную статью - http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-avr-twi-dlya-raboty-s-shinoj-iic-i2c.html, там рассказывается о TWI, а так же потери арбитража и готовая библиотека (не уверен, что она подходит Вам, не знаю что Вы делаете, можно будет просто глянуть реализацию), автор DI HALT.

    Так же посмотрите pdf от Вашего контролера, к примеру на UNO\Nano - http://www.atmel.com/images/atmel-8...pa-168a-168pa-328-328p_datasheet_complete.pdf пункт 22.4 стр. 210. Глава по арбитражу и синхронизации.
     
  3. Paul_S

    Paul_S Нуб

    Спасибо, погляжу, где вы указали.
    Со статьей на easyelectronics знаком, но библиотеку не видел, прочту еще раз.

    В архиве форума http://forum.arduino.cc/index.php?topic=131666.0 нашел следующую запись:
    ... but the Wire library does not support the multi-master feature. The AVR hardware does support it but to use it you have to write your own library. Запись от 2012 года. Может что изменилось, а может и нет)

    По результатам отпишусь.
     
  4. Alex19

    Alex19 Гуру

    Не за что, посмотрите внимательнее возможно это именно то, что Вам нужно.

    Из комментариев, прочтите и их.
    Лучше смотреть код, но на форуме не ошиблись.
    Код (C++):
    void twi_releaseBus(void)
    {
      // release bus
      TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);

      // update twi state
      twi_state = TWI_READY;
    }
    Вы можете исправить данную библиотеку или можете использовать другую к примеру для AVR (сам пользуюсь измененной AVR315, только сейчас заметил, что там тоже присутствует арбитраж:)).

    Код.
    Код (C++):

    case TWI_ARB_LOST:  
        // Сбрасываем флаг TWINT, формируем повторный СТАРТ.
        TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWSTA);
        break;
     
    По сути дела, тут происходит сбрасывание флага прерывания и повторный старт, когда шина освободится. В статье на easyelectronics, аналогично, кроме мелочей. У нее больше возможностей к примеру работа в режиме Master\Stave тогда как AVR315 заточена под Master.

    Удачи!
     
    Последнее редактирование: 24 май 2016
  5. Paul_S

    Paul_S Нуб

    Спасибо, буду копать код.