реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как отправить даные Master со Slave? I2C
Maik-vs
сообщение Jun 8 2012, 08:02
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(ILYAUL @ Jun 8 2012, 00:04) *
Так как слейв выставляет ACK только во время 9 импульса от мастера , то он так и будет его ждать, а мастер , если только не полный кретин , тупо передающий данные и ничего не проверяющий , не примет ACK и поступит согласно тому , что ему указано по сему поводу.


Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 8 2012, 08:57
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Maik-vs @ Jun 8 2012, 12:02) *
Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами.

Т.е плюнул на всех разработчиков шины и как захотел так и стал работать. Вы путаете работу мастера с привязкой CLK. Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK , но т.к. мастер освободил шину SDA - лог.1 в момент 9-го импульса, то теперь SDA принадлежит slave - нет конфликта встречных выходов . И по своему 9 импульсу он получит NACK . И взависимости от заданной Вами программы обработки ошибки выполнит какое-то действие.
В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса.
Но все эти обработки ack и nack нужны в большенстве случаем , когда мастер общается с себе подобным устройством. Когда с обеих сторон есть возможность принять действия к "откату" и повтору с наименьшими потерями. Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 9 2012, 06:50
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 26-10-11
Пользователь №: 67 972



Вопрос по библиотеке 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 - Jun 9 2012, 06:52
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 9 2012, 11:54
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(ILYAUL @ Jun 8 2012, 12:57) *
Вы путаете работу мастера с привязкой CLK.

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

Цитата(ILYAUL @ Jun 8 2012, 12:57) *
Для себя мастер сформировал все 9 тактов , физически slave получил 8 и не ответил мастеру ACK

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

Цитата(ILYAUL @ Jun 8 2012, 12:57) *
В работе в режиме чтения , после выдачи адреса с режимом чтения, мастер освобождает шину , но продолжает выдавать clock , по которым slave выдает данные на шину, затем мастер на 9-ом перехватывает шину и шлёт ведомому ACK или NACK. Данные на шине считаются верными только в течении high длительности импульса.

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

Цитата(ILYAUL @ Jun 8 2012, 12:57) *
Для простых slave легче сформировать Stop и повторить обмен, если данных от него не много.

Я всё о наболевшем: слейв держит линию данных и не отпускает, какой стоп?
Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ?
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 9 2012, 14:05
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 26-10-11
Пользователь №: 67 972



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

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

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


Сообщение отредактировал BeginnerAVR - Jun 9 2012, 14:06
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 9 2012, 17:02
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(BeginnerAVR @ Jun 9 2012, 18:05) *
Может прокомментируете по поводу многократных 0xFF?

1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами
2 Скорость шины
Сформируйте только старт - проверьте ответит 0x08

Для Maik-vs

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

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

Ну это я проэммулирую , когда вернусь с дачи .
Слава богу , что мастер не ставит NACK. за него это делают pull-up резисторы. Но давайте забудем про внешнии clock и вспомним , что они лишь проявление того , что происходит унутри мастера.
А внутри у него всё хорошо все 9 импульсов он сформировал и получил ACK.
Цитата
Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ?

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 9 2012, 17:56
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 26-10-11
Пользователь №: 67 972



Цитата(ILYAUL @ Jun 9 2012, 21:02) *
1. Проверьте не перепутали подключение SDA SCL не только глазами и правильность подключения но и тестером если печатка с переходами
2 Скорость шины
Сформируйте только старт - проверьте ответит 0x08



С правильностью подключения и скоростью все в порядке.
Slave на прием работает как часики, но выдает только 0xFF
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 9 2012, 18:22
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по
Цитата
А как сделать чтобы на запрос мастера, например, отправилось два байта со слейва.
Какой должен быть алгоритм для master и slave?

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

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

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 9 2012, 18:57
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 26-10-11
Пользователь №: 67 972



Цитата(ILYAUL @ Jun 9 2012, 22:22) *
Я так понимаю , что вы хотите релизовать режим , при котором мастер после запроса становился "ведомым приёмником" судя по

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

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


Спасибо. Пошукаю до флажков через UART. Если Вам доводилось писать что-то с i2c, Вы пользовались какими-либо библиотеками?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 9 2012, 19:54
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 9 2012, 20:55
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 26-10-11
Пользователь №: 67 972



Цитата(ILYAUL @ Jun 9 2012, 23:54) *
Много , но преимущественно на asm , там всё просто и до предела ясно что происходит. Поищите поиском по форуму , может кто-то реализовывал такой режим на С . Я так особо не приглядывался.
Но алгоритм прост , можете и сами написать.


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

Если четно, то мне очень стыдно за свой полный тупизм с i2c.
И, самое удивительное, не удалось найти гарантированно рабочих примеров с полнофункциональным слейвом под avrlib.
Единственное, что нашел - рукописный пример на easyelectronics, правда в обрамлении RTOS.
Мне советуют атмеловские аппноты.
Вот и думаю что делать...
1. выковыривать изюм из булки RTOS
2. взять за основу аппноты
3. начать писать свое, поглядывая на все нагугленное?

Сообщение отредактировал BeginnerAVR - Jun 9 2012, 20:56
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 13:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016