|
|
  |
Olimex/Startetkit LPC23/4 + RMII KS8721BL, Баги в схеме :( |
|
|
|
Jul 5 2011, 18:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sasamy @ Jul 5 2011, 17:45)  Какой-то индусокод. Представьте что адрес не 1 или 2 а 31 - сколько эта херня будет циклы накручивать с задержками ? Если не умеете считать, то порядка 128ms на адрес. Один раз при инициализации. Зато будет найден любой. При необходимости экономить время и использовании 31 адреса все может быть постфактум скорректировано в конкретном рабочем исходнике. Именно такой подход к делу для ДЕМО кода является нормальным в отличии от забивания конкретного адреса, причем без комментариев, что это адрес. QUOTE Лучше нормальные открытые проекты изучайте. Нормальных открытых нет. Один с относительно нормальным уровнем драйвера я уже в этом топике поминал.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 19:30
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sasamy @ Jul 5 2011, 21:56)  можно было в цикле заслать сброс по всем адресам без задержек, а потом.... В результате получим много большую задержку для начального ОЖИДАЕМОГО адреса и более замысловатый код и более сложный для правки с целью получить из этого демо рабочий вариант. Единственно, что, пожалуй следует изменить, это явно дефинировать ожидаемый адрес. Где-то так: CODE #define DEFAULT_PHY_ADDR (1) for( phy_addr = DEFAULT_PHY_ADDR;; ) { // Put PHY in reset mode write_PHY( PHY_REG_BMCR, BMCR_RESET ); // Wait for hardware reset to end for( int i = 0; i < 128; i++ ) { vSmartDelay_ms( 1 ); if( !(read_PHY( PHY_REG_BMCR ) & BMCR_RESET) ) { // Reset complete goto phy_found; } } phy_addr = ( phy_addr + 1 ) & 0x1F; if( phy_addr == DEFAULT_PHY_ADDR ) { printst( "PHY:Missing " ); return( 1 ); } } Достаточно изменить DEFAULT_PHY_ADDR на желаемый и получаем максимально быстрый рабочий вариант, который тем не менее обеспечит поиск при запуске демки или каких-то монтажных ошибок
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 20:16
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 5 2011, 23:30)  В результате получим много большую задержку для начального ОЖИДАЕМОГО адреса и более замысловатый код и более сложный для правки с целью получить из этого демо рабочий вариант. Вы о чем вообще ? вот ваш подправленый код Код for (phy_addr = 1; phy_addr <= 31; phy_addr++) // Put PHY in reset mode write_PHY(PHY_REG_BMCR, BMCR_RESET);
phy_addr = 1;
for (int i = 0; i < 128; i++) { if (!(read_PHY( PHY_REG_BMCR ) & BMCR_RESET)) // Reset complete goto phy_found; vSmartDelay_ms(1); } for (phy_addr = 2; phy_addr <= 31; phy_addr++) { if (!(read_PHY(PHY_REG_BMCR) & BMCR_RESET)) goto phy_found; } printst("PHY:Missing "); return (1); phy_found: Цитата for( phy_addr = DEFAULT_PHY_ADDR;; ) Это вообще цирк - зачем тогда поиск адреса нужен
Сообщение отредактировал sasamy - Jul 5 2011, 20:21
|
|
|
|
|
Jul 5 2011, 20:20
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sasamy @ Jul 5 2011, 23:16)  Вы о чем вообще ? О том, что написал. QUOTE вот ваш подправленый код Я понял Вашу мысль и достаточно четко на мой взгляд написал, почему меня такая правка НЕ устраивает. Подправленный код тоже привел. Ознакомьтесь для начала.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 20:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (sasamy @ Jul 5 2011, 23:24)  в общем это очередная индусятина бла, бла, бла.... QUOTE собственно то что вы ставили во главу сначала (а это перебрать и найти ЛЮБОЙ адрес даже если ошибка в физике) вдруг отошло на второй план Было и есть на переднем плане. Во главе угла нормально без лишних рассылок ресетов и прочих ЛИШНИХ телодвижений инициализировать PHY. Если вдруг PHY не нашелся на том адресе, на котором должен быть, то тогда искать. Это НЕ штатный режим и время не имеет значения. Значение-же, для той-же демки имеет понятность и минимально-достаточное количество действий при инициализации. Дивная посылка кучи НЕНУЖНЫХ ресетов может в демке разве только сбить с толку читающего и замаскировать ту самую необходимо-достаточную процедуру инициализации PHY. Кстати, о времени, vSmartDelay_ms() это при работающем шедулере и не при вызове из Idle не задержка, а переключение на другую задачу. До кучи у меня нет зависимости от наличия в функции write_PHY() ожидания окончания транзакции. Отсутствие такого ожидания тоже встречалось в халявных демках  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 21:34
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(aaarrr @ Jul 6 2011, 01:20)  Ваше "исправление" смотрится гораздо более убого "очередной индусятины", ибо не предполагает удобную смену дефолтного адреса, коли уж на то пошло. Еще один. Для нервнодышащих, вот исходное сообщение http://electronix.ru/forum/index.php?showt...st&p=947034покажите мне - какой там дефолтный адрес. Если он так нужен - пожалуйста, смысл ведь не в этом. Код #define DEFAULT_PHY_ADDR (1)
for (phy_addr = 1; phy_addr <= 31; phy_addr++) // Put PHY in reset mode write_PHY(PHY_REG_BMCR, BMCR_RESET);
phy_addr = DEFAULT_PHY_ADDR;
for (int i = 0; i < 128; i++) { if (!(read_PHY( PHY_REG_BMCR ) & BMCR_RESET)) // Reset complete goto phy_found; vSmartDelay_ms(1); } for (phy_addr = 1; phy_addr <= 31; phy_addr++) { if ((phy_addr != DEFAULT_PHY_ADDR) && (!(read_PHY(PHY_REG_BMCR) & BMCR_RESET))) goto phy_found; } printst("PHY:Missing "); return (1); phy_found:
|
|
|
|
|
Jul 5 2011, 21:54
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(aaarrr @ Jul 6 2011, 01:43)  Я разве сказал, что мне нравится исходный код? Не знаю - я ответил на конкретное предложение про дефолтный адрес невесть откуда взявшийся. Цитата я не вижу причины без нужды дергать software reset. Ну и не дергайте Цитата Но ситуацию это не меняет - ваше исправление менее убого исходного варианта, но явно хуже аналогичного от автора. Индусятина-с. Собственно исправление автора еще более убого чем начальный вариант - он теряет смысл, потому что весь диапазон адресов не будет проверен. А вы если делаете громкие заявления - не поленитесь привести свой код, иначе они звучат как пшик индуса
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|