Перейти к содержанию
    

Как отправить даные Master со Slave? I2C

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

 

Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами.

Т.е плюнул на всех разработчиков шины и как захотел так и стал работать. Вы путаете работу мастера с привязкой CLK. Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK , но т.к. мастер освободил шину SDA - лог.1 в момент 9-го импульса, то теперь SDA принадлежит slave - нет конфликта встречных выходов . И по своему 9 импульсу он получит NACK . И взависимости от заданной Вами программы обработки ошибки выполнит какое-то действие.

В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса.

Но все эти обработки ack и nack нужны в большенстве случаем , когда мастер общается с себе подобным устройством. Когда с обеих сторон есть возможность принять действия к "откату" и повтору с наименьшими потерями. Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос по библиотеке 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 и в самой функции и до ее вызова.

В чем может быть проблема?

Изменено пользователем BeginnerAVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы путаете работу мастера с привязкой CLK.

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

 

Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK

Ответил! По окончании 8-го импульса он выставил ACK низким уровнем на линию данных. И ждёт 9-й импульс, по его окончанию он снимет этот свой АСК. А не дождётся: пропал импульс, сгинул в дороге.

 

В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса.

Здесь точно не помню, но опять-таки, если мастер и слейв сбились в подсчёте импульсов, то может возникнуть ситуация, когда слейв выдаёт нулевые биты, мастер ставит свой NAK, но в это время слейв передаёт 0. Слейв видит АСК и может держать линию данных как угодно долго, ожидая синхроимпульсов. Мастер, наверное, должен проверять свой собственный NAK, установился ли (через какое время? ёмкость линии никто не отменял). Не установился, что ему делать? Предлагают передать 9 синхроимпульсов и молиться.

 

Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много.

Я всё о наболевшем: слейв держит линию данных и не отпускает, какой стоп?

Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понимаю, что я уже становлюсь здесь лишним.

 

Как только все заработает, немножко попробую "гадить" в шину, чтобы смотреть

как справлются с этим устройства. Отчет опубликую, но как только заработает.

 

Может прокомментируете по поводу многократных 0xFF?

 

Изменено пользователем BeginnerAVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может прокомментируете по поводу многократных 0xFF?

1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами

2 Скорость шины

Сформируйте только старт - проверьте ответит 0x08

 

Для Maik-vs

 

А не дождётся: пропал импульс, сгинул в дороге.

когда слейв выдаёт нулевые биты, мастер ставит свой NAK, но в это время слейв передаёт 0. Слейв видит АСК и может держать линию данных как угодно долго, ожидая синхроимпульсов.

Ну это я проэммулирую , когда вернусь с дачи .

Слава богу , что мастер не ставит NACK. за него это делают pull-up резисторы. Но давайте забудем про внешнии clock и вспомним , что они лишь проявление того , что происходит унутри мастера.

А внутри у него всё хорошо все 9 импульсов он сформировал и получил ACK.

Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ?

Откуда взялось, ну точно не знаю , но было это давно. Помнится применял ещё на I8048, надо покапаться в старых тетрадях. Сейчас , я лично его использую при выходе из MENU.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами

2 Скорость шины

Сформируйте только старт - проверьте ответит 0x08

 

 

С правильностью подключения и скоростью все в порядке.

Slave на прием работает как часики, но выдает только 0xFF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по

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

Какой должен быть алгоритм для master и slave?

Тогда надо чуть-чуть изменить init мастера после запроса. Присвоить ему адрес ( хотя у Вас их только два проца) тогда проверьте TWAR - там должно быть 0х00 и TWGCE - установите в 1 - отзываться на всё что только можно. Далее slave должон передать адрес с префиксом W)- запись (закрепить своё превосходство ну и далее согласном протокола slave to master два байта.

 

Ой забыл , ещё в TWCR мастера= 1<<TWEA|1<<TWEN

 

Slave уже может стучаться к мастеру , но будет получать NACK , поэтому придётся подождать пока slave не получит ACK , а уж затем слать. Что собственно он может сделать когда ему заблагорассудится

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по

 

Тогда надо чуть-чуть изменить init мастера после запроса. Присвоить ему адрес ( хотя у Вас их только два проца) тогда проверьте TWAR - там должно быть 0х00 и TWGCE - установите в 1 - отзываться на всё что только можно. Далее slave должон передать адрес с префиксом W)- запись (закрепить своё превосходство ну и далее согласном протокола slave to master два байта.

 

Ой забыл , ещё в TWCR мастера= 1<<TWEA|1<<TWEN

 

Спасибо. Пошукаю до флажков через UART. Если Вам доводилось писать что-то с i2c, Вы пользовались какими-либо библиотеками?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам доводилось писать что-то с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Много , но преимущественно на asm , там всё просто и до предела ясно что происходит. Поищите поиском по форуму , может кто-то реализовывал такой режим на С . Я так особо не приглядывался.

Но алгоритм прост , можете и сами написать.

 

Еще раз спасибо!

На форуме решений собственного вопроса вопроса приближенных хотя бы на треть не нашел.

Повторюсь. Есть примеры и обсуждения: мастер передает - слейв получает и мастер опрашивает разные микрухи и память.

 

Если четно, то мне очень стыдно за свой полный тупизм с i2c.

И, самое удивительное, не удалось найти гарантированно рабочих примеров с полнофункциональным слейвом под avrlib.

Единственное, что нашел - рукописный пример на easyelectronics, правда в обрамлении RTOS.

Мне советуют атмеловские аппноты.

Вот и думаю что делать...

1. выковыривать изюм из булки RTOS

2. взять за основу аппноты

3. начать писать свое, поглядывая на все нагугленное?

Изменено пользователем BeginnerAVR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...