|
|
  |
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
|
|
|
|
|
Sep 25 2008, 19:18
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(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, а обрабатывать ошибки  , получается не заморачивается никто особо  . Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина...... Да.Да.Да... Я с этим тоже столкнулся, понял что проблема аппаратная, в чем точно так и не понял...lwIP постоянно дропал часть пакетов.... Только не все фреймы, а бОльшая часть фреймов длинной более 150-200 байт...
|
|
|
|
|
Sep 25 2008, 19:24
|

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

|
Цитата(Quasar @ Sep 25 2008, 21:18)  Я с этим тоже столкнулся, понял что проблема аппаратная, в чем точно так и не понял...lwIP постоянно дропал часть пакетов.... Только не все фреймы, а бОльшая часть фреймов длинной более 150-200 байт... "Битые" абсолютно все фреймы, а причину надо смотреть вне lwIP а в том, какой ""драйвер"" MAC прикручен - обычно халтура игнорирующая все и вся. Единственное встретившиеся исключение лицензионный NXP/NicheLite. Если дадите ссылку - посмотрю.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 25 2008, 19:59
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(zltigo @ Sep 25 2008, 23:24)  "Битые" абсолютно все фреймы, а причину надо смотреть вне lwIP а в том, какой ""драйвер"" MAC прикручен - обычно халтура игнорирующая все и вся. Единственное встретившиеся исключение лицензионный NXP/NicheLite. Если дадите ссылку - посмотрю. Ну вот у меня эта халтура и используется  . Фрейм принимается с битым CRC и неверной длинной. На битый CRC кладётся...неверная длина передается выше...ну и отваливается на каком-нибудь TCP или при просчете CRC в ICMP... Сейчас на своей плате поправил это дело, теперь всё OK  .
|
|
|
|
|
Sep 26 2008, 14:07
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Хорошо, что в свое время я купил демоплату у Embedded артистов  . Пытаюсь избавиться от этих KSZ8001/8721. Ни у кого не завалялось схемы включения более нового KSZ8041 c LPC или еще каким-нибудь процессором?
Сообщение отредактировал Vitaliy_ARM - Sep 26 2008, 14:11
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 27 2008, 11:15
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(zltigo @ Sep 26 2008, 19:08)  Если не SMI Так совершенно обыденое MII/RMII подключение "как всегда". Смущает отсутствие VDDRCV входа у микросхемы. На трансформатор в среднюю точку какое питание заводить? 3,3V или питание ядра?
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Sep 27 2008, 13:03
|
Знающий
   
Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246

|
Цитата(zltigo @ Sep 27 2008, 15:58)  VDDA_3,3, а документацию, включая документацию на Evalboard что мешает у Micrel взять? На EvalBord что-то не получилось. Вроде они должны были на маил прислать, но не прислали. Или почта сбоит. Спасибо. Этого достаточно.
--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
|
|
|
|
|
Oct 1 2008, 07:26
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Цитата(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, а обрабатывать ошибки  , получается не заморачивается никто особо  . Уперся в баг, потратил пару дней, просмотрел интернет вдоль и поперек - кроме одного безответного вопроса на LPC2000 форуме - тишина...... Так вот где собака порылась! А я на себя грешил... Ошибки CRC в lwip стеке постоянно присутствали, обойти удалось так - в файле ethernetif.c в функции low_lewel_input увеличил длину считываемого фрейма на 4 len = StartReadFrame()+4; и все заработало, т.е. дочитываю контрольную сумму. Установил это через анализ пакетов передаваемых по сети и принятых в стек Правда, не уверен - корректно ли все это... может есть еще какие-то засады? И еще - с платами стартеркит - работает ли Ethernet с установленной частотой процессора больше 50МГц? У меня глохнет начальная инициализация PHY на процедуре сброса. Проверял на нескольких платах, с частотами ниже 50МГц все ок. Может это и проблема из-за подтяжки вышесказанного сигнала?
|
|
|
|
|
Oct 1 2008, 07:36
|

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

|
Цитата(lebiga @ Oct 1 2008, 09:26)  И еще - с платами стартеркит - работает ли Ethernet с установленной частотой процессора больше 50МГц? У меня глохнет начальная инициализация PHY на процедуре сброса. Проверял на нескольких платах, с частотами ниже 50МГц все ок. Да на 72MHz работает. Вопросы - какая ревизия чипа с точки зрения наличия бага с ограничением скорости работы из Flash - а какой делитель прописывается в MCFG. Надо 28 - MIIM у Micrel максимум на 2.5MHz "типично" работает. Я "автоматически" подбираю под CPU при инициализации. - как там у Вас всякие задержечки-прокладочки организованы? Цитата Может это и проблема из-за подтяжки вышесказанного сигнала? Нет, подтяжка для того, что-бы при power on не свалился в хрен знает какой режим в котром просто глухо не достучаться до него.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 1 2008, 07:57
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

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

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

|
Цитата(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 ); }
Сообщение отредактировал zltigo - Oct 1 2008, 10:52
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|