Доброго времени суток. Вопрос заключается в следующем: реализован ли арбитраж нескольких мастеров-ардуин в библиотеке WIRE? При создании подключения мастер-слэйв передача данных идет без сбоев, но при подключении двух мастеров на линию, передача данных прекращается. Осцилограф показывает лежащую линию CL и постоянную частоту на линии DA. Передачу можно восстановить, перезагрузив один из мастеров (причем только ток, у кого нули в передаче раньше). Я так понимаю, что мастера мешают передаче друг друга. Скетчи стандартные из примеров библиотеки, только данные изменены.
Не являюсь знатоком в данном вопросе, как и не работаю стандартной библиотекой. Так же, не работал с несколькими мастерами. Но Вы без труда сможете ознакомится с кодом библиотеки 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. Глава по арбитражу и синхронизации.
Спасибо, погляжу, где вы указали. Со статьей на 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 года. Может что изменилось, а может и нет) По результатам отпишусь.
Не за что, посмотрите внимательнее возможно это именно то, что Вам нужно. Из комментариев, прочтите и их. Лучше смотреть код, но на форуме не ошиблись. Код (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. Удачи!