Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" icon

Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) "iEthernet Bootcamp"



НазваниеУчебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) "iEthernet Bootcamp"
Дата конвертации26.08.2012
Размер155.33 Kb.
ТипУчебный курс

Учебный курс по WIZnet W5100


Перевод статьи Фреда Иди (Fred Eady) “iEthernet Bootcamp”, CIRCUIT CELLAR, Issue 208 November 2007

Перевёл Дмитрий Иоффе dsioffe@yandex.ru


Вы готовы присоединиться к Интернет-революции? Если да, то настало время работать с сетевым контроллером с аппаратной реализацией стека TCP-IP W5100 фирмы WIZnet. В этой статье Фред поможет Вам начать Ваш первый проект на W5100.


Я недавно получил письмо от читателя, который спрашивал, почему нет подробных статей о реализации TCP-IP с практическими рекомендациями. Честно говоря, я никогда не думал об этом, потому что обычно я предпочитаю формальному стеку TCP-IP небольшие, понятные, пригодные для работы в домашних условиях Ethernet-драйверы. Как журнальный автор, я, в первую очередь, предположил, что нехватка литературы по стеку TCP-IP вызвана победой стоимости над интересом. Я рассматривал много коммерческих предложений реализации стека TCP-IP, и, опираясь на свой опыт, я могу утверждать, что вы получаете то, за что платите. Мои читатели просто не могут позволить себе оплатить полнофункциональный стек TCP-IP для своих приложений и проектов.

Таким образом, почему я должен предлагать им читать о том, что они не могут позволить себе использовать? Вторая причина непопулярности статей о стеке TCP-IP в журнале – его сложность. Многие из вас писали для журналов, и вы знаете, что количество слов в статье ограничено. Для объяснения всего того, что надо знать о стеках TCP-IP, потребуется целая серия статей.

Я должен признать, что раньше я предлагал в своих статьях некоторые довольно дорогие вещи. Но сейчас, в силу указанных причин, я стараюсь этого избегать. Однако, когда я вижу что-то полезное для типичного читателя технических журналов, то я стараюсь следить за этим. Например, я обнаружил, что среди читателей Circuit Cellar очень популярны микросхемы для Ethernet с поддержкой свободных стеков TCP-IP. Также я увидел, что многие читатели, разрабатывающие однокристальные Ethernet-устройства, даже не используют стек TCP-IP. Вместо этого они, так же, как и я, используют простые драйверы протоколов, специально написанные для однокристальных Ethernet-устройств, которые они применяют в своих проектах. Я практикую то, что я исповедую, и то, о чём я собираюсь вам рассказать – это самый лучший в мире «гаражный» драйвер Ethernet и TCP-IP стек. Вы хотите использовать в своём устройстве однокристальное Ethernet-решение, обеспечивающее всю мощь коммерческих полнофункциональных TCP-IP стеков в простом драйвере Ethernet? Тогда читайте дальше, мой друг.
^

WIZnet W5100


Микросхема WIZnet W5100 – это однокристальное Ethernet-решение со встроенным стеком TCP-IP. Такой стек часто называют "зашитым".
Все замечательные возможности для доступа в Интернет, которые предоставляет W5100, помещаются в компактном 80-выводном корпусе LQFP. Кроме встроенного стека TCP-IP, W5100 содержит встроенную IEEE 802.3 10Base-T и 802.3u 100Base-TX-совместимую реализацию MAC и PHY уровней. Можно ожидать, что, раз стек TCP-IP обеспечивает всё необходимое, то устройство можно сразу подключить к сети Ethernet. Стек TCP-IP в W5100 поддерживает протоколы TCP, UDP, ICMP и ARP. Этого достаточно для большинства встроенных сетевых Ethernet приложений, разрабатываемых обычными людьми, такими, как Вы или я. Кроме того, устройство W5100 поддерживает PPPoE, что позволяет использовать его в приложениях ADSL.

Если Вы когда-либо экспериментировали со встроенными Ethernet-устройствами, Вы знаете, что нехватка буферной памяти при приёме или передаче может оказаться болезненной и уменьшить производительность Вашего устройства. Производители встроенных устройств для Ethernet знают об этом. Большинство однокристальных Ethernet-решений, предлагаемых в настоящее время, содержит достаточное количество специальной буферной памяти для приёма и передачи. Микросхема W5100 не является исключением, и она содержит 16 КБ внутренней буферной памяти.

Для обеспечения работы с небольшими микроконтроллерами в W5100 предусмотрено три способа обмена информацией с управляющим микроконтроллером: через SPI и при помощи прямого или косвенного доступа к памяти. Для лучшей совместимости с большинством современных микроконтроллеров напряжение питания W5100 сделано равным 3,3 В. Это позволяет непосредственно подключаться к малопотребляющим микроконтроллерам, которые также питаются от этого напряжения. Микросхема W5100 может также работать с разработанными ранее системами с напряжением питания 5 В, потому что её подсистема ввода-вывода может выдерживать такое напряжение.

W5100 поддерживает до четырех одновременно активных сокетов. Таким образом, все, что Вы должны знать - это основы программирования сокетов, потому что Вы будете ограждены от подробностей работы W5100 с Ethernet. W5100 разработана так, чтобы как можно удобнее предоставить всё необходимое для работы встроенного устройства с Ethernet. Единственные вещи, которые W5100 не будет делать для Вас - это написание Вашего собственного кода и обработку фрагментации IP пакетов.

Случайно у меня оказалось несколько микросхем W5100. Давайте создадим устройство на W5100 с нуля. Когда у нас получится аппаратная часть, мы добавим немного кода драйвера для микроконтроллера PIC18LF8722 фирмы Microchip Technology, установленного на нашей отладочной плате.
^

Устройство отладочной платы


Для Вашего удобства я предлагаю проект печатной платы на W5100 (см. рисунок 1), разработанный для фирмы EDTP Electronics. Файл проекта лежит на FTP сервере Circuit Cellar в формате ExpressPCB. Я выбрал ExpressPCB потому, что этот сервис относительно недорог и доступен каждому.




Рисунок 1. Моя отладочная плата с WIZnet W5100 на микроконтроллере PIC18LF8722 фирмы Microchip Technology. У PIC18LF8722 достаточно способностей, чтобы обеспечить доступ к регистрам W5100 и буферной памяти в любом из режимов на выбор: прямой доступ, косвенный доступ, SPI. При использовании PIC18LF8722, кроме того, в наше распоряжение попадает мощный набор средств разработки от фирмы Microchip.

Программное обеспечение ExpressPCB загружается бесплатно, и качество получаемых печатных плат очень высокое. Другой плюс, связанный с использованием ExpressPCB – это то, что Вам не понадобится разрабатывать Вашу плату для W5100 с нуля. Вы можете использовать мой шаблон ExpressPCB и доработать его под свою задачу. Если у Вас уже есть любимая САПР для подготовки печатных плат, Вы можете легко перенести мой проект в Вашу САПР, используя мой чертёж как руководство. В этом проекте нет ничего сложного.

Проект для EDTP Electronics основан на микроконтроллере PIC18LF8722 в стандартной конфигурации, который подключён к базовой конфигурации W5100. Как можно увидеть на рисунке 2, у PIC18LF8722 с запасом хватает выводов, чтобы подключиться к 15-разрядной адресной шине W5100, 8-разрядной шине данных и всем управляющим сигналам (*RD, *WR, *CS и *INT). В дополнение к соединениям для подключения к W5100 в режиме прямого доступа (A0:A14, D0:D7 и управляющие сигналы) я подключил порт SPI и вывод разрешения SPI у W5100 к интерфейсу ввода-вывода SPI микроконтроллера PIC18LF8722. Это позволит нам получить доступ к внутренностям W5100 в режиме SPI. Режим косвенной адресации, для которого требуются только две адресные линии, все восемь линий данных и все управляющие сигналы, в проекте EDTP тоже легко организовать, так как адресные линии притянуты к земле внутри W5100.




Рисунок 2. Мне нечего сказать о том, что Вы здесь видите. Однако, PIC18LF8722 напоминает мне мою любимую цитату из Military Channel: "Это воистину хороший, крепкий танк".

Все 80 линий ввода-вывода и питания PIC18F8722 разведены группами по 20 выводов со стандартным шагом 0,1”. Доступ к микроконтроллеру обеспечивается через сертифицированный фирмой Microchip модуль программирования/отладки с тактовой частотой 20 Мгц и порт RS-232. Я не включил в комплект никаких источников питания, потому что в продаже более чем достаточно готовых стабилизаторов с выходным напряжением 3,3В, которые требуются для питания платы с W5100 и внешней аппаратуры для программирования и отладки.

Рядом с микросхемой W5100 на отладочной плате EDTP расположен необходимый для неё кварцевый резонатор на 25 Мгц, а также экранированный разъём для сетевого кабеля со встроенным трансформатором (см. рисунок 3). Я выбрал разъём RDI-125BAG1A фирмы U.D. Electronic из следующих соображений. Во-первых, посадочное место под RDI-125BAG1A в точности совпадает с посадочным местом под импульсный трансформатор, которое у меня уже было в библиотеке ExpressPCB. Во-вторых, в нём, кроме пары импульсных трансформаторов для приёма и передачи и нагрузочных резисторов, есть ещё пара встроенных светодиодных индикаторов. Если Вы когда-либо работали с отладочными платами для Ethernet от EDTP, сделанными на ASIX или Microchip, Вы заметите, что соединения физического уровня W5100 очень похожи на те, что используются в EDTP Electronics ASIX и Microchip ENC29J60.



Рисунок 3. Большую часть показанных здесь компонентов Вы можете купить через каталоги Digi-Key или Mouser Electronics или у других широко известных продавцов.

Вы можете спросить, почему для встроенного в W5100 источника напряжения 1,8 В не предусмотрено никаких развязывающих компонентов. Этот вопрос часто задают службе поддержки. Однако, если мы посмотрим на схему включения W5100 из фирменного руководства, мы там также не увидим развязки по питанию 1,8 В.

Так как отладочная плата для WIZnet W5100 от EDTP предназначена для того, чтобы помочь Вам максимально быстро создать свой проект и запустить его, я подключил светодиоды ко всем индикаторным линиям W5100. Пара светодиодов, встроенных в разъём RDI-125BAG1A, подключена к линиям состояния LINKLED и RXLED. К линиям TXLED, COLLED, FDXLED и SPDLED я подключил дискретные светодиоды, которые Вы можете видеть на рисунке 1 среди компонентов типоразмера 0805, окружающих WIZnet W5100. Я также предусмотрел джампер для выбора режима SPI в W5100, если Вам этот режим потребуется. Единственная причуда, на которую я должен обратить Ваше внимание – это пара резисторов сброса номиналом 12,3 кОм, показанная на рисунке 3, которые подключены к выводу RSET_BG W5100. Общий вид той части отладочной платы EDTP, которая относится к W5100, показан на рисунке 4.




Рисунок 4. Здесь нет ничего такого, с чем Вы бы не могли справиться. За исключение пары резисторов 12,3 кОм, ряд компонентов рядом с W5100 – это элементы фильтров и развязки. Компоненты физического уровня выстроены в ряд около импульсного трансформатора. Обратите внимание на статусные светодиоды слева и джампер для выбора SPI справа.

Как Вы можете видеть, аппаратная часть устройства с W5100 очень проста. Перед тем, как перейти к программированию W5100, заметим, что на рисунке 1 нет светодиода, который я подключил к выводу RG4 PIC18LF8722. Я использовал его для проверки работы программы микроконтроллера. Он вспыхивал с частотой 1 Гц по прерываниям от таймера 3.
^

«Гаражный» код для WIZnet W5100


С точки зрения программиста, W5100 состоит их регистров общего назначения, регистров сокетов, памяти передатчика и памяти приёмника. Основное содержание регистров общего назначения – локальные IP и MAC адреса W5100. Кроме того, в них находятся размеры областей памяти для приёма и передачи и параметры PPP/PPPoE. Давайте сразу убьём двух зайцев: используем регистры общего назначения для проверки линий ввода-вывода PIC18LF8722, написав для него программу, которая будет записывать данные в регистры W5100 и считывать их оттуда. Я буду использовать компилятор HI-TECH PICC-18 C совместно со средой проектирования MPLAB и технологией REAL ICE от Microchip в качестве моих инструментов для работы с W5100.

Примерно через 18 часов я вернулся, чтобы написать это предложение. Я не смог заставить мой W5100 правильно общаться с PIC18LF8722. При поверхностном осмотре платы с W5100 никаких проблем не обнаружилось. Тогда я вернулся к моему коду на C, чтобы попытаться обнаружить ошибку. Оказалось, что мой C был прекрасен, но мои глаза меня обманули. Большая часть выводов PIC18LF8722, предназначенных для работы с адресом и данными, просто не были припаяны к печатной плате. Для пайки микросхем с малым шагом выводов, подобных W5100, я обычно использую фен. Я это делаю так часто, что считаю этот процесс само собой разумеющимся. Но в этот раз фен меня подвёл.

Перейдём к написанию кода для ввода-вывода данных W5100. Официально поставляемый производителем код драйвера, которым я располагал, написан для устройств AVR. Вместо того, чтобы писать свой собственный include-файл W5100 для PIC, я адаптировал фирменный include-файл. Непосредственно сейчас мне нужен include-файл с кодом, который извлекает адреса из внутренних регистров W5100. Фирменный include-файл содержит также определения для всего содержимого регистров W5100, которые обязательно пригодятся потом. Я потерял уйму времени на устранение дефектов моей собственноручной пайки, но я вернул часть этих потерь, переделав оригинальные файлы для AVR под PIC.

Первым действием моего официального встроенного ПО был аппаратный сброс W5100 (см. Листинг 1). Затем я перевёл интерфейс W5100 в режим непосредственной адресации. Это означает, что я не должен трогать регистр режима W5100, который является первым регистром общего назначения. Таким образом, мы можем начать наш первый тест ввода-вывода W5100/PIC18LF8722 с установки регистров адреса шлюза, расположенных в диапазоне адресов 0x0001:0x0004. Эти регистры определены в преобразованном мною include-файле как GAR0:GAR3. Преобразованный файл получил имя w5100_pic.h. Как Вы можете увидеть в Листинге 1, я расположил рядом некоторые основные подпрограммы ввода-вывода PIC18LF8722 для чтения и записи регистров W5100. Затем я написал содержимое массива gwayipaddrc для набора регистров адреса шлюза W5100. Чтобы убедиться, что запись в регистры общего назначения выполнена, я читаю содержимое GAR0:GAR3 в массив с именем svrmacaddrc. Можете себе представить, как я был доволен, наблюдая IP адрес шлюза в шестнадцатеричном формате в отладочном окне Watch среды MPLAB (см. рисунок 5). Затем я проверил, используя мою подпрограмму чтения, пару регистров общего RTR0, которая по умолчанию должна содержать 0x07D0, и следующий регистр RCR, по умолчанию содержащий 0x08. Всё прошло хорошо. Затем я инициализировал регистры шлюза, MAC адреса, маски подсети и IP адреса W5100.


Листинг 1. Вы не найдёте кода этого уровня в примерах из справочных данных W5100. Но без этих базовых подпрограмм ввода-вывода регистров ничего работать не будет.


char gwayipaddrc[4] = {192,168,0,1};

char svrmacaddrc[6];

#define make8(var,offset) ((unsigned int)var >> (offset * 8)) & 0x00FF

#define TO_WIZ TRISF = 0x00

#define FROM_WIZ TRISF = 0xFF

***************************************

void wr_wiz_addr(unsigned int addr)

{

addr_hi = (make8(addr,1));

addr_lo = addr & 0x00FF;

}

void wr_wiz_reg(char reg_data,unsigned int reg_addr)

{

TO_WIZ;

wr_wiz_addr(reg_addr);

data_out = reg_data;

clr_WR;

NOP();

set_WR;

FROM_WIZ;

}

char rd_wiz_reg(unsigned int reg_addr)

{

char data;

wr_wiz_addr(reg_addr);

clr_RD;

NOP();

data = data_in;

set_RD;

return(data);

}

***************************************

clr_RSET;

msecs_timer2 = 0;

while(msecs_timer2 < 2);

set_RSET;

addri = GAR0;

for(i8=0;i8<4;++i8)

wr_wz_reg(gwayipaddrc[i8],addri++);

addri = GAR0;

for(i8=0;i8<4;++i8)

svrmacaddrc[i8] = rd_wz_reg(addri++);




^ Рисунок 5. В ходе записи IP адреса шлюза в WIZnet и чтения его оттуда мы отладили базовые операции чтения и записи внутренних регистров W5100

Следующим шагом на нашем пути подключения платы с W5100 к сети будет запись информации в память сокетов. Мы используем отведённые по умолчанию 2 Кбайта на сокет. Это означает, что мы не должны трогать регистры RMSR (размер памяти приёмника) и TMSR (размер памяти передатчика), которые по умолчанию содержат значения 0x55. Как Вы можете видеть в листинге 2, всё, что нам на самом деле нужно сделать – это установить границы областей памяти приёмника и передатчика для каждого из четырёх сокетов, поддерживаемых W5100. После распределения памяти для сокетов мы можем сосредоточиться на том, что нам нужно для работы с сокетами W5100.


Листинг 2. В справочных данных на W5100 это описано при помощи псевдокода. Здесь мой перевод.


#define chip_base_address 0x0000

#define RX_memory_base_address 0x6000

#define gS0_RX_BASE chip_base_address + RX_memory_base_address

#define gS0_RX_MASK 0x0800 - 1

#define gS1_RX_BASE gS0_RX_BASE + (gS0_RX_MASK + 1)

#define gS1_RX_MASK 0x0800 - 1

#define gS2_RX_BASE gS1_RX_BASE + (gS1_RX_MASK + 1)

#define gS2_RX_MASK 0x0800 - 1

#define gS3_RX_BASE gS2_RX_BASE + (gS2_RX_MASK + 1)

#define gS3_RX_MASK 0x0800 - 1

#define TX_memory_base_address 0x4000

#define gS0_TX_BASE chip_base_address + RX_memory_base_address

#define gS0_TX_MASK 0x0800 - 1

#define gS1_TX_BASE gS0_TX_BASE + (gS0_TX_MASK + 1)

#define gS1_TX_MASK 0x0800 - 1

#define gS2_TX_BASE gS1_TX_BASE + (gS1_TX_MASK + 1)

#define gS2_TX_MASK 0x0800 - 1

#define gS3_TX_BASE gS2_TX_BASE + (gS2_TX_MASK + 1)

#define gS3_TX_MASK 0x0800 - 1


Самая важная часть Листинга 3 – это код, который открывает UDP сокет W5100. Первым делом мы должны сообщить W5100, с каким типом сокетов мы хотим работать. В настоящий момент мы работаем с UDP. Таким образом, я загружаю в регистр режима сокета 0 значение, задающее UDP. У меня уже есть приложение (EDTP Internet test panel), которое будет посылать ASCII символы на так называемый общеизвестный (well-known) порт 7, и, как Вы можете видеть в Листинге 3, я загружаю в регистр порта источника сокета 0 число 0x0007. Мы уже загрузили информацию о наших IP и MAC адресах. Таким образом, добавление значения порта источника UDP позволяет нам открыть сокет UDP. По большому количеству нулей в коде инициализации сокета в Листинге 3 видно, что мы открываем сокет 0 W5100 в режиме UDP.


Листинг 3. Задумайтесь об этом. Всё, что должно делать любое коммуникационное устройство – это приём и передача. Я получил логику этого кода из псевдокода в справочных данных W5100.


//SOCKET INTI******************************************************

do{

wr_wiz_reg(Sn_MR_UDP,Sn_MR(0)); //protocol = UDP

wr_wiz_reg(0x00,Sn_PORT0(0)); //well-known ECHO port

wr_wiz_reg(0x07,Sn_PORT1(0));

wr_wiz_reg(Sn_CR_OPEN,Sn_CR(0)); //give the open command

if(rd_wiz_reg(Sn_SR(0)) != SOCK_UDP) //wait for the socket to come online

wr_wiz_reg(Sn_CR_CLOSE,Sn_CR(0));

}while(rd_wiz_reg(Sn_SR(0)) != SOCK_UDP);

//RECEIVE**********************************************************

do{

//look for incoming UDP datagrams

i16 = rd_wiz_reg(Sn_IR(0));

}while(i16 == 0);

wr_wiz_reg(0x04,Sn_IR(0));

//get the datagram size

hi_byte = rd_wiz_reg(Sn_RX_RSR0(0));

lo_byte = rd_wiz_reg(Sn_RX_RSR1(0));

get_size = make16(hi_byte,lo_byte);

//get the datagram's buffer offset

hi_byte = rd_wiz_reg(Sn_RX_RD0(0));

lo_byte = rd_wiz_reg(Sn_RX_RD1(0));

get_offset = make16(hi_byte,lo_byte) & gS0_RX_MASK;

//calculate the datagram's starting buffer address

get_start_address = gS0_RX_BASE + get_offset;

//UDP header size

header_size = 8;

//store the UDP header information

addri = get_start_address;

for(i8=0;i8
{

packet[ip_destaddr+i8] = rd_wiz_reg(addri++);

++get_offset;

}

//store the UDP data

get_start_address = gS0_RX_BASE + get_offset;

udp_data_size = get_size - header_size;

addri = get_start_address;

for(i8=0;i8
{

packet[UDP_data+i8] = rd_wiz_reg(addri++);

++get_offset;

}

//update the receive buffer pointers

wr_wiz_reg(Sn_CR_RECV,Sn_CR(0));

//TRANSMIT*********************************************************

//load destination IP address

addri = Sn_DIPR0(0);

for(i8=0;i8<4;++i8)

wr_wiz_reg(packet[ip_destaddr+i8],addri++);

//load destination port address

addri = Sn_DPORT0(0);

for(i8=0;i8<2;++i8)

wr_wiz_reg(packet[UDP_srcport+i8],addri++);

//get transmit buffer offset

hi_byte = rd_wiz_reg(Sn_TX_WR0(0));

lo_byte = rd_wiz_reg(Sn_TX_WR1(0));

get_offset = make16(hi_byte,lo_byte) & gS0_TX_MASK;

//calculate transmit data buffer start address

get_start_address = gS0_TX_BASE + get_offset;

//load data into transmit buffer

addri = get_start_address;

for(i8=0;i8
{

wr_wiz_reg(packet[UDP_data+i8],addri++);

++get_offset;

}

//update transmit buffer pointer

wr_wiz_reg((make8(get_offset,1)),Sn_TX_WR0(0));

wr_wiz_reg((make8(get_offset,0)),Sn_TX_WR1(0));

//send data

wr_wiz_reg(Sn_CR_SEND,Sn_CR(0));

while(rd_wiz_reg(Sn_CR(0)));


После открытия сокета мы имеем возможность посылать и принимать пакеты UDP. Существует два способа обнаружить пришедший пакет UDP. Мы можем опрашивать регистр Received Size этого сокета или бит RECV его регистра прерываний (Interrupt). Как видно из кода приёма пакета UDP, который находится в середине листинга 3, я выбрал последний способ.

Входящий пакет UDP устанавливает бит RECV регистра прерываний сокета. Наша первая реакция на это – сбросить бит RECV, записав 1 в соответствующую этому биту позицию в регистре прерываний. W5100 сама заботится о контрольной сумме, и мы, как программисты, никогда не смотрим на информацию о ней в пакете UDP. Размер входящего пакета UDP автоматически помещается в регистр Receive Size сокета. Мы читаем содержимое этого регистра и помещаем полученное значение в переменную get_size. Я использую имена переменных из текста в справочных данных на W5100, где это возможно, чтобы облегчить сравнение моего кода драйвера с псевдокодом обработки UDP, приведённым в примере из этого текста. Значение указателя чтения приёмного буфера хранится в регистре Read Pointer сокета. Мы будем использовать это значение, чтобы сформировать базу для переменной get_offset. Значение этой переменной мы используем в сочетании с базовым адресом приёмного буфера сокета для того, чтобы вычислить адрес начала заголовка пакета UDP. Предлагаемый в W5100 заголовок пакета UDP состоит из четырёх байтов IP адреса назначения, двух байтов адреса порта назначения и двух байтов информации о размере данных. Таким образом, значение переменной header_size равно восьми. После завершения расчёта адреса мы можем использовать нашу подпрограмму чтения регистров W5100, чтобы сохранить данные в ОЗУ PIC18LF8722 для дальнейшего использования.

Рассуждая логически, то, что не является заголовком, должно быть данными, потому что мы защищены от расчёта контрольных сумм архитектурой W5100. При этом мы можем сделать вывод о том, что переменная udp_data_size содержит количество байтов данных, которое нам нужно извлечь и сохранить. Далее, используя наш самодельный код ввода-вывода для W5100, мы читаем данные из приёмного буфера W5100 и сохраняем их в соответствующей области ОЗУ PIC18LF8722. Наше извлечение пакета UDP закончено. Мы завершаем наш сеанс приёма записью команды RECV в регистр команд сокета, обновляя тем самым указатели приёмного буфера. Чтобы правильно сориентироваться в псевдокоде из справочных данных W5100, обратите внимание: переменная udp_data_size не из этого псевдокода. Это переменная от Фреда.

Отправка пакета UDP ещё проще, чем его приём. Мы повторно используем полученную нами ранее информацию и пошлём UDP сообщение обратно отправителю. Обратимся ещё раз к полученному заголовку пакета UDP, который содержит IP адрес назначения и порт назначения UDP. Мы не напрасно побеспокоились заранее и сохранили оба числа из заголовка. Теперь всё, что от нас требуется – это извлечь их из ОЗУ PIC18LF8722 и загрузить в соответствующие регистры сокета W5100. Я начинаю мою передачу пакета UDP так, как показано в нижней части листинга 3. Используя указатель записи буфера передачи сокета, я рассчитываю, где в W5100 находится этот буфер, и заполняю его данными, которые хочу передать. Затем я передаю сохранённые ранее в ОЗУ PIC18LF8722 данные из пакета UDP в буфер передачи W5100. А W5100 передаст данные, расположенные между указателем чтения передатчика (transmit read pointer) и указателем записи передатчика (transmit write pointer) сокета. Таким образом, я должен обновить указатель записи передатчика, добавив к нему число байтов, которое мне надо передать. После того, как я это сделаю, я посылаю команду SEND и жду сигнала успешной передачи, который очистит регистр команд сокета. Теперь я могу послать команду CLOSE в регистр команд сокета, чтобы закрыть сокет, или же отправить или принять следующий пакет UDP.

Поздравляю!


Вы закончили учебный курс по W5100. Теперь у Вас есть примеры кода для чтения и записи регистров W5100, кода для передачи и отправки пакетов UDP и универсальная отладочная плата для работы.

Вот подсказка, которая поможет Вам в самом начале проектирования Ваших стендов с W5100: выполните только код до загрузки IP адреса. Загрузите адрес шлюза, MAC адрес, маску подсети и IP адрес. Не открывайте никаких сокетов. Сделав всё это, Вы сможете послать команду PING Вашему устройству с W5100. Если Вы получите ответ, то это будет означать, что аппаратура физического уровня и код чтения и записи регистров работают нормально. Тем самым Вы также проверите линии адреса, данных и управляющих сигналов W5100 и убедитесь в их исправности. Поднять UDP – это приятный и простой способ познакомиться с W5100. EDTP Internet Test Panel – это UDP-программа, которая работает на Вашем персональном компьютере. Её можно загрузить с сайта www.edtp.com.


Фред Иди (Fred Eady, fred@edtp.com) более 20 лет работает системным инженером. Он имел дело с большими и малыми компьютерами и коммуникационными системами, простыми и сложными. Основное направление его деятельности – проектирование встроенных систем и систем коммуникации.
^

Файлы проекта


Исходные коды проекта можно загрузить с ftp-сервера журнала Circuit Cellar по адресу ftp://ftp.circuitcellar.com/pub/Circuit_Cellar/2007/208.

Источники


EDTP Internet test panel

EDTP Electronics, Inc.

www.edtp.com


HI-TECH PICC-18 C Compiler

HI-TECH Software

www.htsoft.com


PIC18LF8722 Microcontroller, REAL

ICE, and MPLAB

Microchip Technology, Inc.

www.microchip.com


RDI-125BAG1A Pulse transformer

U.D. Electronic Corp.

www.ude-corp.com


W5100 TCP/IP Ethernet controller

WIZnet, Inc.

www.ewiznet.com








Похожие:

Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconУчебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) "iEthernet Bootcamp", circuit cellar, Issue 208 November 2007 Перевёл Дмитрий Иоффе dsioffe@yandex ru
Перевод статьи Фреда Иди (Fred Eady) “iEthernet Bootcamp”, circuit cellar, Issue 208 November 2007
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconДисциплины «Перевод научных текстов (английский язык)» для отделения «Перевод и переводоведение»
Курс “Перевод научных текстов” входит в цикл специальных дисциплин и относится к дисциплинам специализации. Данный курс предназначен...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconДисциплины «Теоретическая фонетика английского языка» для отделения «Перевод и переводоведение»
Курс предназначен для студентов 1 курса (2 семестр) специальности «Перевод и переводоведение», изучающих английский язык как основной...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconКнига Тьмы Часть первая "Библии Проклятых"
Он вдохнул в тебя жизнь. Иди к Нему, если ты веруешь, что из грязи сотворил он образ Свой и подобие и нарек его Адамом. Иди к Нему,...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconПрограмма курса «Информатика и информационно-коммуникационные технологии» общеобразовательный курс (базовый уровень)
КТ» является общеобразовательным курсом базового уровня, изучаемым в 10-11 классах. Курс ориентирован на учебный план, объемом 70...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconДисциплины «практический курс второго иностранного языка» для отделения «Перевод и переводоведение»
Настоящая программа является рабочей и основана на требованиях государственного стандарта. Курс рассчитан на 348 часов и входит в...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconВ. Холмогоров Основы web-мастерства учебный курс
Х72 Основы Web-мастерства. Учебный курс (+CD). — Спб.: Питер, 2002. — 352 с.: ил
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconДисциплины «практический курс английского языка» для отделения «Перевод и переводоведение»
Российского государственного гуманитарного университета, специальность «Перевод и переводоведение», и рассчитан на 5 семестров. Результатом...
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconПетер Хакс Перевод с немецкого
Цветочную Принцессу и наше королевство в придачу. Король Роз. А я и понятия об этом не имел. Тринадцать – это всегда не к добру....
Учебный курс по wiznet W5100 Перевод статьи Фреда Иди (Fred Eady) \"iEthernet Bootcamp\" iconДисциплины «Стилистика английского языка» для отделения «Перевод и переводоведение»
Курс стилистики современного английского языка предназначен для студентов IV-V курсов Отделения переводоведения Института лингвистики,...
Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©podelise.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы

Разработка сайта — Веб студия Адаманов