Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Olimex/Startetkit LPC23/4 + RMII KS8721BL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
zltigo
Во всех китах Olimex и Starterkit для чипов LPC23xx и LPC24xx ошибка в подключении PHY KS8721BL в RMII Mode. К контроллеру подключен сигнал CRS (Carrier Sense), а не RXDV(CRS_DV - Carrier Sense/Data Valid). Результат плачевен - все фреймы принимаются с якобы битой CRC. Кстати, там по хорошему надо-бы этот сигнальчик к земле подтянуть, а то со встроенной в LPC PU подтяжкой при Reset потенциально могут быть проблемы.

P.S.
Поражает пофигизм разработчиков в обработке ошибок - описанные киты давно уже в продаже, на них написано всяких разных демок-приложений вплоть до Linux, а обрабатывать ошибки sad.gif, получается не заморачивается никто особо sad.gif. Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина......
Quasar
Цитата(zltigo @ Sep 24 2008, 16:04) *
Во всех китах Olimex и Starterkit для чипов LPC23xx и LPC24xx ошибка в подключении PHY KS8721BL в RMII Mode. К контроллеру подключен сигнал CRS (Carrier Sense), а не RXDV(CRS_DV - Carrier Sense/Data Valid). Результат плачевен - все фреймы принимаются с якобы битой CRC. Кстати, там по хорошему надо-бы этот сигнальчик к земле подтянуть, а то со встроенной в LPC PU подтяжкой при Reset потенциально могут быть проблемы.

P.S.
Поражает пофигизм разработчиков в обработке ошибок - описанные киты давно уже в продаже, на них написано всяких разных демок-приложений вплоть до Linux, а обрабатывать ошибки sad.gif, получается не заморачивается никто особо sad.gif. Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина......


Да.Да.Да...
Я с этим тоже столкнулся, понял что проблема аппаратная, в чем точно так и не понял...lwIP постоянно дропал часть пакетов....
Только не все фреймы, а бОльшая часть фреймов длинной более 150-200 байт...
smile.gif
zltigo
Цитата(Quasar @ Sep 25 2008, 21:18) *
Я с этим тоже столкнулся, понял что проблема аппаратная, в чем точно так и не понял...lwIP постоянно дропал часть пакетов....
Только не все фреймы, а бОльшая часть фреймов длинной более 150-200 байт...

"Битые" абсолютно все фреймы, а причину надо смотреть вне lwIP а в том, какой ""драйвер"" MAC прикручен - обычно халтура игнорирующая все и вся. Единственное встретившиеся исключение лицензионный NXP/NicheLite. Если дадите ссылку - посмотрю.
Quasar
Цитата(zltigo @ Sep 25 2008, 23:24) *
"Битые" абсолютно все фреймы, а причину надо смотреть вне lwIP а в том, какой ""драйвер"" MAC прикручен - обычно халтура игнорирующая все и вся. Единственное встретившиеся исключение лицензионный NXP/NicheLite. Если дадите ссылку - посмотрю.



Ну вот у меня эта халтура и используется smile.gif . Фрейм принимается с битым CRC и неверной длинной. На битый CRC кладётся...неверная длина передается выше...ну и отваливается на каком-нибудь TCP или при просчете CRC в ICMP...
Сейчас на своей плате поправил это дело, теперь всё OK smile.gif .
Vitaliy_ARM
Хорошо, что в свое время я купил демоплату у Embedded артистов smile.gif.
Пытаюсь избавиться от этих KSZ8001/8721. Ни у кого не завалялось схемы включения более нового KSZ8041 c LPC или еще каким-нибудь процессором?
zltigo
Цитата(Vitaliy_ARM @ Sep 26 2008, 16:07) *
Ни у кого не завалялось схемы включения более нового KSZ8041 c LPC или еще каким-нибудь процессором?

Если не SMI Так совершенно обыденое MII/RMII подключение "как всегда".
Vitaliy_ARM
Цитата(zltigo @ Sep 26 2008, 19:08) *
Если не SMI Так совершенно обыденое MII/RMII подключение "как всегда".


Смущает отсутствие VDDRCV входа у микросхемы. На трансформатор в среднюю точку какое питание заводить? 3,3V или питание ядра?
zltigo
Цитата(Vitaliy_ARM @ Sep 27 2008, 13:15) *
На трансформатор в среднюю точку какое питание заводить? 3,3V или питание ядра?

VDDA_3,3, а документацию, включая документацию на Evalboard что мешает у Micrel взять?
Vitaliy_ARM
Цитата(zltigo @ Sep 27 2008, 15:58) *
VDDA_3,3, а документацию, включая документацию на Evalboard что мешает у Micrel взять?


На EvalBord что-то не получилось. Вроде они должны были на маил прислать, но не прислали.
Или почта сбоит.

Спасибо. Этого достаточно.
zltigo
Цитата(Vitaliy_ARM @ Sep 27 2008, 15:03) *
На EvalBord что-то не получилось.

???
http://www.micrel.com/_PDF/Ethernet/ethern...signkit/8041NL/
lebiga
Цитата(zltigo @ Sep 24 2008, 15:04) *
Во всех китах Olimex и Starterkit для чипов LPC23xx и LPC24xx ошибка в подключении PHY KS8721BL в RMII Mode. К контроллеру подключен сигнал CRS (Carrier Sense), а не RXDV(CRS_DV - Carrier Sense/Data Valid). Результат плачевен - все фреймы принимаются с якобы битой CRC. Кстати, там по хорошему надо-бы этот сигнальчик к земле подтянуть, а то со встроенной в LPC PU подтяжкой при Reset потенциально могут быть проблемы.

P.S.
Поражает пофигизм разработчиков в обработке ошибок - описанные киты давно уже в продаже, на них написано всяких разных демок-приложений вплоть до Linux, а обрабатывать ошибки sad.gif, получается не заморачивается никто особо sad.gif. Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина......


Так вот где собака порылась! А я на себя грешил... Ошибки CRC в lwip стеке постоянно присутствали,
обойти удалось так - в файле ethernetif.c в функции low_lewel_input увеличил длину считываемого фрейма на 4
len = StartReadFrame()+4;
и все заработало, т.е. дочитываю контрольную сумму. Установил это через анализ пакетов передаваемых по сети и принятых в стек
Правда, не уверен - корректно ли все это... может есть еще какие-то засады?

И еще - с платами стартеркит - работает ли Ethernet с установленной частотой процессора больше 50МГц? У меня глохнет начальная инициализация PHY на процедуре сброса. Проверял на нескольких платах, с частотами ниже 50МГц все ок. Может это и проблема из-за подтяжки вышесказанного сигнала?
zltigo
Цитата(lebiga @ Oct 1 2008, 09:26) *
И еще - с платами стартеркит - работает ли Ethernet с установленной частотой процессора больше 50МГц? У меня глохнет начальная инициализация PHY на процедуре сброса. Проверял на нескольких платах, с частотами ниже 50МГц все ок.

Да на 72MHz работает. Вопросы
- какая ревизия чипа с точки зрения наличия бага с ограничением скорости работы из Flash
- а какой делитель прописывается в MCFG. Надо 28 - MIIM у Micrel максимум на 2.5MHz "типично" работает. Я "автоматически"
подбираю под CPU при инициализации.
- как там у Вас всякие задержечки-прокладочки организованы?
Цитата
Может это и проблема из-за подтяжки вышесказанного сигнала?

Нет, подтяжка для того, что-бы при power on не свалился в хрен знает какой режим в котром просто глухо не достучаться до него.
lebiga
Цитата(zltigo @ Oct 1 2008, 10:36) *
Да на 72MHz работает. Вопроса два - какая ревизия чипа с точки зрения наличия бага с ограничением скорости работы из Flash
- а какой делитель прописывается в MCFG. Надо 28 - MIIM у Micrel максимум на 2.5MHz "типично" работает. Я "автоматически"
подбираю под CPU при инициализации.
- как там у Вас всякие задержечки-прокладочки организованы?

Нет, подтяжка для того, что-бы при power on не свалился в хрен знает какой режим в котром просто глухо не достучаться до него.

Делитель 28
задержки ставил, не помогает
это все в самом начале - подается команда сброса в микрел - и ответа нет никогда...
с mam тоже игрался, проц ревизии В
zltigo
Цитата(lebiga @ Oct 1 2008, 09:57) *
это все в самом начале - подается команда сброса в микрел - и ответа нет никогда...

Ну чего-то намудрено у Вас.
CODE

//---------------------------------------------------------------------------
// Initialize the PHY chip
// Performs the following steps:
// 1.Determines PHY address
// 2.Resets PHY
// 3.Sets PHY clock
// 4.Sets Line speed (auto-negotiation if selected)
//---------------------------------------------------------------------------
int init_phy(void)
{
bint phy_reg;

MCFG = MCFG_HCLK_DIV_28|MCFG_RESET_MII_MGMT;
vSmartDelay_ms( 2 );

#if( EMAC_CFG_RMII == 0 )
MCOMMAND &= ~CR_RMII;
#else
MCOMMAND |= CR_RMII;
#if defined __IOLPC2458_H
SUPP = SUPP_RESET_MII;
#else
SUPP = 0; // Assume and configure RMII link speed logic for 10Mbit
#endif
#endif

for( int i = 0; i < 7; i++ )
{ // Check dividers to yield MII frequency ~2.5 MHz
if( ( (configCPU_CLOCK_HZ/100000L)/mii_dividers[i][0] ) <= 25 )
{ // Index [i][0] = decimal div value, [i][1] = MCFG reg val
MCFG = mii_dividers[i][1]; // Remove reset, set proper MIIM divider
break;
}
}
vSmartDelay_ms( 10 ); // Short delay while PHY exits reset and new divider is set

for( phy_addr = 0; phy_addr < 32; 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;
}
}
}
printst( "PHY:None" );
return( 1 );

phy_found:
{
// Check if this is a valid PHY
ulong id_phy = (read_PHY( PHY_REG_IDR1 )<<16)|read_PHY( PHY_REG_IDR2 );
if( id_phy == KS8721BL_ID )
xprintf( "PHY%02u:KS8721BL ", phy_addr );
else
{ xprintf( "PHY%02u:%08X ", phy_addr, id_phy );
return( 2 );
}
}

..........





void write_PHY( bint phyreg, bint value )
{
MADR = (phy_addr<<8) | phyreg;
MWTD = value;
// Wait utill operation completed
for( int tout = 0; tout < MII_WR_TOUT; tout++ )
{
if( ( MIND & MIND_BUSY ) == 0 )
break;
}
}

bint read_PHY( bint phyreg )
{
MADR = (phy_addr<<8) | phyreg;
MCMD = MCMD_READ;

// Wait until operation completed
for( int tout = 0; tout < MII_RD_TOUT; tout++ )
{ if( (MIND & (MIND_BUSY|MIND_NOT_VALID) ) == 0 )
{ MCMD = 0;
return( MRDD );
}
}
return( 0 );
}
lebiga
Да, сам себя накрутил, где-то взял этот код... Когда стоял DM9161A - проблем небыло, поставил KS8721 -
возникла...

MCFG= MCFG_RES_MII | 0x01C0; //div 28
MCFG &= ~MCFG_RES_MII; - убрал эту строку - и заработало на 72Мгц
virfis
У меня olimex LPC-E2468 с KS8721BL не проходит инициализацию. Исходники взял оn IAR EWARM 5.20. Проект uip_webserver.
При чтении регистра PHYSTS (0x0010) выдает всегда 0. В чем может быть дело?
defunct
На практике действительно так нужен RMII?
PHY только с MII стоит в 2-4 раза дешевле.
aaarrr
За наличие RMII и версии с индустриальным диапазоном, например. Впрочем, есть нормальные PHY за те же деньги, что и RTL8201.
defunct
Я нашел эту разницу и пост удалил. Поворчал по другому поводу. ;>
virfis
В чем разница RMII и MII? Может у меня поэтому не инициализируется?
mdmitry
Цитата(virfis @ Oct 17 2008, 12:03) *
В чем разница RMII и MII? Может у меня поэтому не инициализируется?

Это два разных режима работы PHY, естественно, и инициализация должна быть соответствующей. Отличие первого в меньшем числе используемых линий для передачи данных (в 2 раза), но скорость работы по линиям выше в 2 раза. Почитайте описание микросхемы, там должны быть описаны эти режимы.

У iosifk есть станица персональная, с которой есть ссылки на статьи об этом интерфейсе.
Alexandro
Цитата(aaarrr @ Oct 17 2008, 01:58) *
Впрочем, есть нормальные PHY за те же деньги, что и RTL8201.


Не подскажите, в чем недостатки RTL8201 ? Помимо отсутствия RMII.
defunct
Цитата(Alexandro @ Oct 17 2008, 13:49) *
Не подскажите, в чем недостатки RTL8201 ? Помимо отсутствия RMII.

autoneg иногда ошибается (но это imho с каждым из дешевых PHY такое), а в остальном нареканий нет.

Цитата(zltigo @ Sep 25 2008, 21:24) *
Единственное встретившиеся исключение лицензионный NXP/NicheLite.

Это поэтому он так дико тормозит?
демка nichelite которая идет в комплекте к SK-LPC2478 ужасно работает.
консоль, сжирает символы 07.gif
ping'и с джиттером в 1 сек. УжОс.

Эта демка - наглядный пример того как можно запаскудить хорошее железо дерьмовым софтом.
zltigo
Цитата(defunct @ Nov 2 2008, 05:48) *
Эта демка - наглядный пример того как можно запаскудить хорошее железо дерьмовым софтом.

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


Цитата(defunct @ Nov 2 2008, 05:48) *
демка nichelite которая идет в комплекте к SK-LPC2478 ужасно работает.

Без понятия,что за демка, но уже однажды писал - конкретные сборки "софта" идущие со стартеркитами даже смотреть не надо. Там полный мрак - ну просто человек другим занимается и все его демки нужно рассматривать с точки зрения железо работает и ладно.
haker_fox
QUOTE (zltigo @ Sep 24 2008, 21:04) *
Во всех китах Olimex и Starterkit для чипов LPC23xx и LPC24xx ошибка в подключении PHY KS8721BL в RMII Mode. К контроллеру подключен сигнал CRS (Carrier Sense), а не RXDV(CRS_DV - Carrier Sense/Data Valid). Результат плачевен - все фреймы принимаются с якобы битой CRC. Кстати, там по хорошему надо-бы этот сигнальчик к земле подтянуть, а то со встроенной в LPC PU подтяжкой при Reset потенциально могут быть проблемы.

Господа, дико прошу прощения за поднятие наистарейшей темы, но у меня есть резон! Мучаюсь несколько дней, не могу запустить сетевые приложения из примеров Keila, тогда как идущие демки (easyweb, nichlite) вместе с платкой SK-MLPC2478 (производитель Стартеркит работают). EMAC-драйвер поправил.
Посему есть несколько вопросов:
1. Могут ли из-за этой ошибки не работать примеры от Keila? Или я неправильно отрихтовал драйвер?
2. Не совсем понятно, какие сигналы куда подкчлючить. Нужно CRS от PHY KS8721 отключить от МК и оставить в воздухе, а RXDV подключить к МК, и подтянуть к земле через резистор? Верно? Я, конечно, простой вопрос задаю, ну уж больно боюсь спалить или МК или PHY. Ремонт мне выльется заказом новой платы.

Заранее благодарен за понимание и ответы! Спасибо!

UPD: вот, что значит нервничать. Успокоился, посмотрел, оказывается новые платки уже поправлены. Можно оттуда "срисовывать" модернизацию для своей платки) Но ответ на первый вопрос остается актуальным)
haker_fox
Перерезал дорожку. Припоял перемычку. Лучше на стало. Видимо, неправильно поправил драйвера.
zltigo
QUOTE (haker_fox @ Jun 29 2011, 10:13) *
Перерезал дорожку. Припоял перемычку.

Это правильно.
QUOTE
Лучше на стало.

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

Очевидно sad.gif
Lotor
На счет драйвера я отписал тут, думаю поможет - http://electronix.ru/forum/index.php?showtopic=91497
Если не поможет, давайте разбираться. sm.gif
haker_fox
QUOTE (Lotor @ Jun 29 2011, 18:45) *
На счет драйвера я отписал тут, думаю поможет - http://electronix.ru/forum/index.php?showtopic=91497
Если не поможет, давайте разбираться. sm.gif

Ух ты! Моя тема да еще и под носом, а я не нашел. Честно искал. Гуглом. Может быть просмотрел)
Lotor, спасибо Вам большое! Сейчас я на работе. Платка дома. Часиков через 8 попробую по Вашей рекомендации поправить дело. Может быть и заведется.
Lotor
Цитата(haker_fox @ Jun 30 2011, 04:53) *
Может быть и заведется.

Должна. sm.gif


У меня к Вам просьба, можете проверить на своей SK-MLPC2478 работу с SD картой? Там пример вместе с платой идет, надо в терминалке набрать dio0.

haker_fox
QUOTE (Lotor @ Jun 30 2011, 13:12) *
Должна. sm.gif

Хорошо бы)
QUOTE (Lotor @ Jun 30 2011, 13:12) *
У меня к Вам просьба, можете проверить на своей SK-MLPC2478 работу с SD картой? Там пример вместе с платой идет, надо в терминалке набрать dio0.

С удовольствим бы, но у меня LPC2468 (см. фото). Я допустил досадную опечатку выше. На этой плате нет разъема под SD-карту, соответственно и демки тоже( Простите, если не оправдал надежды crying.gif
Lotor
Цитата(haker_fox @ Jun 30 2011, 09:28) *
Простите, если не оправдал надежды crying.gif

Ничего страшного, просто у меня на стертеркитовской плате SD карта не работает, хотел удостовериться, что только у меня.sm.gif
haker_fox
QUOTE (Lotor @ Jun 30 2011, 15:15) *
Ничего страшного, просто у меня на стертеркитовской плате SD карта не работает, хотел удостовериться, что только у меня.sm.gif

Лучше что бы у всех, тогда устранять проще)
yakub_EZ
Цитата(Lotor @ Jun 30 2011, 08:12) *
У меня к Вам просьба, можете проверить на своей SK-MLPC2478 работу с SD картой? Там пример вместе с платой идет, надо в терминалке набрать dio0.

Что за пример такой? У меня два варианта с флешкой работали. От Чана (chan_mci) и стандартный от Кейла, там только пришлось попросить терминал переехать с 2 порта на 0-й. И в обоих случаях таких команд в списке стандартных небыло плата от стартеркита SK-MLPC2478, третий выпуск
Lotor
Цитата(yakub_EZ @ Jun 30 2011, 12:01) *
Что за пример такой? У меня два варианта с флешкой работали. От Чана (chan_mci) и стандартный от Кейла, там только пришлось попросить терминал переехать с 2 порта на 0-й. И в обоих случаях таких команд в списке стандартных небыло плата от стартеркита SK-MLPC2478, третий выпуск


От Чана пример, команда di 0 - очепятался. Радует, что все же примеры у кого-то идут.


yakub_EZ
Цитата(Lotor @ Jun 30 2011, 12:07) *
От Чана пример, команда di 0 - очепятался. Радует, что все же примеры у кого-то идут.

Хм.. А после di 0 что пишет? После надо добавить команду - fi 0. А уж затем уже можно попросить показать содерджимое флешки - fl
Вот, с этого hex попробуйте.
Lotor
Цитата(yakub_EZ @ Jun 30 2011, 12:21) *
Хм.. А после di 0 что пишет? После надо добавить команду - fi 0. А уж затем уже можно попросить показать содерджимое флешки - fl
Вот, с этого hex попробуйте.

Я в курсе как работает эта демка - на другом железе все ок. sm.gif А вот стартеркитовская даже di 0 не проходит.
yakub_EZ
Демка не простая, а заточенная под стартеркит
Lotor
Цитата(yakub_EZ @ Jun 30 2011, 13:56) *
Демка не простая, а заточенная под стартеркит


Скорее уж стартеркит "затачивал" свою плату аля Olimex. sm.gif

Эта демка, "заточенная" под плату стартеркита у меня идет на олимексовской отладке + на девайсе с аналогичной схемотехникой. А вот на самой плате не хочет. Скорее всего просто мне экземпляр платы такой попался. Тем более у Вас все окей.


haker_fox
QUOTE (zltigo @ Jun 29 2011, 18:02) *
чевидно sad.gif

Все заработало. Основная часть демок от Кейла пошла (web-сервера (Java, CGI), ping и т.п.).
Что было сделано:
1. В инициализации EMAC добавлена строка
CODE
MAC_MCFG = MCFG_HCLK_DIV_28;

после этих строк
CODE
  /* Initialize MAC control registers. */
  MAC_MAC1 = MAC1_PASS_ALL;
  MAC_MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
  MAC_MAXF = ETH_MAX_FLEN;
  MAC_CLRT = CLRT_DEF;
  MAC_IPGR = IPGR_DEF;

2. Естественно, в начале файла есть макрос
CODE
#define MCFG_HCLK_DIV_28      (7 << 2)

Саму инициализацию вообще не трогал (не за исключением добавления указанной строки), не знаю, правильно или нет. Но работает же.
3. По невнимательности для LPC2468 использовал стартовый код LPC2300.s. Заменил на LPC2400.s.
4. Адрес микросхемы PHY не менял, он был уже 0x0100 (1 << 8).
5. Выключил всю отладку сети (файл Net_Debug.c). Это угробляло всю библиотеку TCPnet в моем случае.

Ну и сменил IP на удобный для меня rolleyes.gif
Все пошло!!!))) Пинг меньше 1 мс. Сервера работают.
Сегодня запустил под осью RTX. Стандартный пример не смог запустить. Сделал свой. Правда пинг 8 - 30 мс. Но это связано с неправильным распределением приоритетов задач. Это я уже выяснил. Буду учиться и исправлять ситуацию.
Вот вроде и все.

Большое человеческое спасибо участникам за помощь!
zltigo
QUOTE (haker_fox @ Jul 1 2011, 17:48) *
1. В инициализации EMAC добавлена строка
CODE
MAC_MCFG = MCFG_HCLK_DIV_28;

после этих строк
CODE
  /* Initialize MAC control registers. */
  MAC_MAC1 = MAC1_PASS_ALL;
  MAC_MAC2 = MAC2_CRC_EN | MAC2_PAD_EN;
  MAC_MAXF = ETH_MAX_FLEN;
  MAC_CLRT = CLRT_DEF;
  MAC_IPGR = IPGR_DEF;

2. Естественно, в начале файла есть макрос
CODE
#define MCFG_HCLK_DIV_28      (7 << 2)

Саму инициализацию вообще не трогал (не за исключением добавления указанной строки), не знаю, правильно или нет. Но работает же.
3. По невнимательности для LPC2468 использовал стартовый код LPC2300.s. Заменил на LPC2400.s.
4. Адрес микросхемы PHY не менял, он был уже 0x0100 (1 << 8).

Да, демописатели sad.gif. У меня даже для рабочего варианта поиск PHY производится, дабы не думать каждый раз..
CODE
int init_phy(void)
{
    MCFG = MCFG_HCLK_DIV_28|MCFG_RESET_MII_MGMT;
      vSmartDelay_ms( 2 );

#if( EMAC_CFG_RMII == 0 )
    MCOMMAND &= ~CR_RMII;
#else
    MCOMMAND |= CR_RMII;
#if defined __IOLPC2458_H
    SUPP = SUPP_RESET_MII;
#else
    SUPP = 0;                 // Assume and configure RMII link speed logic for 10Mbit
#endif
#endif

    for( int i = 0; i < 7; i++ )
    {    // Check dividers to yield MII frequency ~2.5 MHz
        if( ( (configCPU_CLOCK_HZ/100000L)/mii_dividers[i][0] ) <=  25 )
        {    MCFG = mii_dividers[i][1];        // Remove reset, set proper MIIM divider
            break;
        }
    }
    vSmartDelay_ms( 10 );    // Short delay while PHY exits reset and new divider is set

      for( phy_addr = 1; phy_addr <= 31; 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;
              }
        }
    }
    printst( "PHY:Missing " );
    return( 1 );

phy_found:
    {
    // Check if this is a valid PHY
      ulong id_phy = (read_PHY( PHY_REG_IDR1 )<<16)|read_PHY( PHY_REG_IDR2 );
    if( id_phy == KS8721BL_ID  )
        xprintf( "PHY%2X:KS8721BL ", phy_addr );
    else if( id_phy == KS8041TL_ID  )
        xprintf( "PHY%2X:KS8041TL ", phy_addr );
    else
    {    xprintf( "PHY%2X:%8X -Unknown ", phy_addr, id_phy );
         return( 2 );
    }
    }

      // Sanity check...
...........
haker_fox
QUOTE (zltigo @ Jul 2 2011, 04:37) *
Да, демописатели sad.gif. У меня даже для рабочего варианта поиск PHY производится, дабы не думать каждый раз..

Видимо на кейловских платах другой PHY стоит. Вот они жестко под него примеры и заточили.
За исходник - спасибо! Поизучаю!
zltigo
QUOTE (haker_fox @ Jul 2 2011, 10:36) *
Видимо на кейловских платах другой PHY стоит.

PHY по базовому набору регистров и базовым функциям, как правило, вполне унифицированы. То, что пишется в демках, обычно использует минимум миниморум особенностей PHY sad.gif Да и для периферийного устройства особые навороты от PHY в общем-то и не нужны.
haker_fox
QUOTE (zltigo @ Jul 2 2011, 18:59) *
PHY по базовому набору регистров и базовым функциям, как правило, вполне унифицированы. То, что пишется в демках, обычно использует минимум миниморум особенностей PHY sad.gif Да и для периферийного устройства особые навороты от PHY в общем-то и не нужны.

Понятно. Еще раз благодарю! rolleyes.gif
sadfeel
Цитата(Lotor @ Jun 30 2011, 09:15) *
Ничего страшного, просто у меня на стертеркитовской плате SD карта не работает, хотел удостовериться, что только у меня.sm.gif



у меня платка, 2478, тоже без СД карты, припаял проводочки к ней, тоже мучался, потом заработало, там прикол в том, что нужно card detect кинуть на MP147....

вот тут схема (там справа вверху)

http://starterkit.ru/html/doc/SK-MLPC2478_V3A.pdf
sasamy
Цитата(haker_fox @ Jul 2 2011, 12:36) *
За исходник - спасибо! Поизучаю!


Какой-то индусокод. Представьте что адрес не 1 или 2 а 31 - сколько эта херня будет циклы накручивать с задержками ? Лучше нормальные открытые проекты изучайте.
zltigo
QUOTE (sasamy @ Jul 5 2011, 17:45) *
Какой-то индусокод. Представьте что адрес не 1 или 2 а 31 - сколько эта херня будет циклы накручивать с задержками ?

Если не умеете считать, то порядка 128ms на адрес. Один раз при инициализации. Зато будет найден любой. При необходимости экономить время и использовании 31 адреса все может быть постфактум скорректировано в конкретном рабочем исходнике. Именно такой подход к делу для ДЕМО кода является нормальным в отличии от забивания конкретного адреса, причем без комментариев, что это адрес.
QUOTE
Лучше нормальные открытые проекты изучайте.

Нормальных открытых нет. Один с относительно нормальным уровнем драйвера я уже в этом топике поминал.
sasamy
Цитата(zltigo @ Jul 5 2011, 22:25) *
Если не умеете считать, то порядка 128ms на адрес. Один раз при инициализации. Зато будет найден любой. При необходимости экономить время и использовании 31 адреса все может быть постфактум скорректировано в конкретном рабочем исходнике. Именно такой подход к делу для ДЕМО кода является нормальным в отличии от забивания конкретного адреса, причем без комментариев, что это адрес.


Я как раз умею считать - для 31 адреса задержка составит 3 секунды - это нормально по-вашему ? Смысл не в том что вы ищете живой адрес а в том как вы это делаете - можно было в цикле заслать сброс по всем адресам без задержек, а потом опрашивать начианая с первого и если он не ответил, то для следующих задержки уже не нужны. В итоге задержка практически не будет зависеть от адреса а для 31 сократится в 30 (!) раз.
zltigo
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 на желаемый и получаем максимально быстрый рабочий вариант, который тем не менее обеспечит поиск при запуске демки или каких-то монтажных ошибок
sasamy
Цитата(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;; )


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