maik-vs 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Так как слейв выставляет ACK только во время 9 импульса от мастера , то он так и будет его ждать, а мастер , если только не полный кретин , тупо передающий данные и ничего не проверяющий , не примет ACK и поступит согласно тому , что ему указано по сему поводу. Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 8 июня, 2012 Опубликовано 8 июня, 2012 · Жалоба Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами. Т.е плюнул на всех разработчиков шины и как захотел так и стал работать. Вы путаете работу мастера с привязкой CLK. Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK , но т.к. мастер освободил шину SDA - лог.1 в момент 9-го импульса, то теперь SDA принадлежит slave - нет конфликта встречных выходов . И по своему 9 импульсу он получит NACK . И взависимости от заданной Вами программы обработки ошибки выполнит какое-то действие. В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса. Но все эти обработки ack и nack нужны в большенстве случаем , когда мастер общается с себе подобным устройством. Когда с обеих сторон есть возможность принять действия к "откату" и повтору с наименьшими потерями. Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BeginnerAVR 0 9 июня, 2012 Опубликовано 9 июня, 2012 (изменено) · Жалоба Вопрос по библиотеке AVRLab. Функция i2cSlaveTransmitService в интернетах встречается везде в практически неизменном виде. 158 u08 i2cSlaveTransmitService(u08 transmitDataLengthMax, u08* transmitData) 159 { 160 u08 i; 167 169 for(i=0; i<localBufferLength; i++) 170 { 171 *transmitData++ = localBuffer[i]; 172 } 174 localBuffer[0]++; 176 return localBufferLength; 177 } Вопрос в слеующем: сколько бы не отправлял запросов от мастера, слейв отвечает, правда байтами 0xFF на всю длинну массива. master акает и, естественно, выводит массив из 0xFF. Пробовал заполнять localBuffer и в самой функции и до ее вызова. В чем может быть проблема? Изменено 9 июня, 2012 пользователем BeginnerAVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maik-vs 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Вы путаете работу мастера с привязкой CLK. Я не путаю, я плохо помню тонкости. Прошло время, подзабылось. Помню принципиальную причину зависаний, которые побоорол только обоюдными таймаутами. Помню, что такие же проболемы былы и у других людей. Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK Ответил! По окончании 8-го импульса он выставил ACK низким уровнем на линию данных. И ждёт 9-й импульс, по его окончанию он снимет этот свой АСК. А не дождётся: пропал импульс, сгинул в дороге. В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса. Здесь точно не помню, но опять-таки, если мастер и слейв сбились в подсчёте импульсов, то может возникнуть ситуация, когда слейв выдаёт нулевые биты, мастер ставит свой NAK, но в это время слейв передаёт 0. Слейв видит АСК и может держать линию данных как угодно долго, ожидая синхроимпульсов. Мастер, наверное, должен проверять свой собственный NAK, установился ли (через какое время? ёмкость линии никто не отменял). Не установился, что ему делать? Предлагают передать 9 синхроимпульсов и молиться. Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много. Я всё о наболевшем: слейв держит линию данных и не отпускает, какой стоп? Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BeginnerAVR 0 9 июня, 2012 Опубликовано 9 июня, 2012 (изменено) · Жалоба Понимаю, что я уже становлюсь здесь лишним. Как только все заработает, немножко попробую "гадить" в шину, чтобы смотреть как справлются с этим устройства. Отчет опубликую, но как только заработает. Может прокомментируете по поводу многократных 0xFF? Изменено 9 июня, 2012 пользователем BeginnerAVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Может прокомментируете по поводу многократных 0xFF? 1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами 2 Скорость шины Сформируйте только старт - проверьте ответит 0x08 Для Maik-vs А не дождётся: пропал импульс, сгинул в дороге. когда слейв выдаёт нулевые биты, мастер ставит свой NAK, но в это время слейв передаёт 0. Слейв видит АСК и может держать линию данных как угодно долго, ожидая синхроимпульсов. Ну это я проэммулирую , когда вернусь с дачи . Слава богу , что мастер не ставит NACK. за него это делают pull-up резисторы. Но давайте забудем про внешнии clock и вспомним , что они лишь проявление того , что происходит унутри мастера. А внутри у него всё хорошо все 9 импульсов он сформировал и получил ACK. Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ? Откуда взялось, ну точно не знаю , но было это давно. Помнится применял ещё на I8048, надо покапаться в старых тетрадях. Сейчас , я лично его использую при выходе из MENU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BeginnerAVR 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба 1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами 2 Скорость шины Сформируйте только старт - проверьте ответит 0x08 С правильностью подключения и скоростью все в порядке. Slave на прием работает как часики, но выдает только 0xFF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по А как сделать чтобы на запрос мастера, например, отправилось два байта со слейва. Какой должен быть алгоритм для master и slave? Тогда надо чуть-чуть изменить init мастера после запроса. Присвоить ему адрес ( хотя у Вас их только два проца) тогда проверьте TWAR - там должно быть 0х00 и TWGCE - установите в 1 - отзываться на всё что только можно. Далее slave должон передать адрес с префиксом W)- запись (закрепить своё превосходство ну и далее согласном протокола slave to master два байта. Ой забыл , ещё в TWCR мастера= 1<<TWEA|1<<TWEN Slave уже может стучаться к мастеру , но будет получать NACK , поэтому придётся подождать пока slave не получит ACK , а уж затем слать. Что собственно он может сделать когда ему заблагорассудится Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BeginnerAVR 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по Тогда надо чуть-чуть изменить init мастера после запроса. Присвоить ему адрес ( хотя у Вас их только два проца) тогда проверьте TWAR - там должно быть 0х00 и TWGCE - установите в 1 - отзываться на всё что только можно. Далее slave должон передать адрес с префиксом W)- запись (закрепить своё превосходство ну и далее согласном протокола slave to master два байта. Ой забыл , ещё в TWCR мастера= 1<<TWEA|1<<TWEN Спасибо. Пошукаю до флажков через UART. Если Вам доводилось писать что-то с i2c, Вы пользовались какими-либо библиотеками? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 9 июня, 2012 Опубликовано 9 июня, 2012 · Жалоба Вам доводилось писать что-то с i2c, Вы пользовались какими-либо библиотеками? Много , но преимущественно на asm , там всё просто и до предела ясно что происходит. Поищите поиском по форуму , может кто-то реализовывал такой режим на С . Я так особо не приглядывался. Но алгоритм прост , можете и сами написать. Мастер 1. Отослать запрос 2 TWAR= 0x01 3.TWCR = 1<<TWEA|1<<TWEN Занятся чем либо полезным, если включено прерывание TWI или мониторить TWSR на код $70 и если = 4.TWCR = 1<<TWEA|1<<TWEN|1<<TWINT Занятся чем либо полезным, если включено прерывание TWI или мониторить TWSR на код $90 и если = 5. Считать данные TWCR = 1<<TWEA|1<<TWEN|1<<TWINT Занятся чем либо полезным, если включено прерывание TWI или мониторить TWSR на код $90 и если = 5. Считать данные. Теперь главное!!! Отключить TWI , что бы slave не наглел. вернуть к исходному состоянию мастера - чисто библиотека ATMEL. Можно мониторить TWCR- состояние бита TWINT - а затем читать TWSR на код статуса. Slave 1. Получить запрос 2 . Оценить возложенную на него ответственность и подготовить 2 байта , если их ещё нет 3 . Ну далее тоже по библиотеке , он теперича мастер. 4. Отослать 2 байта. 5 Вернуть себе статус slave - обидно конечно. Но честно говоря не совсем понятно , если уж мастер спокойно записывает в slave, то и читать по префиксу чтение должен тоже спокойно. Смотрите , как у Вас обрабатывается запрос от мастера на чтение данных . Может он не из той ячейки берёт данные , а тама токмо $FF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BeginnerAVR 0 9 июня, 2012 Опубликовано 9 июня, 2012 (изменено) · Жалоба Много , но преимущественно на asm , там всё просто и до предела ясно что происходит. Поищите поиском по форуму , может кто-то реализовывал такой режим на С . Я так особо не приглядывался. Но алгоритм прост , можете и сами написать. Еще раз спасибо! На форуме решений собственного вопроса вопроса приближенных хотя бы на треть не нашел. Повторюсь. Есть примеры и обсуждения: мастер передает - слейв получает и мастер опрашивает разные микрухи и память. Если четно, то мне очень стыдно за свой полный тупизм с i2c. И, самое удивительное, не удалось найти гарантированно рабочих примеров с полнофункциональным слейвом под avrlib. Единственное, что нашел - рукописный пример на easyelectronics, правда в обрамлении RTOS. Мне советуют атмеловские аппноты. Вот и думаю что делать... 1. выковыривать изюм из булки RTOS 2. взять за основу аппноты 3. начать писать свое, поглядывая на все нагугленное? Изменено 9 июня, 2012 пользователем BeginnerAVR Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться