|
|
  |
STM32F107 + RTL8201 + lwip-1.4.0, драйвер PHY для lwip |
|
|
|
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 нужно включать в проект?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|