|
STM32F107 + RTL8201 + lwip-1.4.0, драйвер PHY для lwip |
|
|
12 страниц
1 2 3 > »
|
 |
Ответов
(1 - 99)
|
Sep 23 2013, 18:39
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Sep 23 2013, 21:32)  А мак контроллер на чем? Реалтек это физика, она должна быть по MII -RMII быть связана с железом мак, а вот на выходе этого мак контроллера уже стоит LwIP, у него есть модуль настройки физики по средствам коммуникационной линии MII, и точка чтения - записи данных в мак контроллер.
В настройках физики обычно поиск ее адреса, и установка режима автонегатинации (или как там ее), но вы можете написать любой сложности свой драйвер...
как то так MAC на STM32F107. Меня сейчас интересует как привязать lwip к МАСу. MII режим. Нужно разобраться как инициализировать МАС-модуль и что с ним делать дальше, как он будет взаимодействовать со стеком.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Sep 23 2013, 20:53
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(smk @ Sep 23 2013, 18:36)  Необходимо подружить RTL8201 и lwip. Как это делается и каков драйвер для phy мне нужно будет написать? Каким образом lwip общается с железом? Я так понимаю, что драйвер предполагает работу с МАС-уровнем, я прав? Т.к. область для меня новая, то пригодится любая подсказкаю Прошу помощи и советов. Спасибо. Как такового драйвера для phy нет. Просто там-же где выполняете инициализацию ehternet контроллера инициализируете и регистры phy. LwIP общается с железом через указатели на функции низкоуровневого ввода-вывода в структуре netif. Смотрите файл stm32x_ethernet.c http://bit.ly/stf12_freertos_commons . А вот тут весь проект http://developers.stf12.net/just-another-eclipse-demo-str91x там не только str91 есть и порт для stm)
|
|
|
|
|
Sep 24 2013, 12:39
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Sep 24 2013, 15:31)  да.
физика работает на 50 МГц вроде как, делает их из 25, а для общения по MMI-RMII, там какие то требования на частоты обмена должны быть. Я сейчас смутно помню, но вроде бы по частотам несущих сигналов определяется чуть ли не вид интерфейса и скорость его работы... ведь есть 10-100 -1000 мбит езернет, Прошу уточнения. Физика тактируется 25 МГц - понятно. Режим МII. А со стороны STM32 в части тактирования его МАК-уровня (модуль ЕТН) есть какие-то особенности? Он же работает только с физикой, которая сама себя тактирует.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Sep 30 2013, 19:07
|

Местный
  
Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528

|
Цитата(smk @ Sep 24 2013, 17:24)  Насколько я помню, stm32 может не работать с кварцами выше 24 МГц, но могу ошибаться. Ошибаетесь. Микроконтроллеры F107 работают с резонаторами 3-25МГц. На осцилляторе 25МГц можно получить тактовую 72МГц
--------------------
Для связи email: info собака qbit.su
|
|
|
|
|
Oct 5 2013, 05:12
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
С отладкой разобрался. У меня файлик *.sfr подключен небыл. Всетаки хотелось бы прояснить вопрос. Кеил при подключении стартапа к новому проекту устанавливает кварц равным 25 МГц. С чего бы это и есть ли в этом какой-то особый смысл? Не то чтобы это проблема, но хотелось бы понимать зачем это. Судя по картинке, то для МАС это не принципиально. Это так? В даташите есть такое упоминание (в переводе): Цитата Один 25 МГц кристалл может часами всю систему и все периферийные устройства, включая Ethernet и USB OTG FS периферийных устройств. Для достижения высокого качества звука, аудио кристалл может быть использован. В этом случае часы I2S мастер может генерировать все стандартные частоты дискретизации от 8 кГц до 96 кГц с менее чем 0,5% точностью.Для получения дополнительной информации о часах конфигурации для приложений, требующих Ethernet, USB OTG FS и / или I2S (аудио), пожалуйста, обратитесь к разделу "Приложение Applicative блок-схемы" в вашем устройстве подключения Datasheet линии. Вот собственно Ethernet и USB нужны. Кварцем 8 МГц неужели не затактировать?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Oct 5 2013, 12:47
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Oct 5 2013, 14:07)  почему если физика стандартно работает на 25, 50 и 125 МГц вы думаете что лучше ставить кварц 8 Мгц  ? Из кратного то тянуть лучше, ИМХО... Это если физику от МСО тактировать. Тогда конечно есть железный смысл. У меня другая проблема. Создал пустой проект на Кеил. Выбрать опцию присоединения стартапа. Кварц использовал 25 МГц чтоб чужой проект можно было загрузить и проверить железо. В кейле такой по умолчанию. После пошагового прохода получились настройки как на картинке. Как-то они не вяжутся с таблицей, предлагаемой СТ. По неопытности пеока трудно сразу сообразить как что затактировалось. Может кто подскажет правильно ли там получилось и как затактировался ЮСБ? И еще момент. Если я прохожу автоматом до main, то ничего не отображается в окошке с RCC. Как было при входе в дебаг так и остается. Собственно вопрос: так и должно быть?
и еще непонятно. Создал переменную а. она не отображается в окне просмотра. Код int main (void) { unsigned int a;
while (1) { __nop(); __nop(); __nop(); __nop(); a++; }
} Есть подозрение что с jtag что-то не то
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Oct 17 2013, 17:56
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
У меня теперь другая проблема появилась. Опишу вкратце конфигурацию сети. Ранее компьютер был напрямую подключен к интернету. Я установил свич (долго валялся, теперь пригодился). В один разъем свича воткнул интернет, а в другой компьютер. Интернет работает, что радует. В третий разъем я присоединил свою макетку. Однако увидеть в сети и тем более открыть сайтик, что должна показывать, я не смог. Пробовал смотреть IP своего компьютера, маску подсети. Перепрошил платку, предварительно откомпилировав с новым IP и маской подсети. Девайсу установил IP с 255 в конце. Девайс не вижу. Что можно предпринять чтоб не ставить еще одну сетевую карту?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Oct 18 2013, 06:23
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-01-09
Пользователь №: 43 172

|
Цитата(smk @ Oct 17 2013, 21:56)  У меня теперь другая проблема появилась. Опишу вкратце конфигурацию сети. Ранее компьютер был напрямую подключен к интернету. Я установил свич (долго валялся, теперь пригодился). В один разъем свича воткнул интернет, а в другой компьютер. Интернет работает, что радует. В третий разъем я присоединил свою макетку. Однако увидеть в сети и тем более открыть сайтик, что должна показывать, я не смог. Пробовал смотреть IP своего компьютера, маску подсети. Перепрошил платку, предварительно откомпилировав с новым IP и маской подсети. Девайсу установил IP с 255 в конце. Девайс не вижу. Что можно предпринять чтоб не ставить еще одну сетевую карту? Девайсу установил IP с 255 в конце.255 в IP адресе зарезервировано
|
|
|
|
|
Oct 18 2013, 06:59
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 11-01-09
Пользователь №: 43 172

|
Цитата(smk @ Oct 18 2013, 10:41)  Я уже думал об этом, но во первых не так уж я и подкован в этих вопросах, потому и взялся разбираться чтоб подучить это дело. Во вторых нужно выяснить точку зрения провайдера. Не факт, что мне можно более одной машины в той сети держать.
Пробежался по проекту от Терры. По видимому DHCP там не поддерживается. Во всяком случае упоминания не нашел. Я кто не дает добавить еще одну сеть (192.168.x.x или 10.x.x.x), которая точно не пересечется с сетью провайдера. На компьютере убрать автоматическое получение адреса через DHCP, прописать IP адрес из сети провайдера руками и добавить 2 IP адрес для сетевой картыт из сети 192.168.x.x. А на железке прописать статический адрес из второй сети
Сообщение отредактировал antis - Oct 18 2013, 07:00
|
|
|
|
|
Oct 23 2013, 15:22
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Цитата(сарматъ @ Oct 22 2013, 15:25)  спасибо, можете поделиться примерами из кейл5? Там визарт встроенный. А примеры поставляются вместе с кейлом. Там их куча. http://www.keil.com/pack/doc/mw/Network/ht...create_app.html
|
|
|
|
|
Oct 23 2013, 18:16
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Цитата(smk @ Oct 23 2013, 21:07)  Я так понимаю, что этот визард появился в 5 кейле, а ранее его небыло? Этот только в 5 появился. Хотя это только визард создания проэкта. Внутри проэкта всеравно появятся другие визады по настройке RTOS, Ethernet, ETH-PHY, протоколов и т.д. Правда теперь кейловцы предлогают вариант не только со своей библиотекой, но и с lwip, хотя в примерах он у них и раньше был. Лично я не пробывал 5 версию, пока все неплохо работает и с 4.72. Ниже лучше не ставить, поскольку там пару тройку не фатальных ошибок еще не исправлены. Удачи.
|
|
|
|
|
Oct 27 2013, 12:14
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
сетевые настройки, забиваете фиксированный IP тот что у вас, маску подсети что определилась, шлюз и все такое... в сетевом устройстве все тоже самое, только айпи сдвигаете, ну типа у компьютера 192.168.1.10, а плате дайте 192.168.1.20 например. Пинганите для теста без платы, чтобы убедиться что кроме нее нет случайно такого же узла. Потом пингуйте плату.
Только учтите что ответ на пинг так же часть стэка, и без стэка пинга не будет.
у LwIP есть процедура начальной инициализации, в зависимости от режим с операционкой или без нее.
Дальше надо постоянно вызывать функции обработки ТРС сообщений. Которые внутри себя будут вызывать callback функции с принятыми данными и событиями.
Насчет буферизации, для ТСР определен пакет от 56 до 1500 скольких то байт. Но никто не говорит что данные должны идти единым пакетом, более того есть оборудования (например wifi) который любит дробить и менять порядок пакетам, не всегда, но есть экземпляры. ТСР берет на себя сбор и выстраивание пакетов в нужном порядке. Более того у него есть так называемое окно, которое при заполнении не дает посылать данные дальше пока старые не будут приняты и обработаны, так что через ТСР можно послать бесконечной длинны поток данных.
|
|
|
|
|
Nov 6 2013, 10:15
|
Частый гость
 
Группа: Участник
Сообщений: 153
Регистрация: 19-11-12
Пользователь №: 74 463

|
Цитата(vlad_new @ Oct 23 2013, 22:16)  Этот только в 5 появился. Хотя это только визард создания проэкта. Внутри проэкта всеравно появятся другие визады по настройке RTOS, Ethernet, ETH-PHY, протоколов и т.д. поставил 5 посмотрел и примеры и то что делает визард... что то можно использовать, но очень многое остается за кадром как понимаю в проприетарной закрытой части .либ например алгоримы пререинициализации phy & mac... может быть есть где то примеры хорошей работы с ethernet?
|
|
|
|
|
Nov 11 2013, 12:50
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(smk @ Nov 11 2013, 11:28)  Пытался скачать стек от кейла но так и не увидел где ссылка. А что надежней, от кейла или lwip? А попытаться передавать это значит писать в буфер и как-то командовать отправку? С буфером понятно, но как пнуть на отправку? Я так понял, что буфер имеет несколько страниц, в частности 8 на прием, а 2 на передачу? В смысле в реализации от терры. Да фиг его знает что надежнее В LwIP есть исходники, если что можно переписать Стэк от кейла - закрытый, библиотека и досвидос, если что не так, только им писать С другой стороны кеил уважаемая фирма, и как в их среде можно выбрать из списка процессор и сразу его характеристики ставятся, так и стэк как то очень легко сам цепляется. как пнуть начало передачи в СТМ что-то не знаю...
|
|
|
|
|
Nov 11 2013, 13:53
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Не надо ничего качать. Библиотека уже у вас лежит вот где то там ..\ARM\RV31\LIB\TCP_CM3.lib В визарте Net_Config.c ставите галочки какие надо. К пректу надо подключить драйвер ETH соответствующий вашему модему. В мэйне запускаете инициализацию портов. Затем запускается init_TcpNet(); далее в цыкле мэин вызавается timer_poll(); и main_TcpNet(); и все. Все остальное делается при помощи callback функций, которые запускаются из библиотеки кейла. Все нужные callback функции сначала должны быть объявлены и проинициализированы. К примеру callback для приема и передачи пакетов по UDP выглядит так: Код udp_soc=udp_get_socket(0,UDP_OPT_SEND_CS|UDP_OPT_CHK_CS,udp_callback); // UDP socket if(udp_soc!= 0) udp_open(udp_soc, 1000); // Open UDP port 1000 for communication Вот так ( к примеру ) выглядит прием команды по UDP и отправка разных параметров в ответ: Код u16 udp_callback1 (u8 socket, u8 *remip, u16 remport, u8 *buf, u16 len) { u8 *send; char tbf[4]; u32 dp;
if((!memcmp(buf,"GET",3))||(!memcmp(buf,"Get",3))||(!memcmp(buf,"get",3))) { if(DHCP_off) strcpy(tbf,"OFF"); else strcpy(tbf,"ON"); dp=*(u32*)&localm[0]; send = udp_get_buf(256); // Len 256 !!! len=sprintf((char*)send, "\nMAC[%02X:%02X:%02X:%02X:%02X:%02X]" "\nIP[%d.%d.%d.%d]" "\nMASK[%d.%d.%d.%d]" "\nGW[%d.%d.%d.%d]" "\nDNS[%d.%d.%d.%d]" "\nDHCP_%s" "\nIP_DHCP[%d.%d.%d.%d]" "\nNAME[%s]\n", own_hw_adr[0], own_hw_adr[1], own_hw_adr[2], own_hw_adr[3], own_hw_adr[4], own_hw_adr[5], nlocalm[0].IpAdr[0], nlocalm[0].IpAdr[1], nlocalm[0].IpAdr[2], nlocalm[0].IpAdr[3], nlocalm[0].NetMask[0], nlocalm[0].NetMask[1], nlocalm[0].NetMask[2], nlocalm[0].NetMask[3], nlocalm[0].DefGW[0], nlocalm[0].DefGW[1], nlocalm[0].DefGW[2], nlocalm[0].DefGW[3], nlocalm[0].PriDNS[0], nlocalm[0].PriDNS[1], nlocalm[0].PriDNS[2], nlocalm[0].PriDNS[3], tbf, dp&0xFF, (dp>>8)&0xFF, (dp>>16)&0xFF, (dp>>24)&0xFF, (char*)lhost_name); udp_send (udp_soc1, remip, 1000, send, len); } return (0); } В lwip точно так же все делается через callback функции.
|
|
|
|
|
Nov 11 2013, 17:08
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Добавил библиотеку и файл Net_Config.c; подключил Net_Config.h Пишет вот такую ошибку: F:\PROGRAM\Keil454\ARM\RL\TCPnet\Config\Net_Config.c(859): error: #20: identifier "ERR_MEM_LOCK" is undefined Что можно сделать? Спасибо. С этим разобрался. Добавил в: Код typedef enum { /* << Fatal System Error Codes >> */ ERR_MEM_ALLOC, ERR_MEM_FREE, ERR_MEM_CORRUPT, ERR_MEM_LOCK, //вот сюда ERR_UDP_ALLOC, ERR_TCP_ALLOC, ERR_TCP_STATE } ERROR_CODE; Теперь другие ошибки: eth107.axf: Error: L6218E: Undefined symbol init_ethernet (referred from at_ethernet.o). eth107.axf: Error: L6218E: Undefined symbol send_frame (referred from at_ethernet.o). С этим сложнее. Может кто подскажет как поступить? Net_lib.c нужно включать в проект?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Nov 12 2013, 11:36
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Nov 12 2013, 12:59)  ну вы их не увидите они в библиотеке кейла вызываются. у меня тел этих функций тоже нет... http://www.keil.com/support/man/docs/rlarm...it_ethernet.htmThe init_ethernet function is part of RL-TCPnet. The prototype is defined in net_config.h. Тогда почему кейл их не видит? Как я понимаю, если в net_config.h они упомянуты, то в net_config.с длжны быть описаны? Убедительная просьба - ткните носом в пример от кейла, где все это работает. Попроще пример.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Nov 13 2013, 08:23
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
БЛИН! прошу прощения, я вас полностью обманул... вызова этих функций найти нельзя он внутри библиотеки, а сами эти функции должны быть созданы.... у меня к LPC есть еще файлик EMAC_LPC17xx.c - там описаны все патроха управления емаком, инициализируются прерывания и мак контроллер в нем есть эта функция CODE void init_ethernet (void) { /* Initialize the EMAC ethernet controller. */ uint32_t regv,tout,id1,id2; DBG_PHY(""); DBG_PHY("\r\nDBG_PHY: Starting Init Physic"); /* Power Up the EMAC controller. */ LPC_SC->PCONP |= 0x40000000;
/* Configure PHY */ LPC_GPIO4 -> FIOSET |= 1<<29; LPC_GPIO4 -> FIODIR |= 1<<29; LPC_GPIO1 -> FIOCLR |= 1<<14; LPC_GPIO1 -> FIODIR |= 1<<14; LPC_GPIO1 -> FIOCLR |= 1<<8; LPC_GPIO1 -> FIODIR |= 1<<8;
/* Power doun/up Reset PHY for strapping */ LPC_GPIO4 -> FIOCLR |= 1<<29; for(tout=0;tout<1000000;tout++); LPC_GPIO4 -> FIOSET |= 1<<29; for(tout=0;tout<1000000;tout++);
/* Enable P1 Ethernet Pins. */ LPC_PINCON->PINSEL2 = 0x50150105; /* LPC176x devices, no MDIO, MDC remap. */ LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & ~0x0000000F) | 0x00000005;
/* Reset all EMAC internal modules. */ LPC_EMAC->MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX | MAC1_SIM_RES | MAC1_SOFT_RES; LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES | CR_PASS_RUNT_FRM;
/* A short delay after reset. */ for (tout = 100; tout; tout--);
/* Initialize MAC control registers. */ LPC_EMAC->MAC1 = MAC1_PASS_ALL; LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN; LPC_EMAC->MAXF = ETH_MAX_FLEN; LPC_EMAC->CLRT = CLRT_DEF; LPC_EMAC->IPGR = IPGR_DEF;
/*PCLK=18MHz, clock select=6, MDC=18/6=3MHz */ LPC_EMAC->MCFG = MCFG_CLK_DIV28 | MCFG_RES_MII; for (tout = 100000; tout; tout--); LPC_EMAC->MCFG = MCFG_CLK_DIV28; for (tout = 100000; tout; tout--);
/* Enable Reduced MII interface. */ LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM; //LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM | CR_PASS_RX_FILT;
/* Reset Reduced MII Logic. */ LPC_EMAC->SUPP = SUPP_RES_RMII; for (tout = 100; tout; tout--); LPC_EMAC->SUPP = 0; //PHY_ADDR = 0; DBG_PHY("\r\nDBG_PHY: Starting Scan PHY address:\r\n"); //while(1) for(PHY_ADDR = 0; PHY_ADDR<32;PHY_ADDR++) { DBG_PHY("."); /* Put the PHY in reset mode */ write_PHY (PHY_REG_BMCR, 0x8000); for (tout = 10000; tout; tout--);
/* Wait for hardware reset to end. */ for (tout = 0; tout < 0x100; tout++) { regv = read_PHY (PHY_REG_BMCR); if (!(regv & 0x8000)) { /* Reset complete */ break; } } if (tout < 0x100) break; else ; //PHY_ADDR++; //PHY_ADDR&=0x1f; } if(PHY_ADDR<31) { DBG_PHY("\r\nDBG_PHY: Found at PHY_ADDR = %d",PHY_ADDR); } else { DBG_PHY_ERR("\r\nDBG_PHY_ERR: PHY_ADDR Error"); return; }
/* Check if this is a kz8721 PHY. */ id1 = read_PHY (PHY_REG_IDR1); id2 = read_PHY (PHY_REG_IDR2); DBG_PHY("\r\nDBG_PHY: ID1-0x%04X, ID2-0x%04X",id1, id2);
if (((id1 << 16) | (id2 & 0xFFF0)) != 0x221610) { DBG_PHY_ERR("\r\nDDBG_PHY_ERR: Not a KS8721 PHY - ID1-0x%04X, ID2-0x%04X",id1, id2); return; } else { DBG_PHY("\r\nDBG_PHY: KS8721 PHY - Sucñess"); }
/* Configure the PHY device */ #if defined (_10MBIT_) /* Connect at 10MBit */ write_PHY (PHY_REG_BMCR, PHY_FULLD_10M); #elif defined (_100MBIT_) /* Connect at 100MBit */ write_PHY (PHY_REG_BMCR, PHY_FULLD_100M); #else DBG_PHY("\r\nDBG_PHY: Starting AutoNegotiation Process\r\n"); /* Use autonegotiation about the link speed. */ write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG); /* Wait to complete Auto_Negotiation. */ for (tout = 0; tout < 0x30000; tout++) { regv = read_PHY (PHY_REG_BMSR); if( !(tout%3000) ) DBG_PHY("."); if (regv & 0x0020) { DBG_PHY("\r\nDBG_PHY: AutoNegotiation Sucñess tout = %d Counts",tout); /* Autonegotiation Complete. */ break; } } #endif if (tout >= 0x30000) { DBG_PHY_ERR("\r\nDBG_PHY_ERR: AutoNegotiation failed."); DBG_PHY_ERR("\r\nDBG_PHY:Possibly Cable Unplugget"); DBG_PHY_ERR("\r\nDBG_PHY:Manual Assign: Full duplex - 100 Mbit Mode"); write_PHY (PHY_REG_BMCR, PHY_FULLD_100M); //return; // auto_neg failed }
/* Check the link status. */ for (tout = 0; tout < 0x10000; tout++) { regv = read_PHY (PHY_REG_BMSR); if (regv & 0x0004) { /* Link is on. */ DBG_PHY("\r\nDBG_PHY: Link is ON"); break; } }
if (tout >= 0x10000) { DBG_PHY("\r\nDBG_PHY: Link is OFF"); }
regv = ((read_PHY (0x1f))>>2)&0x7;
/* Configure Full/Half Duplex mode. */
if ((regv==0x0005)||(regv==0x0006)) { /* Full duplex is enabled. */ LPC_EMAC->MAC2 |= MAC2_FULL_DUP; LPC_EMAC->Command |= CR_FULL_DUP; LPC_EMAC->IPGT = IPGT_FULL_DUP; DBG_PHY("\r\nDBG_PHY: Full duplex is enabled."); }
if ((regv==0x0001)||(regv==0x0002)) { /* Half duplex mode. */ LPC_EMAC->IPGT = IPGT_HALF_DUP; DBG_PHY("\r\nDBG_PHY: Half duplex is enabled."); }
if ((regv==0x0005)||(regv==0x0001)) { /* 10MBit mode. */ LPC_EMAC->SUPP = 0; DBG_PHY("\r\nDBG_PHY: 10MBit mode."); } if ((regv==0x0006)||(regv==0x0002)) { /* 100MBit mode. */ LPC_EMAC->SUPP = SUPP_SPEED; DBG_PHY("\r\nDBG_PHY: 100MBit mode."); }
#ifdef DEBUG regv = read_PHY (PHY_REG_BMCR); DBG_PHY("\r\nDBG_PHY: Register 0h - Basic Control = 0x%X",regv); regv = read_PHY (PHY_REG_BMSR); DBG_PHY("\r\nDBG_PHY: Register 1h - Basic Status = 0x%X",regv);
regv = read_PHY (PHY_REG_ANAR); DBG_PHY("\r\nDBG_PHY: Register 4h - Auto-Negotiation Advertisement = 0x%X",regv); regv = read_PHY (PHY_REG_ANLPAR); DBG_PHY("\r\nDBG_PHY: Register 5h - Auto-Negotiation Link Partner Ability = 0x%X",regv); regv = read_PHY (PHY_REG_ANER); DBG_PHY("\r\nDBG_PHY: Register 6h - Auto-Negotiation Expansion = 0x%X",regv); regv = read_PHY (PHY_REG_ANNPTR); DBG_PHY("\r\nDBG_PHY: Register 7h - Auto-Negotiation Next Page = 0x%X",regv); regv = read_PHY (PHY_REG_LPNPA); DBG_PHY("\r\nDBG_PHY: Register 8h - Link Partner Next Page Ability = 0x%X",regv); #endif { /* Using Device Serial Number For Define Last 3 MAC Address */ uint32_t p0,p1,p2,p3,s; DBG_PHY("\r\nDBG_PHY: Reading Device Serial Number:"); u32IAP_ReadSerialNumber(&p0, &p1, &p2, &p3); //óïàêóåì ñåðèéíûé íîìåð â 32 áèòà s = p0 + p1 + p2 + p3; //32 áèòà óïàêóåì â 24, ÷òîáû èñïîëüçîâàòü äëÿ ìàê àäðåñà s = s&0xFF + s>>8; DBG_PHY("\r\nDBG_PHY: Chip Serial Number = 0x%08X 0x%08X 0x%08X 0x%08X",p0,p1,p2,p3); DBG_PHY("\r\nDBG_PHY: Chip Summ Serial = 0x%08X ",s); DBG_PHY("\r\nDBG_PHY: Device Hardware Address:" ); own_hw_adr[3] = ( (s>>16) & 0xFF); own_hw_adr[4] = ( (s>>8 ) & 0xFF); own_hw_adr[5] = ( (s ) & 0xFF); DBG_PHY("\r\nDBG_PHY: %02X %02X %02X %02X %02X %02X", own_hw_adr[0], own_hw_adr[1], own_hw_adr[2], own_hw_adr[3], own_hw_adr[4], own_hw_adr[5] ); } /* Set the Ethernet MAC Address registers */ LPC_EMAC->SA0 = ((uint32_t)own_hw_adr[5] << 8) | (uint32_t)own_hw_adr[4]; LPC_EMAC->SA1 = ((uint32_t)own_hw_adr[3] << 8) | (uint32_t)own_hw_adr[2]; LPC_EMAC->SA2 = ((uint32_t)own_hw_adr[1] << 8) | (uint32_t)own_hw_adr[0];
/* Initialize Tx and Rx DMA Descriptors */ rx_descr_init (); tx_descr_init ();
/* Receive Broadcast, Multicast and Perfect Match Packets */ LPC_EMAC->RxFilterCtrl = RFC_MCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN; /* Receive Broadcast and Perfect Match Packets */ //LPC_EMAC->RxFilterCtrl = RFC_BCAST_EN | RFC_PERFECT_EN;
/* Enable EMAC interrupts. */ LPC_EMAC->IntEnable = INT_RX_DONE | INT_TX_DONE ;
/* Reset all interrupts */ LPC_EMAC->IntClear = 0xFFFF;
/* Enable receive and transmit mode of MAC Ethernet core */ LPC_EMAC->Command |= (CR_RX_EN | CR_TX_EN); LPC_EMAC->MAC1 |= MAC1_REC_EN;
DBG_PHY("\r\nDBG_PHY: PHY Config Done\r\n" ); return; }
посылка фрейма там же CODE void send_frame (OS_FRAME *frame) { /* Send frame to EMAC ethernet controller */ uint32_t idx,len; uint32_t *sp,*dp;
idx = LPC_EMAC->TxProduceIndex; sp = (uint32_t *)&frame->data[0]; dp = (uint32_t *)Tx_Desc[idx].Packet;
/* Copy frame data to EMAC packet buffers. */ for (len = (frame->length + 3) >> 2; len; len--) { *dp++ = *sp++; } Tx_Desc[idx].Ctrl = (frame->length-1) | (TCTRL_INT | TCTRL_LAST);
/* Start frame transmission. */ if (++idx == NUM_TX_FRAG) idx = 0; LPC_EMAC->TxProduceIndex = idx; } это я чего то реально затупил. Это же привязанные к конкретному железу функции, они не могли быть в библиотеке.... у вас должен быть библиотека - драйвер от вашего мак контролера, найдите в ней подходящие функции и организуйте вызов!
|
|
|
|
|
Nov 13 2013, 10:59
|
Частый гость
 
Группа: Участник
Сообщений: 177
Регистрация: 25-08-05
Из: Ставрополь
Пользователь №: 7 964

|
Цитата(smk @ Nov 12 2013, 23:03)  Да подключил, как я понимаю. Или еще как-то нужно? Попробуйте начать с простого. 1. Создайте пустой проект в Кейле, где есть только начальная инициализация STM32F107 и убедитесь, что контроллер нормально запускается (например мигает светодиодом). Хорошо бы проконтролировать частоту ядра выводом на выход PA8. 2. Далее подключите в проект файлы ETH_STM32X.c и ETH_STM32X.h (лежат в c:\Keil\ARM\RL\TCPnet\Drivers\). Это драйвер Кейла для Ethernet MAC и инициализация PHY. Он очень простой по сравнению с STM-овским, в нём легче разобраться для начала. По умолчанию там всё для физики DP83848C. 3. Вам нужно поправить в ETH_STM32X.h всё, что ниже строки комментария /* DP83848C PHY Registers */. Для простоты я бы оставил сначала только первые 8 регистров, для проверки работоспособности хватит (если у Вас RTL8201 то первые 6 регистров). Исправьте #define DP83848C_ID 0x20005C90 на свой (из даташита на Вашу микросхему физики). Исправьте #define DP83848C_DEF_ADR 0x01 на адрес Вашей микросхемы физики (обратите внимание, что он может изменяться от схемы включения - всё описано в даташите). 4. Далее в файле ETH_STM32X.c идём в функцию void init_ethernet (void). Там два варианта подключения физики - по MII или по RMII. Оставьте только свой вариант, чтобы не путаться. Затем необходимо обратить внимание на строку /* MDC Clock range 60-72MHz. */ ETH->MACMIIAR = 0x00000000; Если у Вас частота ядра менее 60 МГц, то надо из референс мануал подставить другое значение (см. RM0008 раздел SMI clock selection). Уберите временно проверку по условию if (((id1 << 16) | (id2 & 0xFFF0)) == DP83848C_ID) - это проверка идентификатора физики. Уберите блок от /* Check the link status. */ - в Вашей микросхеме физики может не быть этого регистра. Обратите внимание на массив extern U8 own_hw_adr[];. Это массив МАС адреса, на данном этапе, чтобы не подключать Net_Config.c определите его локально (не забудьте младший байт поставить в 0х00 для начала, чтобы случайно не сделать броадкаст). 5. Начинаем отладку. В main() вызываем init_ethernet () и Вашим любимым методом (дебагом или принтом через последовательный порт, или выводом на экранчик, если есть) смотрим возвращаемые функцией read_PHY() значения. Сравнивайте с тем, что видите в описании битов регистра в даташите на Ваш PHY. Здесь пригодятся регистры 0х02 и 0х03 - в них идентификатор. Если все время читается 0xff или 0х00 то попробуйте менять адрес (в строке #define DP83848C_DEF_ADR) от 0 до 32. Если все равно ничего не получается возвращайтесь к анализу схемы (желательно с осциллографом). 6. Когда начнут нормально читаться регистры, пройдитесь по всем доступным в даташите и посмотрите, что с физикой становится после инициализации. Возможно будут проблемы с autonegotiation - PHY может не определить скорость сам. Пните его принудительно: write_PHY (PHY_REG_BMCR, PHY_FULLD_10M); или write_PHY (PHY_REG_BMCR, PHY_FULLD_100M);. 7. Когда увидите по состоянию регистров физики, что линк поднят - только тогда можно переходить к попыткам поднять стек. Это отдельно уже. Удачи!
|
|
|
|
|
Nov 13 2013, 18:56
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Что удалось сделать. П.1-4 сделал полностью. Инициализацию пинов сделал без ремапа так, как собрано на плате. Добавил #include "type.h" чтоб вручную все не доводить. Но дальше не пошло т.к. остались сообщения об ошибке: Код ETH_keil.axf: Error: L6218E: Undefined symbol alloc_mem (referred from eth_stm32x.o). ETH_keil.axf: Error: L6218E: Undefined symbol put_in_queue (referred from eth_stm32x.o). Что можно предпринять? Спасибо. Вот там похоже упомянуты: Код /*--------------------------- interrupt_ethernet ----------------------------*/
void ETH_IRQHandler (void) { /* Ethernet Controller Interrupt function. */ OS_FRAME *frame; U32 i,RxLen,int_stat; U32 *sp,*dp;
while (((int_stat = ETH->DMASR) & INT_NISE) != 0) { ETH->DMASR = int_stat; if (int_stat & INT_RIE) { /* Valid frame has been received. */ i = RxBufIndex; if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) { goto rel; } if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK) { goto rel; } RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4; if (RxLen > ETH_MTU) { /* Packet too big, ignore it and free buffer. */ goto rel; } /* Flag 0x80000000 to skip sys_error() call when out of memory. */ frame = alloc_mem (RxLen | 0x80000000); /* if 'alloc_mem()' has failed, ignore this packet. */ if (frame != NULL) { sp = (U32 *)(Rx_Desc[i].Addr & ~3); dp = (U32 *)&frame->data[0]; for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--) { *dp++ = *sp++; } put_in_queue (frame); } /* Release this frame from ETH IO buffer. */ rel: Rx_Desc[i].Stat = DMA_RX_OWN;
if (++i == NUM_RX_BUF) i = 0; RxBufIndex = i; } if (int_stat & INT_TIE) { /* Frame transmit completed. */ } } } Закоментировал обработчик и получилось скомпилировать. Физику читает, идентификатор читает правильно. Линк светится. С autonegotiation проблем нет если кабель подключен. PHY_REG_BMSR = 0x7869. Адрес физики = 31.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Nov 23 2013, 12:40
|
Частый гость
 
Группа: Участник
Сообщений: 166
Регистрация: 8-09-09
Из: Украина
Пользователь №: 52 244

|
Добрый день!
Прошу совета. Вкратце опишу суть вопроса.
В своих устройствах использую микроконтроллеры различных семейств(PIC, MSP430, планирую для более сложных проектов перейти на STM32). В основном устройства не очень сложные. Сейчас возникла необходимость в разработке устройств с web-интерфейсом(для конфигурирования, просмотра логов и т.п.) а также устройства должны будут складывать данные на удаленный сервер, обновлять прошивку удаленно и т.п.
Смотрел на микросхему W5100 со встроенным TCP/IP стеком. Запустить не ней простой web-интерфейс , насколько я понял, будет довольно несложно, однако смущает ее дороговизна и не сильно широкое растространение (я так понимаю ввиду ограниченности возможностей ее стека?). В результате этого пришел к выводу что все-таки предпочтительнее использовать софтверный стек внутри контроллера и простую физику снаружи(в случае PIC18F97J60 и подобных еще дешевле все получается, т.к. физика внутри контроллера).
Уважаемые специалисты, посоветуйте пожалуйста новичку какой из стеков (lwip, или от microchip, или еще какой-то) мне лучше выбрать чтобы, так сказать, он был более универсальным, т.е. при необходимости его можно было портировать на разные семейства контроллеров? Или же предпочтительно остановиться на каком-то одном семействе для работы с ethernet?
Сообщение отредактировал Pasha_a13 - Nov 23 2013, 12:44
|
|
|
|
|
Nov 26 2013, 17:46
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Nov 25 2013, 21:29)  init_TcpNet ();
а потом в цикле вызывайте main_TcpNet(); не забудьте заполнить tcpip_user.с
вроде на пинг после этого должен начать отвечать
потом сделаете сокеты, и пропишите функции обменов Может имеет смысл подключить библиотеку от кейла и нужные файлы? Попытался скомпилировать с библиотекой и файлами Net_Config.c / Net_Config.h Получил ошибку: Код F:\Program\Keil454\ARM\RV31\Inc\RTL.h(37): error: #256: invalid redeclaration of type name "S8" (declared at line 31 of "type.h") Как цивилизованно выйти из ситуации?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Nov 26 2013, 20:26
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(smk @ Nov 26 2013, 21:46)  Может имеет смысл подключить библиотеку от кейла и нужные файлы? Попытался скомпилировать с библиотекой и файлами Net_Config.c / Net_Config.h Получил ошибку: Код F:\Program\Keil454\ARM\RV31\Inc\RTL.h(37): error: #256: invalid redeclaration of type name "S8" (declared at line 31 of "type.h") Как цивилизованно выйти из ситуации? ну подключать библиотеку и нужные файлы само собой разумелось. проверить что все файлы, а в честности type.h защищены #ifndef header_name #define header_name #endif ну а дальше править файлы, где у вас один тип по 2 раза объявляется... файлы библиотеки считать основными, ваши файлы вторыми...
|
|
|
|
|
Nov 27 2013, 16:07
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
у меня как то так функция которую вызываю в цикле постоянно только коменты по кривому вставляются  , так что без них Код void TCP_IP_Process(void) { int16_t i; //ïàðàìåòð öèêëà timer_poll (); //îïðàøèâàåì òàéìåð, ôîðìèðóåì íåîáõîäèìûå äëÿ ðàáîòû ÒÑÐ òèêè main_TcpNet(); //îñíîâíàÿ ôóíêöèÿ ðàáîòû ÒÑÐ ñòýêà dhcp_check (); //ïðîâåðÿåì DHCP //îòïðàâêà ãîòîâûõ äàííûõ UDP SendUDPdata(&UdpSock); //ïðîâåðÿåì äëÿ êàêèõ ñîêåòîâ âîçìîæíî î÷èñòèòü îêíî è îòïðàâëÿåì ãîòîâûå äàííûå åñëè åñòü for(i = 0; i < TCP_SOCKET_NUMBER; i++)//öèêë ïî âñåì ñîêåòà { SendTCPdata(&(TcpSock[i])); //îòïðàâêà ãîòîâûõ äàííûõ if( GetFIFOBufferSize(TcpSock[i].InputBufferStr) >= TcpSock[i].FreeWindowSize) //åñëè â áóôåðå åñòü äîñòàòî÷íî ìåñòà tcp_reset_window(TcpSock[i].SocketNumber); //î÷èùàåì îêíî äàííîãî ñîêåòà } tick = __FALSE; //ñáðàñûâàåì òèê åñëè ïîÿâèëñÿ, åñëè íåò, íè÷åãî ñòðàøíîãî } SendTCP, SendUDP - это мои функции отправки ТСР и UDP сообщений из моих буферов, GetFIFOBufferSize - это тоже моя для проверки места в буфере, чтобы понять можно окно ТСР отпускать или еще нет. и вот функция таймера что тики выставляет Код char Tcp100mSec = 0; static void timer_poll () { /* System tick timer running in poll mode */ if (SysTick->CTRL & 0x10000) { if ( Tcp100mSec++ >= 100 ) { Tcp100mSec = 0; /* Timer tick every 100 ms */ timer_tick(); tick = __TRUE; } } }
в этой функции ставиться глобальный tick тот что в dhcp у меня используется, а timer_tick() - это функция стэка
а tick используется в DHCP, для расчета таймаута и опроса не нашел ли он айпишник.
|
|
|
|
|
Dec 4 2013, 17:30
|

Местный
  
Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528

|
1. Ваш Phy чип определяется? Цитата /* Check if this is a RTL8201CP PHY. */ id1 = read_PHY (PHY_REG_IDR1); id2 = read_PHY (PHY_REG_IDR2); что в регистрах id1 и id2, т.е. идентификатор для RTL8201 определяется корректно? Пробегитись с отладчиком, после указанных строк в if попадаете? 2. Где 'Net_lib.c'?
--------------------
Для связи email: info собака qbit.su
|
|
|
|
|
Dec 4 2013, 17:51
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(bzx @ Dec 4 2013, 19:30)  1. Ваш Phy чип определяется?
что в регистрах id1 и id2, т.е. идентификатор для RTL8201 определяется корректно? Пробегитись с отладчиком, после указанных строк в if попадаете?
2. Где 'Net_lib.c'? Определяется. Пробежался. Net_lib.c - что такое? init_ethernet(); закоментил, dhcp_disable (); добавил. Пингуетя!!! Ура!!! Теперь хочется двигаться дальше. Например принимать - передвать пакет. Сначала хоть маленький, затем и в пару десятков кило можно. Код int main (void) { USART1_Init(); // init_ethernet(); init_TcpNet (); dhcp_disable ();
/* Setup and enable the SysTick timer for 100ms. */ SysTick->LOAD = (72000000 / 10) - 1; SysTick->CTRL = 0x05; while (1) {
timer_poll (); main_TcpNet(); } /* Loop forever */ }
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 4 2013, 20:27
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
дальше уже дело техники, все очень просто! Код //выделяете сокет SocketNumber = tcp_get_socket (TCP_TYPE_SERVER | TCP_TYPE_DELAY_ACK | TCP_TYPE_FLOW_CTRL | TCP_TYPE_KEEP_ALIVE, 0, 65535, tcp_callback);
//если получилось, ставите его на прослушку - это сокет который принимает конект if (SocketNumber != 0) { /* Start listening on TCP port DevEthInfo.CtrlPort */ tcp_listen (SocketNumber, PortNumber); } tcp_callback - это функция обработки событий Код uint16_t tcp_callback (uint8_t soc, uint8_t evt, uint8_t *buf, uint16_t len) { /* This function is called by the TCP module on TCP event */ /* Check the Net_Config.h for possible events. */ switch (evt) { case TCP_EVT_DATA: //ïðèøëè äàííûå /* TCP data frame has arrived, data is located at *buf, */ /* data length is len. Allocate buffer to send reply. */ break;
case TCP_EVT_CONREQ: /* Remote host is trying to connect to our TCP socket. */ return (1); case TCP_EVT_ABORT: break; case TCP_EVT_CONNECT: /* Socket is connected to remote peer. */ return (1); case TCP_EVT_CLOSE: break; case TCP_EVT_ACK: /* Our sent data has been acknowledged by remote peer */ break; } return (0); в эту функцию надо написать прием данных по событию TCP_EVT_DATA, buf - данные, len - длинна учтите если вы никуда не сохранили данные они просто пропадут чтобы послать данные tcp_send (SocketNumber, sendbuf, SendDataSize); для сброса окна tcp_reset_window(SocketNumber) это функция нужна если сокет делали с флагом TCP_TYPE_FLOW_CTRL она сбрасывает окно, в кейловском стеке окно сбрасывается разом, по кусочкам из него не вычитывается. самое простое - это сервер в функцию приема воткнуть посылку данных обратно и сброс окна. А да забыл. после того как вы это сделали и запустили, надо конектиться из винды(юникса, макоса и бла бла бла) к этому сокету, по заданному порту, и слать данные. со стороны винды(юникса) самое простое взять netcat это программка консольная которая позволяет устанавливать ТСР соединение по заданному порту, слать и принимать данные
|
|
|
|
|
Dec 5 2013, 07:58
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Вот такое сообщение об ошибке получилось: Код main_eth.c(48): error: #20: identifier "TCP_TYPE_KEEP_ALIVE" is undefined и ведь действительно в rtl.h не определено. Как поступить? Попутно хотелось бы понимать ситуацию когда обращается скажем 2 и более клиента, при этом каждому нужны свои данные. Как их различать и отслеживать? Количество одновременных коннектов, я так понимаю лимитируется только размером памяти?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Dec 5 2013, 18:41
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
у меня такое написано Код #define TCP_TYPE_SERVER 0x01 /* Socket Type Server (open for listening) */ #define TCP_TYPE_CLIENT 0x02 /* Socket Type Client (initiate connect) */ #define TCP_TYPE_DELAY_ACK 0x04 /* Socket Type Delayed Acknowledge */ #define TCP_TYPE_FLOW_CTRL 0x08 /* Socket Type Flow Control */ #define TCP_TYPE_KEEP_ALIVE 0x10 /* Socket Type Keep Alive */ #define TCP_TYPE_CLIENT_SERVER (TCP_TYPE_SERVER | TCP_TYPE_CLIENT) может старая версия стэка... она к 4.3 изменилась, FLOW_CTRL добавился вроде бы надо про ТСР читать. Соединение ТСР сокет - сокет, сокеты различаются по IP и номеру порта. по конекту вызывается калбэк, с параметрами того кто конектится, В установленное соединение сокет - сокет никто влезть не может. у меня 3 сокета в проекте, на каждом свой тип данных.
|
|
|
|
|
Dec 5 2013, 20:45
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
 нет такого флага в вашем кейле и вашей библиотеке, значит его использовать нельзя. это от 4.72, когда прошла смена стэка мне не ведомо, в 3.7 flow контроля не было по моим данным Вам надо концептуально понять Сокет - это розетка. Воткнули вилку - розетку заняли SocketNumber - это идентификатор этой розетки. если в него кто-то подсоединится он собой этот сокет займет. И все что сокет пошлет, будет для него, а все что он пошлет придет в этот сокет если номер 0 - то значит сокет не сделался, для этого проверка, а если он сделался, то к нему подключается прослушка и калбэк функция обратите внимание что в uint16_t tcp_callback (uint8_t soc, uint8_t evt, uint8_t *buf, uint16_t len) есть параметр soc - это как раз этот номер, то есть если вы сделаете много сокетов, то они будут вызывать калбэк функцию каждый со своим номером.
|
|
|
|
|
Dec 22 2013, 10:24
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Golikov A. @ Dec 5 2013, 22:45)   нет такого флага в вашем кейле и вашей библиотеке, значит его использовать нельзя. это от 4.72, когда прошла смена стэка мне не ведомо, в 3.7 flow контроля не было по моим данным Вам надо концептуально понять Сокет - это розетка. Воткнули вилку - розетку заняли SocketNumber - это идентификатор этой розетки. если в него кто-то подсоединится он собой этот сокет займет. И все что сокет пошлет, будет для него, а все что он пошлет придет в этот сокет если номер 0 - то значит сокет не сделался, для этого проверка, а если он сделался, то к нему подключается прослушка и калбэк функция обратите внимание что в uint16_t tcp_callback (uint8_t soc, uint8_t evt, uint8_t *buf, uint16_t len) есть параметр soc - это как раз этот номер, то есть если вы сделаете много сокетов, то они будут вызывать калбэк функцию каждый со своим номером. Появилось время продолжить. Про сокет я понял. Только не соображу как все устроено. Если сокетов несколько, то как все изменится программно? SocketNumber я так понимаю переменная которую надо объявить? "есть параметр soc - это как раз этот номер" т.е. всякий раз когда вызвана tcp_callback используя soc можно узнать для какого сокета произошел вызов и соответственно обработать, так? Только вот не ясно. Скажем есть сокеты с номерами 1,2,3,4. Если сокет №2 освободился, то остальные так и останутся со своими номерами? "ставим на прослушку" имеется в виду, что нужно постоянно проверять значение SocketNumber?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|