|
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
|
|
|
|
|
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, 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, 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
|
|
|
|
Сообщений в этой теме
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            zltigo QUOTE (sasamy @ Jul 5 2011, 23:41) ...сог... Jul 5 2011, 20:46              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                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                 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|