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

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


Участник
*

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



Доброго времени суток!

Объясните, люди добрые, новичку, что и как...
Два AVR связаны по I2C. Мастер отправляет инфу - слейв принимает. Все ок.
А как сделать чтобы на запрос мастера, например, отправилось два байта со слейва.

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

Пользуюсь готовым интерфейсником i2c.c
// Title : I2C interface using AVR Two-Wire Interface (TWI) hardware
// Author : Pascal Stang - Copyright © 2002-2003

Может кто-то уже реализовывал I2C с этой библиотекой?



Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 2 2012, 21:47
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(BeginnerAVR @ Jun 3 2012, 00:08) *
Доброго времени суток!

Объясните, люди добрые, новичку, что и как...
Два AVR связаны по I2C. Мастер отправляет инфу - слейв принимает. Все ок.
А как сделать чтобы на запрос мастера, например, отправилось два байта со слейва.

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

Алгоритм должен быть... стандартный.
Почитаете про I2C и увидите что там всё довольно однообразно сделано.
Например здесь: TWI по русски
или тут.
Так же инфа есть тут: ApNotes.


Цитата(BeginnerAVR @ Jun 3 2012, 00:08) *
// Title : I2C interface using AVR Two-Wire Interface (TWI) hardware
// Author : Pascal Stang - Copyright © 2002-2003

Может кто-то уже реализовывал I2C с этой библиотекой?

Procyon AVRlib? Известная библиотека, наверное кто-нибудь и использовал.
Куча примеров кода с разными вариантами использования TWI (Slave/Master для mega/xmega/tiny)есть на сайте Atmel-а. Может оказаться что проще взять готовое оттуда, а не использовать Procyon AVRlib, который давно не обновляется. Я брал их код для TWI Master на xmega256 - нормально всё работало и написано неплохо.
Выбирать вам.
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 2 2012, 22:32
Сообщение #3


Участник
*

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



Цитата(_Артём_ @ Jun 3 2012, 01:47) *
Алгоритм должен быть... стандартный.
Почитаете про I2C и увидите что там всё довольно однообразно сделано.
Например здесь: TWI по русски
или тут.
Так же инфа есть тут: ApNotes.

Procyon AVRlib? Известная библиотека, наверное кто-нибудь и использовал.
Куча примеров кода с разными вариантами использования TWI (Slave/Master для mega/xmega/tiny)есть на сайте Atmel-а. Может оказаться что проще взять готовое оттуда, а не использовать Procyon AVRlib, который давно не обновляется. Я брал их код для TWI Master на xmega256 - нормально всё работало и написано неплохо.
Выбирать вам.



Сейчас понимаю, что связаться с i2C было ошибкой. БОЛЬШОЙ ошибкой. Две недели впустую. Купился на то, что с двумя проводами платы разводить легче, если дофига чего висит на шине. Получилось, что эта шина развела меня, а не я платы.
А если подумать, может Вы действительно правы и стоит взять за основу архар... атмеловские апноты. А еще лучше - сменить хобби... раз не дано. thanks
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 3 2012, 00:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(BeginnerAVR @ Jun 3 2012, 01:32) *
Сейчас понимаю, что связаться с i2C было ошибкой. БОЛЬШОЙ ошибкой.

Почему же?
В общем нормальная шина и даже довольно быстрая.
Хотя и сам предпочитаю SPI или UART. Они проще.

Цитата(BeginnerAVR @ Jun 3 2012, 01:32) *
Две недели впустую. Купился на то, что с двумя проводами платы разводить легче, если дофига чего висит на шине. Получилось, что эта шина развела меня, а не я платы.

Что-то не работает?
Возможно не соблюдены какие-то требования.
TWI AVR вполне рабочая штука и Master и Slave и MultiMaster.

Цитата(BeginnerAVR @ Jun 3 2012, 01:32) *
А если подумать, может Вы действительно правы и стоит взять за основу архар... атмеловские апноты.

Не знаю какой у вас МК.
Работал с TWI давно на megaAVR с EEPROM - писал реализацию сам, вобщем ничего сложного.
И недавно xmega+акселерометр - взял готовые библиотеки от атмел: неплохо написано и работает.

Цитата(BeginnerAVR @ Jun 3 2012, 01:32) *
А еще лучше - сменить хобби... раз не дано. thanks

Ну всего-то две недели... и такие выводы.
Бывает и месяцы безрезультата проходят...
Или код написаный несколько лет назад нужно переделывать (а сейчас, через несколько лет на него смотреть страшно и противно) и не только переделывать а ещё добавлять что-то новое и чтоб тоже работало.
Ничего, не надо драм.
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 3 2012, 08:40
Сообщение #5


Участник
*

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



Цитата(_Артём_ @ Jun 3 2012, 04:27) *
Почему же?
В общем нормальная шина и даже довольно быстрая.
Хотя и сам предпочитаю SPI или UART. Они проще.


Согласен.
Если бы у меня было образование соответствующее, то количество моих вопросов
на форуме может быть и вообще равно 0x00.

Цитата
Что-то не работает?
Возможно не соблюдены какие-то требования.
TWI AVR вполне рабочая штука и Master и Slave и MultiMaster.


На рабочих примерах и той же пресловутой симуляции, плавно начинаю въезжать как это происходит.
Можно отследить шину, посмотреть как и что.

Цитата
Не знаю какой у вас МК.
Работал с TWI давно на megaAVR с EEPROM - писал реализацию сам, вобщем ничего сложного.
И недавно xmega+акселерометр - взял готовые библиотеки от атмел: неплохо написано и работает.


с внешним EEPROM у меня получается работать. Преимущество этих штуковин заключается в том,
что часть автоматики они берут на себя.
А вот когда mega vs mega.
Камешки разные. Тестирую обычно на мегах начиная с 8 до 128.

Цитата
Ну всего-то две недели... и такие выводы.
Бывает и месяцы безрезультата проходят...
Или код написаный несколько лет назад нужно переделывать (а сейчас, через несколько лет на него смотреть страшно и противно) и не только переделывать а ещё добавлять что-то новое и чтоб тоже работало.
Ничего, не надо драм.


Дело в том, что максимальное время, нужное для того, чтобы что-то прикрутить к меге - пару дней. Интернетов хватало,
на форум лезть надобности не было.
Дисплеи от нокии вообще махом (Благо там был полностью рабочий пример с протеусом, который так любят ругать).
Всегда добиваюсь того, чтобы работало не только в камне, но и в Proteus. Это принципиальный момент.

Неделя - уже утомительно. Две - внеземная технология. NACK.

С тем, что возвращаться к давно сделанному коду не особо приятно - целиком и полностью согласен.
Периодически писал довольно серьезные программы, правда на Delphi (стаж несколько лет), включая openGL, иногда переписывал с нуля.
На С что-то переписать обычно не сложно, просто нет гарантии, что пример был работающий и как минимум без особенностей.

Резюмируя: По сути дела с этим i2c нужен просто максимально ПОЛНЫЙ интерфейсник без специфических залипов к конкретному компилятору
(чтобы потом не переходить на другой) с кучей примеров, где камешки общаются промеж собой во всех режимах, посылают друг друга NACK.

Ограниченное использование i2c применительно к чему-то одному - естественно проще.

Сообщение отредактировал BeginnerAVR - Jun 3 2012, 15:22
Go to the top of the page
 
+Quote Post
LexaK
сообщение Jun 4 2012, 05:19
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 3-12-06
Из: Новороссийск
Пользователь №: 23 082



Вот рабочий проект OSD на mega8. В нем реализован I2C slave.
Там есть то, что вам нужно - как два байта переслать sm.gif

Прикрепленные файлы
Прикрепленный файл  OSD.zip ( 15.91 килобайт ) Кол-во скачиваний: 70
 
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 4 2012, 22:06
Сообщение #7


Участник
*

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



Цитата(LexaK @ Jun 4 2012, 09:19) *
Вот рабочий проект OSD на mega8. В нем реализован I2C slave.
Там есть то, что вам нужно - как два байта переслать sm.gif


Тут круче даже. Можно юзать VGA дисплей, правда в разрешении CGA/EGA.
И даже буквы местные есть. Thanks.
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 5 2012, 04:17
Сообщение #8


Местный
***

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



Цитата
Сейчас понимаю, что связаться с i2C было ошибкой. БОЛЬШОЙ ошибкой.

Посмотрите, как устроены телевизоры/мониторы, и вам станет легче. Не для лишней мороки Филипс изобрели IIS, уж поверьте.

Цитата
Если бы у меня было образование соответствующее, то количество моих вопросов
на форуме может быть и вообще равно 0x00.

Вовсе нет, круг знаний больше - больше и граница незнаемого. Просто ваши вопросы были бы не очень понятны beginner'ам sm.gif

Цитата
Всегда добиваюсь того, чтобы работало не только в камне, но и в Proteus. Это принципиальный момент.

Зачем?!! Вы что-то должны протеусу? Любой симулятор - всего лишь модель. "Работать должно в корпусе, а не в принципе" - вот фраза, выкованная жизнью.

Как мастер вытаскивает данные со слейва, написано,например, в документе UM10204 "I2C-bus specification and user manual".
Мастер посылает слейву старт, потом адрес с признаком чтения и гонит снихроимпульсы. Слейв подставляет данные, а если не успевает, может "прижать" синхроимпульс, тогда мастер ждёт. После каждого байта мастер даёт АСК, а когда наелся - NAK. Вот и всё.

Из мануала: "For additional information, please visit: http://www.nxp.com"

Сообщение отредактировал Maik-vs - Jun 5 2012, 04:40
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 5 2012, 21:05
Сообщение #9


Участник
*

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



Цитата(Maik-vs @ Jun 5 2012, 08:17) *
Посмотрите, как устроены телевизоры/мониторы, и вам станет легче. Не для лишней мороки Филипс изобрели IIS, уж поверьте.


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

Цитата(Maik-vs @ Jun 5 2012, 08:17) *
Вовсе нет, круг знаний больше - больше и граница незнаемого. Просто ваши вопросы были бы не очень понятны beginner'ам sm.gif


Чем больше знаний, тем развитее интуиция в плане изысканий. Уже не нужно спрашивать, иногда достаточно клочка кода, заветной строчки и дальше
можно не читать. Сужу, правда по программированию, и все-таки, практика возни с электроникой частично подтверждает.

Цитата(Maik-vs @ Jun 5 2012, 08:17) *
Зачем?!! Вы что-то должны протеусу? Любой симулятор - всего лишь модель. "Работать должно в корпусе, а не в принципе" - вот фраза, выкованная жизнью.


До камня я пложу на диске варианты схемы, модифицируя конструктив и код, решаю как лучше подключить, что следует заложить на будущее чего-либо еще.
Согласен, что до настоящего реалтайма и точности ему все далеко, однако по сравнению со сбокой макетки - удобнее. Дебаггеры шин, например, мне очень помогли. Видно что передано, что получено.
Это сугубо частное мнение, без претензий на "абсолютную правильность".


Цитата(Maik-vs @ Jun 5 2012, 08:17) *
Как мастер вытаскивает данные со слейва, написано,например, в документе UM10204 "I2C-bus specification and user manual".
Из мануала: "For additional information, please visit: http://www.nxp.com"


Читал, он мне снится уже.

Цитата(Maik-vs @ Jun 5 2012, 08:17) *
Мастер посылает слейву старт, потом адрес с признаком чтения и гонит снихроимпульсы. Слейв подставляет данные, а если не успевает, может "прижать" синхроимпульс, тогда мастер ждёт. После каждого байта мастер даёт АСК, а когда наелся - NAK. Вот и всё.


Вот! Золотые слова. Последовательность "на пальцах". И именно такое описание шины ИДЕАЛЬНО подходит чтобы понять ее суть, дальше - детали.
Уверен, что преподаватели в ВУЗах не начинают нести крутой бред про i2c, а сначала объясняют в общих чертах.
А то в статьях все сразу пытаются в одном абзаце объять необъятное и впихнуть не... Потом сразу идет раздел "СТАРТ И СТОП", потом "АДРЕСАЦИЯ"...
Если начать с простого описания - то все легче, понятнее, предсказуемее.
Maik-vs, спасибо. Нужно было написать вопрос две недели назад и получить ваш ответ, сохранив тем самым две недели и нервы.

Сообщение отредактировал BeginnerAVR - Jun 5 2012, 21:25
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 7 2012, 06:09
Сообщение #10


Местный
***

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



Цитата(BeginnerAVR @ Jun 6 2012, 01:05) *
Нужно было написать вопрос две недели назад и получить ваш ответ, сохранив тем самым две недели и нервы.

Это вряд ли. Я тогда искал как сделать, чтобы окно, сделанное в MFC С++ оставалось "живым" на длинных операциях и как покрасить строку в листбоксе. Весь в компе/интернете, только ноги наружу торчали sm.gif

Ещё про IIC.

Совершенно непонятно, зачем им сущность "рестарт". Ну старт и старт, нет, надо обозвать одно и то же разными словами.

И неприятный глюк, про который аппноты молчат.
Например, мастер пишет в слейв. И пропал один синхроимпульс. Слейв выставляет свой АСК, а мастер уже обмен закончил. Всё, линия данных заблокирована. Или наоборот, мастер читает со солейва. Помеха прибежала, лишний синхроимпульс. Слейв может никогда не увидеть NAK от мастера, останется в цикле чтения и засадит шину данных в 0.
Словом, любая рассинхронизация счётчиков битов мастера и слейва может привести к катастрофическому зависанию.

Поэтому вторая версия протокола предусматривает ограничение скорости обмена снизу, или проще говоря тайм-ауты, которые должны бдить все устройства на шине. Нет синхроимпульсов в течение заданного времени - работу долой, шину освободить, ждать старта.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Jun 7 2012, 10:31
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(Maik-vs @ Jun 7 2012, 10:09) *
Совершенно непонятно, зачем им сущность "рестарт". Ну старт и старт, нет, надо обозвать одно и то же разными словами.

Для изменения направления передачи, ведь при чтении сначала идет запись адреса, а потом уже чтение. А старт-стоп подразумевают определенный алгоритм, т.ч. это не одно и то же.
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 7 2012, 12:00
Сообщение #12


Местный
***

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



Цитата(DmitryM @ Jun 7 2012, 14:31) *
Для изменения направления передачи, ведь при чтении сначала идет запись адреса, а потом уже чтение. А старт-стоп подразумевают определенный алгоритм, т.ч. это не одно и то же.

И что же, я не могу передать несколько рестартов? Могу. Кто из них тогда "старт" а кто "рестарт"? Нет разницы. И без "стопа" можно спокойно обойтись.
Go to the top of the page
 
+Quote Post
BeginnerAVR
сообщение Jun 7 2012, 13:14
Сообщение #13


Участник
*

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



Цитата(Maik-vs @ Jun 7 2012, 10:09) *
Это вряд ли. Я тогда искал как сделать, чтобы окно, сделанное в MFC С++ оставалось "живым" на длинных операциях и как покрасить строку в листбоксе. Весь в компе/интернете, только ноги наружу торчали sm.gif


Для ЯВУ (в отличие от микроконтроллеров) полно FAQ-cборников, где по направлениям разбиты "финты ушами", в том числе покраски VCL и прочие шалости.
Для AVR такого не найти в принципе. Думаю, это связано с тем, что программистов больше, чем инженеров и это менее затратное хобби увлечение

Цитата(Maik-vs @ Jun 7 2012, 10:09) *
Ещё про IIC.
Совершенно непонятно, зачем им сущность "рестарт". Ну старт и старт, нет, надо обозвать одно и то же разными словами.
И неприятный глюк, про который аппноты молчат.
Например, мастер пишет в слейв. И пропал один синхроимпульс. Слейв выставляет свой АСК, а мастер уже обмен закончил. Всё, линия данных заблокирована. Или наоборот, мастер читает со солейва. Помеха прибежала, лишний синхроимпульс. Слейв может никогда не увидеть NAK от мастера, останется в цикле чтения и засадит шину данных в 0.
Словом, любая рассинхронизация счётчиков битов мастера и слейва может привести к катастрофическому зависанию.
Поэтому вторая версия протокола предусматривает ограничение скорости обмена снизу, или проще говоря тайм-ауты, которые должны бдить все устройства на шине. Нет синхроимпульсов в течение заданного времени - работу долой, шину освободить, ждать старта.


Автомат TWI в AVR конечно здорово, но легче от этого не становится если взять обработку всех флагов через прерывание и учесть многообразие внештатных ситуаций, подсчета числа попыток, повторных попыток, то половину прошивки будет занимать только работа с шиной. Поэтому примеров связи двух AVR по i2c с многочисленными отправками/приемами практически нет...
Обычно - лишь опросы мастером на AVR разной периферии, в которой i2c реализован и тысячу раз проверен разработчиками.
На форумах очень часто пишут: "master сделал, а вот на разработке slave груз поймал"...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 7 2012, 13:47
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(BeginnerAVR @ Jun 7 2012, 16:14) *
Автомат TWI в AVR конечно здорово, но легче от этого не становится если взять обработку всех флагов через прерывание и учесть многообразие внештатных ситуаций, подсчета числа попыток, повторных попыток, то половину прошивки будет занимать только работа с шиной. Поэтому примеров связи двух AVR по i2c с многочисленными отправками/приемами практически нет...
Обычно - лишь опросы мастером на AVR разной периферии, в которой i2c реализован и тысячу раз проверен разработчиками.
На форумах очень часто пишут: "master сделал, а вот на разработке slave груз поймал"...

AVR310. Using the USI module as a I2C master on tinyAVR and megaAVR devices
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 7 2012, 20:04
Сообщение #15


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

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



Цитата
Например, мастер пишет в слейв. И пропал один синхроимпульс. Слейв выставляет свой АСК, а мастер уже обмен закончил. Всё, линия данных заблокирована

Так как слейв выставляет ACK только во время 9 импульса от мастера , то он так и будет его ждать, а мастер , если только не полный кретин , тупо передающий данные и ничего не проверяющий , не примет ACK и поступит согласно тому , что ему указано по сему поводу.
Цитата
Или наоборот, мастер читает со солейва. Помеха прибежала, лишний синхроимпульс. Слейв может никогда не увидеть NAK от мастера, останется в цикле чтения и засадит шину данных в 0.

Слейв - чего с него возьмёшь , получил 9 импульсов и рад , а то что один лишний , ему начхать. Мастер же даже не заметил , что кто-то сделал за него его работу и после NACK сформирует STOP.


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

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
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 - 17:23
Рейтинг@Mail.ru


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