Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: чтение/запись регистров 88E1111 через I2C
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Fast Ethernet/Gigabit Ethernet/FibreChannel
salvian
Есть трансиверы Marvell Alaska 88E1111 связанные с I2C контроллером. Последовательности чтения/записи расписанные в datasheet'е работают с непонятными глюками, которые никак не могу забороть. Не мог бы кто нибудь выложить последовательности состояний и команд для чтения/записи 16-битных регистров которые работают на практике? Заранее признателен.
Victor®
Цитата(salvian @ Feb 5 2010, 12:42) *
Есть трансиверы Marvell Alaska 88E1111 связанные с I2C контроллером. Последовательности чтения/записи расписанные в datasheet'е работают с непонятными глюками, которые никак не могу забороть. Не мог бы кто нибудь выложить последовательности состояний и команд для чтения/записи 16-битных регистров которые работают на практике? Заранее признателен.


Используется именно TWSI? CONFIG6 bit в "1"?
На пине данных есть 1.5 kOhm pull-up?
salvian
Цитата(Victor® @ Feb 5 2010, 13:22) *
Используется именно TWSI? CONFIG6 bit в "1"?
На пине данных есть 1.5 kOhm pull-up?

Проблемы на более высоком уровне. То есть считать значение регистра я кое как могу, но проблемы следующие:
1. при операции "random read", судя по datasheet'у, необходимо дважды выполнить одну и ту же операцию, чтобы получить сначала старший, а потом младший байт регистра, я же читаю постоянно только старший. После такого я решил попробовать "sequential read"
2. при операции "sequential read" два байта регистра читаются, но каждая вторая операция завершается NACK'ом

я явно что то не допосылаю или наоборот шлю лишнего.

по поводу "random read" там сказано ещё про ""dummy" byte write", но когда именно и как это сделать понять не смог.
Victor®
Цитата(salvian @ Feb 5 2010, 15:04) *
Проблемы на более высоком уровне. То есть считать значение регистра я кое как могу, но проблемы следующие:
1. при операции "random read", судя по datasheet'у, необходимо дважды выполнить одну и ту же операцию, чтобы получить сначала старший, а потом младший байт регистра, я же читаю постоянно только старший. После такого я решил попробовать "sequential read"
2. при операции "sequential read" два байта регистра читаются, но каждая вторая операция завершается NACK'ом

я явно что то не допосылаю или наоборот шлю лишнего.

по поводу "random read" там сказано ещё про ""dummy" byte write", но когда именно и как это сделать понять не смог.


Для чипов ревизии B1 есть проблема при чтении регистров, если чип в слипе или повердауне.
Почитайте errata.
А вообще - гляньте осциллом что там твориться на самом деле.
salvian
Цитата(Victor® @ Feb 5 2010, 14:44) *
Для чипов ревизии B1 есть проблема при чтении регистров, если чип в слипе или повердауне.
Почитайте errata.
А вообще - гляньте осциллом что там твориться на самом деле.

Спасибо. Почитаю errata, посмотрю шину, отпишусь.
Victor®
Цитата(salvian @ Feb 5 2010, 15:50) *
Спасибо. Почитаю errata, посмотрю шину, отпишусь.


Не знаю какая ревизия у Вас
Поэтому смотрите еще в "Release Notes - 88E1111 Rev B2" пункт 3.4
salvian
Цитата(Victor® @ Feb 5 2010, 15:04) *
Не знаю какая ревизия у Вас
Поэтому смотрите еще в "Release Notes - 88E1111 Rev B2" пункт 3.4

Судя по тому, что содержимое регистров 2 и 3 соответственно 0х141 и 0хС20D, ревизия видимо 'D'. Но вот с OUI Marvell'а что то не то...

UPD: Если в первую очередь читать регистр 3 то читается 0x0CC2 как и должно. То есть в какой то момент происходит лишний сдвиг адреса на один байт.
Victor®
Цитата(salvian @ Feb 5 2010, 16:52) *
Судя по тому, что содержимое регистров 2 и 3 соответственно 0х141 и 0хС20D, ревизия видимо 'D'. Но вот с OUI Marvell'а что то не то...

UPD: Если в первую очередь читать регистр 3 то читается 0x0CC2 как и должно. То есть в какой то момент происходит лишний сдвиг адреса на один байт.


1111 есть ревизий A0, B0, B1, B2
Смотрите на 1 страницу в errata на B2.

Если лень - смотрите по маркировке на чипах.

Кстати, в последнем даташите - die revision начали обзывать custom code.
Перечитайте errata именно на ту ревизию, что используете.
Что показывает осцил?

-- успехов
AndreiUS
А почему нельзя использовать интерфейс MDIO? Запись, чтение реализовать на нем элементарно просто
и никаких глюков. Или все упирается именно в контроллер I2C?
salvian
Цитата(Victor® @ Feb 5 2010, 22:34) *
1111 есть ревизий A0, B0, B1, B2
Смотрите на 1 страницу в errata на B2.

Если лень - смотрите по маркировке на чипах.

Кстати, в последнем даташите - die revision начали обзывать custom code.
Перечитайте errata именно на ту ревизию, что используете.
Что показывает осцил?

-- успехов

Спасибо за разъяснения. Жду доступа к документации, старые userID и password почему то больше не валидны, как только получу буду подробно изучать.
Пока что чтение регистров работает если читать один лишний байт, бред конечно, но пока единственный способ. Запись пока не работает вообще. Смотрел алгоритмы записи с использованием других контроллеров, всё один в один, но при этом работает. Начинаю задумываться о несовместимости этих i2c контроллеров в принципе.
Смотрели асцилом, клок и данные абсолютно нормальны, ошибок не нашли. После прочтения errata'ы будем смотреть тщательнее.

Цитата(AndreiUS @ Feb 6 2010, 23:58) *
А почему нельзя использовать интерфейс MDIO? Запись, чтение реализовать на нем элементарно просто
и никаких глюков. Или все упирается именно в контроллер I2C?

В текущей ревизии платы i2c marvell'а повесили на i2c контроллер чипа NXP LPC2388, что, в принципе, весьма удобно, по крайней мере удобнее чем использовать самописный контроллер на ПЛИСе или вообще делать всё руками, если бы конечно не такие затыки.

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

UPD: Запись заработала! Был мой косяк в обработчике прерывания. Запись, по итогу работает как и расписано в даташите, а вот с чтением что то не так, но эта проблема терпит.

Коллеги, спасибо за помощь!!
man with no name
Необходимо шарить один 88e1111 между плисом и внешним (не в плисе) процессором. Можно ли в рантайме переключать мак-интерфейсы между sgmii и rgmii/gmii/mii? Вопрос предварительный, полные даташиты и ерраты ещё не вкуривал. Вдруг кто уже делал.

ЗЫ: большущее данке шон согражданам, поделившимся документацией.
Konst_777
Цитата(man with no name @ Dec 20 2010, 06:38) *
...
ЗЫ: большущее данке шон согражданам, поделившимся документацией.

Да, "большущее данке шон" Enthusiast a14.gif a14.gif a14.gif cheers.gif
vitan
Цитата(man with no name @ Dec 20 2010, 05:38) *
Необходимо шарить один 88e1111 между плисом и внешним (не в плисе) процессором. Можно ли в рантайме переключать мак-интерфейсы между sgmii и rgmii/gmii/mii? Вопрос предварительный, полные даташиты и ерраты ещё не вкуривал. Вдруг кто уже делал.

Скорее всего - нет, точнее, надо будет дергать сбросом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.