|
|
  |
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
|
|
|
|
|
Oct 16 2008, 12:08
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732

|
У меня olimex LPC-E2468 с KS8721BL не проходит инициализацию. Исходники взял оn IAR EWARM 5.20. Проект uip_webserver. При чтении регистра PHYSTS (0x0010) выдает всегда 0. В чем может быть дело?
|
|
|
|
|
Oct 17 2008, 08:03
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 17-10-05
Из: Краснодар
Пользователь №: 9 732

|
В чем разница RMII и MII? Может у меня поэтому не инициализируется?
|
|
|
|
|
Oct 17 2008, 10:32
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(virfis @ Oct 17 2008, 12:03)  В чем разница RMII и MII? Может у меня поэтому не инициализируется? Это два разных режима работы PHY, естественно, и инициализация должна быть соответствующей. Отличие первого в меньшем числе используемых линий для передачи данных (в 2 раза), но скорость работы по линиям выше в 2 раза. Почитайте описание микросхемы, там должны быть описаны эти режимы. У iosifk есть станица персональная, с которой есть ссылки на статьи об этом интерфейсе.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Oct 17 2008, 11:49
|
Группа: Участник
Сообщений: 12
Регистрация: 26-05-05
Пользователь №: 5 431

|
Цитата(aaarrr @ Oct 17 2008, 01:58)  Впрочем, есть нормальные PHY за те же деньги, что и RTL8201. Не подскажите, в чем недостатки RTL8201 ? Помимо отсутствия RMII.
|
|
|
|
|
Nov 2 2008, 02:48
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Alexandro @ Oct 17 2008, 13:49)  Не подскажите, в чем недостатки RTL8201 ? Помимо отсутствия RMII. autoneg иногда ошибается (но это imho с каждым из дешевых PHY такое), а в остальном нареканий нет. Цитата(zltigo @ Sep 25 2008, 21:24)  Единственное встретившиеся исключение лицензионный NXP/NicheLite. Это поэтому он так дико тормозит? демка nichelite которая идет в комплекте к SK-LPC2478 ужасно работает. консоль, сжирает символы ping'и с джиттером в 1 сек. УжОс. Эта демка - наглядный пример того как можно запаскудить хорошее железо дерьмовым софтом.
|
|
|
|
|
Nov 2 2008, 08:45
|

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

|
Цитата(defunct @ Nov 2 2008, 05:48)  Эта демка - наглядный пример того как можно запаскудить хорошее железо дерьмовым софтом. Я сказал то, что сказал - в ней единственный встреченный мною прилично написанный уровень "драйвера", который стоит вычитывать и от которого можно отталкиваться в написании нужного. Все остальное я не смотрел и соответственно вообще не комментировал. Цитата(defunct @ Nov 2 2008, 05:48)  демка nichelite которая идет в комплекте к SK-LPC2478 ужасно работает. Без понятия,что за демка, но уже однажды писал - конкретные сборки "софта" идущие со стартеркитами даже смотреть не надо. Там полный мрак - ну просто человек другим занимается и все его демки нужно рассматривать с точки зрения железо работает и ладно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 27 2011, 06:29
|

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

|
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: вот, что значит нервничать. Успокоился, посмотрел, оказывается новые платки уже поправлены. Можно оттуда "срисовывать" модернизацию для своей платки) Но ответ на первый вопрос остается актуальным)
--------------------
Выбор.
|
|
|
|
|
Jun 29 2011, 09:02
|

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

|
QUOTE (haker_fox @ Jun 29 2011, 10:13)  Перерезал дорожку. Припоял перемычку. Это правильно. QUOTE Лучше на стало. Я уже раньше писал - драйвера из демок есть полная муть и, как правило все игнорируют, например те-же демки прилагаемые к Starter в принципе работали. QUOTE Видимо, неправильно поправил драйвера. Очевидно
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 29 2011, 09:45
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
На счет драйвера я отписал тут, думаю поможет - http://electronix.ru/forum/index.php?showtopic=91497Если не поможет, давайте разбираться.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 30 2011, 04:12
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(haker_fox @ Jun 30 2011, 04:53)  Может быть и заведется. Должна. У меня к Вам просьба, можете проверить на своей SK-MLPC2478 работу с SD картой? Там пример вместе с платой идет, надо в терминалке набрать dio0.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 30 2011, 08:07
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(yakub_EZ @ Jun 30 2011, 12:01)  Что за пример такой? У меня два варианта с флешкой работали. От Чана (chan_mci) и стандартный от Кейла, там только пришлось попросить терминал переехать с 2 порта на 0-й. И в обоих случаях таких команд в списке стандартных небыло плата от стартеркита SK-MLPC2478, третий выпуск От Чана пример, команда di 0 - очепятался. Радует, что все же примеры у кого-то идут.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 30 2011, 08:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 329
Регистрация: 6-12-08
Из: Москва
Пользователь №: 42 252

|
Цитата(Lotor @ Jun 30 2011, 12:07)  От Чана пример, команда di 0 - очепятался. Радует, что все же примеры у кого-то идут. Хм.. А после di 0 что пишет? После надо добавить команду - fi 0. А уж затем уже можно попросить показать содерджимое флешки - fl Вот, с этого hex попробуйте.
|
|
|
|
|
Jun 30 2011, 09:44
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(yakub_EZ @ Jun 30 2011, 12:21)  Хм.. А после di 0 что пишет? После надо добавить команду - fi 0. А уж затем уже можно попросить показать содерджимое флешки - fl Вот, с этого hex попробуйте. Я в курсе как работает эта демка - на другом железе все ок.  А вот стартеркитовская даже di 0 не проходит.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 30 2011, 11:04
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(yakub_EZ @ Jun 30 2011, 13:56)  Демка не простая, а заточенная под стартеркит Скорее уж стартеркит "затачивал" свою плату аля Olimex. Эта демка, "заточенная" под плату стартеркита у меня идет на олимексовской отладке + на девайсе с аналогичной схемотехникой. А вот на самой плате не хочет. Скорее всего просто мне экземпляр платы такой попался. Тем более у Вас все окей.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
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, 07:10
|
Участник

Группа: Участник
Сообщений: 52
Регистрация: 7-10-10
Пользователь №: 59 988

|
Цитата(Lotor @ Jun 30 2011, 09:15)  Ничего страшного, просто у меня на стертеркитовской плате SD карта не работает, хотел удостовериться, что только у меня.  у меня платка, 2478, тоже без СД карты, припаял проводочки к ней, тоже мучался, потом заработало, там прикол в том, что нужно card detect кинуть на MP147.... вот тут схема (там справа вверху) http://starterkit.ru/html/doc/SK-MLPC2478_V3A.pdf
|
|
|
|
|
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. Ну и не дергайте Цитата Но ситуацию это не меняет - ваше исправление менее убого исходного варианта, но явно хуже аналогичного от автора. Индусятина-с. Собственно исправление автора еще более убого чем начальный вариант - он теряет смысл, потому что весь диапазон адресов не будет проверен. А вы если делаете громкие заявления - не поленитесь привести свой код, иначе они звучат как пшик индуса
|
|
|
|
|
Jul 5 2011, 22:05
|

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

|
QUOTE (sasamy @ Jul 6 2011, 00:34)  .... CODE for (phy_addr = 1; phy_addr <= 31; phy_addr++) // Put PHY in reset mode write_PHY(PHY_REG_BMCR, BMCR_RESET); 1. Нет сброса по 0 адресу. 2. Тратится время на бездумную передачу 30(31) команды сброса по последовательному интерфейсу все зависимости потребуются они в последствии или нет. Соответственно эти пустые действия непонятны для изучающего вольного предположить в их наличии какой-то смысл. 3. Если в функции write_PHY() нет ожидания окончания транзакции будет облом. CODE 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; } 1. Опять нет контроля по 0 адресу. 2. (phy_addr != DEFAULT_PHY_ADDR) && лишнее украшение. QUOTE (sasamy @ Jul 6 2011, 00:54)  Собственно исправление автора еще более убого чем начальный вариант - он теряет смысл, потому что весь диапазон адресов не будет проверен. Как оказалось, чукча не только не "писатель", но и не "читатель"  - типа чисто "критик". Диапазон адресов проверяется весь начиная DEFAULT_PHY_ADDR.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 22:18
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 6 2011, 01:59)  Код for (phy_addr = 1; phy_addr <= 31; phy_addr++) // Put PHY in reset mode write_PHY(PHY_REG_BMCR, BMCR_RESET); 1. Нет сброса по 0 адресу. Вообще-то это была копипаста с вашего кода, так что претензии не ко мне  Цитата 2. Тратится время на бездумную передачу 30(31) команды сброса по последовательному интерфейсу все зависимости потребуются они в последствии или нет. Вы их точно так же делаете, только в некоторых случаях меньше. На этом последовательном интерфейсе 25 МГц, а у вас первая же задержка 1 мс - о чем вообще может быть речь, эти команды пролетят когда она еще не закончится. Цитата 3. Если в функции write_PHY() нет ожидания окончания транзакции будет облом. Пожалуй на этом хватит - это ваш немного исправленый код - к вам претензии, я хотел всего лишь показать смысл моего замечания - тратится слишком много времени на ненужные ожидания, конечно немного в грубоватой форме сказано, но в принципе это был ваш тон. Цитата (phy_addr != DEFAULT_PHY_ADDR) && лишнее украшение. Ну с этим согласен - прочитать лишний раз регистр - раз плюнуть.
Сообщение отредактировал sasamy - Jul 5 2011, 22:20
|
|
|
|
|
Jul 5 2011, 22:39
|

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

|
QUOTE (sasamy @ Jul 6 2011, 01:18)  Вообще-то это была копипаста с вашего кода, так что претензии не ко мне  Кто-то взялся править, причем после публикации моего подчищенного, но не сумел. QUOTE Вы их точно так же делаете, только в некоторых случаях меньше. При штатном течении инициализации ровно один необходимо-достаточный сброс вместо 32. QUOTE На этом последовательном интерфейсе 25 МГц Вы не знаете и типичных скоростей MDIO интерфейсов в PHY  . Ошибка на порядок. QUOTE я хотел всего лишь показать смысл моего замечания - тратится слишком много времени на ненужные ожидания только в случае НЕШТАТНОЙ ситуации с PHY. Вместо этого Вы добавили те самые ненужные действия требующие времени и для случая штатной инициализации. Затраты времени меня особо не смущают, но порожден еще и тот самый говнокод ( делающий что-то зачем-то )  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 5 2011, 22:58
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(zltigo @ Jul 6 2011, 02:39)  Вы не знаете и типичных скоростей MDIO интерфейсов в PHY  . Ошибка на порядок. Можете считать я пропустил запятую, хотя честно говоря - это не таблица умножения чтобы все помнить наизусть, достаточно открыть любой даташит. Цитата только в случае НЕШТАТНОЙ ситуации с PHY. Вместо этого Вы добавили те самые ненужные действия требующие времени и для случая штатной инициализации. Затраты времени меня особо не смущают, Естественно - какие затраты времени, если у вас _всегда_ до чтения регистра задержка 1 мс а у меня ее нет, в ее качестве посылки сброса по всем адресам. Цитата но порожден еще и тот самый говнокод ( делающий что-то зачем-то )  . ликвидирующий задержку в 3,5 сек в случае внештатной ситуации и не вносящий никаких задержек и усложнений и без того кривого кода. Вообще достаточно было читать PHYID без всяких левых сбросов и задержек.
|
|
|
|
|
Jul 5 2011, 23:22
|

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

|
QUOTE (aaarrr @ Jul 6 2011, 01:46)  Вот заодно и спрошу: зачем сброс? Вопрос без всякой подковырки, просто интересно. Для порядка, дабы функция инициализации всегда делала все возможное включая инициализацию PHY и после софтового сброса контроллера, если нет аппаратного сброса. Но прежде всего это ведь тест на наличие любого PHY - бит должен самосброситься по окончанию инициализации PHY. Другое дело, что время ожидания очистки в 128ms скорее всего великовато, но с другой стороны оно обычно никак не нормируется производителем PHY  . Далее еще, после чтения идентификатора, но перед инициализацией, производятся чтения default значений из регистров PHY. Это тоже диагностика PHY. Порядка 10 лет работы в качестве разработчика диагностических комплексов на VEF-е оставили хорошую привычку, в том числе при POST, делать всю диагностику по максимуму. QUOTE (sasamy @ Jul 6 2011, 01:58)  ...достаточно открыть любой даташит. Открыть, почитать, подумать...., допустить мысль, что кто-то тоже обладает разумом. Только очевидно это не всем дано - лучше сразу писать первое, что придет в голову  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 7 2011, 06:34
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Не про RMII KS8721BL, зато про Olimex/Startetkit LPC23/4. Кто-нибудь переопределял приоритеты на шине AHB1? При записи на sd-карточку начинает срываться изображение на TFT. Работа с sd через DMA - кейловский драйвер (MCI_LPC24xx.c). И DMA и LCD подключены к AHB1. В регистре AHBCFG1 настроил приоритеты так - LCD, CPU, DMA, AHB1, USB. После чего в процедуре записи на SD-карту вылетаю в Data-Abort. Если приоритет DMA выше LCD - то все хорошо, но изображение срывается. Проблему решил уменьшением частоты тактирования LCD, но если кто вдруг в курсе настройки AHB1 буду признателен совету.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jul 8 2011, 07:07
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(aaarrr @ Jul 7 2011, 14:22)  В этом случае следовало бы разобраться, что именно вызывает Data Abort при работе с SD. В Data Abort вылетает в функции fwrite - кейловская библиотека Flash File System. Исходников нет, дизассемблирование показывает, что проблемная инструкция STR R0, [R4, #0x0C], в R4 нули. Получается пытается что-то сохранить по адресу в памяти программ... В общем или таки кейловская библиотека чудит, или я не знаю тонкостей настройки приоритетов AHB.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Aug 10 2011, 06:07
|
Группа: Новичок
Сообщений: 1
Регистрация: 30-09-10
Пользователь №: 59 841

|
Цитата(Lotor @ Jul 7 2011, 12:34)  Не про RMII KS8721BL, зато про Olimex/Startetkit LPC23/4. Кто-нибудь переопределял приоритеты на шине AHB1? При записи на sd-карточку начинает срываться изображение на TFT. Работа с sd через DMA - кейловский драйвер (MCI_LPC24xx.c). И DMA и LCD подключены к AHB1. В регистре AHBCFG1 настроил приоритеты так - LCD, CPU, DMA, AHB1, USB. После чего в процедуре записи на SD-карту вылетаю в Data-Abort. Если приоритет DMA выше LCD - то все хорошо, но изображение срывается. Проблему решил уменьшением частоты тактирования LCD, но если кто вдруг в курсе настройки AHB1 буду признателен совету.  Тоже много времени потратил на то, чтобы разобраться с приоритетами DMA и LCD. В итоге где-то на иностранном форуме раздобыл следующую настройку приоритетов: AHBCFG1 = 0x10000144; До этого тоже изображение дёргалось при использовании DMA. Сейчас всё идеально ) SD не использую, так что не смогу подсказать, как тут быть. Но думаю, что это поможет тем, кто также не использует SD.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|