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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> AT91SAM7X I2C, Просто хотел поделиться...
aaarrr
сообщение Jun 21 2008, 00:16
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 21 2008, 03:44) *
Так сигналы на линии правильные или нет?

На вид - да, правильные. То есть, если запустить выбор слейва в цикле (Start->Addr->Stop), то на осциллографе наблюдается стабильная картинка с периодически пропадающим ACK. И так на любой скорости.

У меня этот эффект тоже вызвал недоумение.


Цитата(defunct @ Jun 21 2008, 03:44) *
Соглашусь. Но также согласитесь, что нормальный I2C слейв не должен вынуждать мастера ждать 100mks на ровном месте.

Не соглашусь: стандарт это позволяет, значит можно smile.gif

Цитата(defunct @ Jun 21 2008, 03:44) *
Промоделировать ситуацию с NACK'ом у меня не вышло. Предполагаю, что причина может быть связана с генерацией START'a.

Нет, START вроде как не при чем. На чтении дело обстоит еще хуже: при последовательном чтении группы регистров в какой-то момент времени SAA перестает передавать данные (скорее всего ловит STOP или NACK мастера).

Цитата(defunct @ Jun 21 2008, 03:44) *
А по работе с i2c слейвами с которыми работаю я, SAM'овский TWI мастер меня устраивает.

Меня тоже почти все устраивало до времени. С ним у меня вполне нормально работали EEPROM'ы разных производителей, далласовские часы, TI'шные кодеки... Я даже готов был с пеной у рта доказывать, что все в порядке и просто надо читать еррату smile.gif А вот в последнем проекте пришлось перейти на софтварную реализацию.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 21 2008, 00:23
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 03:16) *
На вид - да, правильные. То есть, если запустить выбор слейва в цикле (Start->Addr->Stop), то на осциллографе наблюдается стабильная картинка с периодически пропадающим ACK. И так на любой скорости.

Нет, START вроде как не при чем. На чтении дело обстоит еще хуже: при последовательном чтении группы регистров в какой-то момент времени SAA перестает передавать данные (скорее всего ловит STOP или NACK мастера).

Очень похоже на проблему фронтов/уровней сигналов.

Цитата
Не соглашусь: стандарт это позволяет, значит можно smile.gif

Если придерживаться стандарта, то в софтверной реализации надо реализовывать мониторинг SCL wink.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2008, 00:36
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 21 2008, 04:23) *
Очень похоже на проблему фронтов/уровней сигналов.

Фронты и уровни не зависят от реализации (SW/HW).

Цитата(defunct @ Jun 21 2008, 04:23) *
Если придерживаться стандарта, то в софтверной реализации надо реализовывать мониторинг SCL wink.gif

В девайсе с TVP5150 я так и сделал.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 21 2008, 01:13
Сообщение #19


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aaarrr @ Jun 21 2008, 03:36) *
Фронты и уровни не зависят от реализации (SW/HW).

В теории. А на практике имеем NACK без причины.

Цитата
То есть, если запустить выбор слейва в цикле (Start->Addr->Stop), то на осциллографе наблюдается стабильная картинка с периодически пропадающим ACK.

Я понимаю эту фразу так - мастер выдает всегда одинаковую форму сигналов на шине. Отличие только в таймфрейме ACK от слейва. Коль так, то слейву что-то не нравится и это что-то зарыто явно не в форме сигнала (иначе бы Вы заметили нестабильность). Значит на модуль грешить нельзя - его задача дать форму и он ее дает.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 21 2008, 10:33
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Детально я эту форму не изучал - для этого нужно записать "убитый" цикл и внимательно просмотреть,
а цифрового осциллографа у меня под рукой не было.

А грешить мне, кроме как на модуль, больше не на что.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 22 2008, 16:54
Сообщение #21


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(defunct @ Jun 21 2008, 02:52) *
В этом есть своя прелесть, меньше шансов подвесить систему слейвом. Да и нечего слейву тормозить транзакцию. Слейв должен укладываться в клок мастера, иначе - надо снижать скорость.

Цитата(defunct @ Jun 21 2008, 03:06) *
На мой взгляд это не проблема, и даже не фича, а то как должно быть.
Не успевает слейв, значит NACK и в сад такой слейв, и освободить шину для тех кто успевает.

Цитата(aaarrr @ Jun 21 2008, 03:20) *
Есть слейвы, которые принципиально всегда держат SCL при обращении к некоторым регистрам (TVP5150, например) - так что, в сад их всех?

Цитата(defunct @ Jun 21 2008, 03:28) *
там же есть I2C Timing Requirements
ставить подобающую скорость. (для TVPS5150 - 15kHz для тех регистров которые тормозят).

Цитата(aaarrr @ Jun 21 2008, 03:40) *
Согласитесь, что нормальный I2C-контроллер не должен вынуждать пользователя заниматься такими извращениями - ронять скорость обмена в 30 раз.

ИМХО:
- I2C статическая шина просто по определению
- попросы подвешивания шины должны решаться механизмами таймаутов как на стороне мастера
так и на стороне слейва(особенно при софтовой реализации слейва)
- исходя из статической природы I2C обязателен мониторинг SCL мастером
- снижение скорости шины(для устройств которы не готовы отвечать мгновенно) только уменьшит
пропускную способность всей шины
ИМХО, конкретный пример:
- слейв - микроконтроллер
- запрос от мастера может иметь разную длинну
- при получении запроса от мастера слейв должен чего-нить сделать(банально скопировать
запрошенные данные в буфер обмена)
- время готовности слейва зависит от типа(длинны)/сущности запроса
Цитата
Собсно программный I2C (надежный как бревно) разве чем-то отличается? Тоже синхронный.
Или кто-то мониторит SCL?

По стандарту, мониторить SCL есть прямая обязанность мастера.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 29 2008, 01:43
Сообщение #22


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(singlskv @ Jun 22 2008, 19:54) *
ИМХО:
- I2C статическая шина просто по определению
- вопросы подвешивания шины должны решаться механизмами таймаутов как на стороне мастера
так и на стороне слейва(особенно при софтовой реализации слейва)
- исходя из статической природы I2C обязателен мониторинг SCL мастером
- снижение скорости шины(для устройств которы не готовы отвечать мгновенно) только уменьшит

Наблюдал однако как LPC с его абсолютно правильным I2C модулем подвисал из-за того, что слейв передерживал SCL. И приходилось переинициализировать модуль.
Поэтому тормозные слейвы лучше сразу в сад. Природа обмена IMHO должна быть синхронной, чтобы мастер с множеством других девайсов на шине никак не зависел от конкретного одного слейва.
И я очень рад, что в SAM синхронный модуль.

Цитата
ИМХО, конкретный пример:
- слейв - микроконтроллер
- запрос от мастера может иметь разную длинну
- при получении запроса от мастера слейв должен чего-нить сделать(банально скопировать
запрошенные данные в буфер обмена)
- время готовности слейва зависит от типа(длинны)/сущности запроса


Пример не убедительный. Предложу свой протокол, который решает проблемы задержек при обмене МК-МК.
типы транзакций:
1. Команда (от мастера к слейву)
2. Ответ (от слейва к мастеру)
3. Индикатор (от слейва к мастеру)
4. Подтверждение индикатора (от мастера к слейву) по формату то же что и "1".

Теперь как это работает.
A. каждый пакет начинается байтом длины (что накладывает ограничение на длину пакета - 255)
B. от мастера к слейву - никаких проблем, мастер просто передает блок данных, слейв просто принимает и складывает по прерыванию каждый байт данных. (уж положить байт в буфер не бог весть какая задача, если программа сделана без delay_ms в обработчиках прерываний, то ACK слейв сформировать без задержек успеет).
C. По приему всего пакета слейв начинает его разбор. Столько веремени сколько нужно. Мастер в это время волен общаться с другим слейвом.

D. мастер забирает ответ слейва или индикатор (от слейва к мастеру).
- Если у слейва есть что отправить (команда выполнена есть подготовленный к отправке "ответ", или есть запрос к мастеру "индикатор"), то первым байтом слейв передает длину блока. Мастер инициализирует счетчик ожидаемых байт и продолжает прием, зная когда надо отправить NACK на последный байт.
- Если у слейва ответ не подготовлен, то он сразу шлет 0 без разбора, мастер ставит NACK, вытаскивает еще один байт данных, завершает обмен. И переходит к другому слейву.

Вот и все, все синхронно и никаких задержек.

PS: в моей системе мастер выполняет роль маршрутизатора (принимает данные с одного быстрого канала и шлет (направляет пакеты) на несколько до 64х медленных каналов, которые обслуживаются I2C слейвами mega'ми). Мастер раздает команды всем слейвам, потом забирает ответы.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 29 2008, 12:15
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(defunct @ Jun 29 2008, 05:43) *
Природа обмена IMHO должна быть синхронной, чтобы мастер с множеством других девайсов на шине никак не зависел от конкретного одного слейва.
И я очень рад, что в SAM синхронный модуль.

Правильно: забьем на стандарт, сделаем свой глючный и несовместимый модуль и назовем его TWI, чтобы еще и денег платить не пришлось sad.gif
Go to the top of the page
 
+Quote Post
Andrew Lekar
сообщение Sep 10 2009, 17:40
Сообщение #24


Участник
*

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



Цитата
Если придерживаться стандарта, то в софтверной реализации надо реализовывать мониторинг SCL

В девайсе с TVP5150 я так и сделал.

Я так понял, исходя из беседы, что аппаратный TWI в AT91SAMxxx глючноват, тем более применимо к TVP5150/SAA71xx. А я как раз собираюсь подключить TVP5150 к SAM9260. Рано или поздно я его конечно запущу, но чтобы не наступать на грабли, не дадите ли ссылку на приличный софтовый I2C и общих рекомендаций по стыкованию?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 10 2009, 17:51
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Andrew Lekar @ Sep 10 2009, 21:40) *
Рано или поздно я его конечно запущу, но чтобы не наступать на грабли, не дадите ли ссылку на приличный софтовый I2C и общих рекомендаций по стыкованию?

Рекомендации по стыкованию есть в доках от TI, а простой софтовый I2C написать - пара-тройка часов работы.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:02
Рейтинг@Mail.ru


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