|
Olimex/Startetkit LPC23/4 + RMII KS8721BL, Баги в схеме :( |
|
|
|
Sep 24 2008, 12:04
|

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

|
Во всех китах 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, а обрабатывать ошибки  , получается не заморачивается никто особо  . Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина......
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
 |
Ответов
|
Jul 1 2011, 15:48
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (zltigo @ Jun 29 2011, 18:02)  чевидно  Все заработало. Основная часть демок от Кейла пошла (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 использовал стартовый код LPC 2300.s. Заменил на LPC 2400.s. 4. Адрес микросхемы PHY не менял, он был уже 0x0100 (1 << 8). 5. Выключил всю отладку сети (файл Net_Debug.c). Это угробляло всю библиотеку TCPnet в моем случае. Ну и сменил IP на удобный для меня Все пошло!!!))) Пинг меньше 1 мс. Сервера работают. Сегодня запустил под осью RTX. Стандартный пример не смог запустить. Сделал свой. Правда пинг 8 - 30 мс. Но это связано с неправильным распределением приоритетов задач. Это я уже выяснил. Буду учиться и исправлять ситуацию. Вот вроде и все. Большое человеческое спасибо участникам за помощь!
--------------------
Выбор.
|
|
|
|
|
Jul 1 2011, 19:37
|

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

|
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 использовал стартовый код LPC 2300.s. Заменил на LPC 2400.s. 4. Адрес микросхемы PHY не менял, он был уже 0x0100 (1 << 8). Да, демописатели  . У меня даже для рабочего варианта поиск 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... ...........
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
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
|
|
|
|
Сообщений в этой теме
zltigo Olimex/Startetkit LPC23/4 + RMII KS8721BL Sep 24 2008, 12:04 Quasar Цитата(zltigo @ Sep 24 2008, 16:04) Во вс... Sep 25 2008, 19:18 zltigo Цитата(Quasar @ Sep 25 2008, 21:18) Я с э... Sep 25 2008, 19:24  Quasar Цитата(zltigo @ Sep 25 2008, 23:24) ... Sep 25 2008, 19:59 Vitaliy_ARM Хорошо, что в свое время я купил демоплату у Embed... Sep 26 2008, 14:07 zltigo Цитата(Vitaliy_ARM @ Sep 26 2008, 16:07) ... Sep 26 2008, 15:08  Vitaliy_ARM Цитата(zltigo @ Sep 26 2008, 19:08) Если ... Sep 27 2008, 11:15   zltigo Цитата(Vitaliy_ARM @ Sep 27 2008, 13:15) ... Sep 27 2008, 11:58    Vitaliy_ARM Цитата(zltigo @ Sep 27 2008, 15:58) VDDA_... Sep 27 2008, 13:03     zltigo Цитата(Vitaliy_ARM @ Sep 27 2008, 15:03) ... Sep 27 2008, 13:08 lebiga Цитата(zltigo @ Sep 24 2008, 15:04) Во вс... Oct 1 2008, 07:26 zltigo Цитата(lebiga @ Oct 1 2008, 09:26) И еще ... Oct 1 2008, 07:36  lebiga Цитата(zltigo @ Oct 1 2008, 10:36) Да на ... Oct 1 2008, 07:57   zltigo Цитата(lebiga @ Oct 1 2008, 09:57) это вс... Oct 1 2008, 08:04    lebiga Да, сам себя накрутил, где-то взял этот код... Ког... Oct 1 2008, 10:48 virfis У меня olimex LPC-E2468 с KS8721BL не проходит ини... Oct 16 2008, 12:08 defunct На практике действительно так нужен RMII?
PHY толь... Oct 16 2008, 22:52 aaarrr За наличие RMII и версии с индустриальным диапазон... Oct 16 2008, 22:58 defunct Я нашел эту разницу и пост удалил. Поворчал по дру... Oct 16 2008, 23:02 Alexandro Цитата(aaarrr @ Oct 17 2008, 01:58) Впроч... Oct 17 2008, 11:49  defunct Цитата(Alexandro @ Oct 17 2008, 13:49) Не... Nov 2 2008, 02:48   zltigo Цитата(defunct @ Nov 2 2008, 05:48) Эта д... Nov 2 2008, 08:45 virfis В чем разница RMII и MII? Может у меня поэтому не ... Oct 17 2008, 08:03 mdmitry Цитата(virfis @ Oct 17 2008, 12:03) В чем... Oct 17 2008, 10:32 haker_fox QUOTE (zltigo @ Sep 24 2008, 21:04) Во вс... Jun 27 2011, 06:29 haker_fox Перерезал дорожку. Припоял перемычку. Лучше на ста... Jun 29 2011, 08:13 zltigo QUOTE (haker_fox @ Jun 29 2011, 10:13) Пе... Jun 29 2011, 09:02 Lotor На счет драйвера я отписал тут, думаю поможет - ht... Jun 29 2011, 09:45 haker_fox QUOTE (Lotor @ Jun 29 2011, 18:45) На сче... Jun 30 2011, 00:53  Lotor Цитата(haker_fox @ Jun 30 2011, 04:53) Мо... Jun 30 2011, 04:12   haker_fox QUOTE (Lotor @ Jun 30 2011, 13:12) Должна... Jun 30 2011, 05:28    Lotor Цитата(haker_fox @ Jun 30 2011, 09:28) Пр... Jun 30 2011, 06:15     haker_fox QUOTE (Lotor @ Jun 30 2011, 15:15) Ничего... Jun 30 2011, 06:32     sadfeel Цитата(Lotor @ Jun 30 2011, 09:15) Ничего... Jul 5 2011, 07:10   yakub_EZ Цитата(Lotor @ Jun 30 2011, 08:12) У меня... Jun 30 2011, 08:01    Lotor Цитата(yakub_EZ @ Jun 30 2011, 12:01) Что... Jun 30 2011, 08:07     yakub_EZ Цитата(Lotor @ Jun 30 2011, 12:07) От Чан... Jun 30 2011, 08:21      Lotor Цитата(yakub_EZ @ Jun 30 2011, 12:21) Хм.... Jun 30 2011, 09:44 yakub_EZ Демка не простая, а заточенная под стартеркит Jun 30 2011, 09:56 Lotor Цитата(yakub_EZ @ Jun 30 2011, 13:56) Дем... Jun 30 2011, 11:04   zltigo QUOTE (haker_fox @ Jul 2 2011, 10:36) Вид... Jul 2 2011, 09:59    haker_fox QUOTE (zltigo @ Jul 2 2011, 18:59) PHY по... Jul 2 2011, 12:41            aaarrr Цитата(sasamy @ Jul 6 2011, 00:41) ...даж... Jul 5 2011, 21:20             sasamy Цитата(aaarrr @ Jul 6 2011, 01:20) Ваше ... Jul 5 2011, 21:34              aaarrr Цитата(sasamy @ Jul 6 2011, 01:34) Еще од... Jul 5 2011, 21:43               sasamy Цитата(aaarrr @ Jul 6 2011, 01:43) Я разв... Jul 5 2011, 21:54                aaarrr Цитата(sasamy @ Jul 6 2011, 01:54) Собств... Jul 5 2011, 21:56              zltigo QUOTE (sasamy @ Jul 6 2011, 00:34) ....
... Jul 5 2011, 22:05               sasamy Цитата(zltigo @ Jul 6 2011, 01:59) Код fo... Jul 5 2011, 22:18                aaarrr Цитата(sasamy @ Jul 6 2011, 02:18) На это... Jul 5 2011, 22:30                 sasamy Цитата(aaarrr @ Jul 6 2011, 02:30) 2.5МГц... Jul 5 2011, 22:34                zltigo QUOTE (sasamy @ Jul 6 2011, 01:18) Вообще... Jul 5 2011, 22:39                 aaarrr Цитата(zltigo @ Jul 6 2011, 02:39) что-то... Jul 5 2011, 22:46                  zltigo QUOTE (aaarrr @ Jul 6 2011, 01:46) Вот за... Jul 5 2011, 23:22                 sasamy Цитата(zltigo @ Jul 6 2011, 02:39) Вы не ... Jul 5 2011, 22:58 IgorKossak Удалил лишнее. Прошу придерживаться рамок темы, хо... Jul 6 2011, 20:04 Lotor Не про RMII KS8721BL, зато про Olimex/Startetkit ... Jul 7 2011, 06:34 aaarrr Цитата(Lotor @ Jul 7 2011, 10:34) Проблем... Jul 7 2011, 10:22  Lotor Цитата(aaarrr @ Jul 7 2011, 14:22) В этом... Jul 8 2011, 07:07 FinaC Цитата(Lotor @ Jul 7 2011, 12:34) Не про ... Aug 10 2011, 06:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|