SPI Ethernet Library

ENC28J60 - это автономный контроллер Ethernet со стандартным последовательным периферийным интерфейсом (SPI). Он предназначен для использования в качестве сетевого интерфейса Ethernet для любого контроллера, оснащенного SPI.

ENC28J60 соответствует всем спецификациям IEEE 802.3. Он включает в себя ряд схем фильтрации пакетов для ограничения входящих пакетов. Он также обеспечивает внутренний DMA-модуль для быстрой передачи данных и аппаратной поддержки вычислений контрольной суммы IP. Связь с контроллером хоста осуществляется через два вывода прерываний и SPI со скоростью передачи данных до 10 Мбит / с. Два выделенных контакта используются для индикации светодиодной линии и сетевой активности.

Эта библиотека предназначена для упрощения обработки базового оборудования (ENC28J60). Он работает с любыми ARM с интегрированным SPI и более 4 Кбайт памяти ROM. Частота от 38 до 40 МГц рекомендуется получать от 8 до 10 МГц часов SPI, иначе ARM должен быть синхронизирован по тактовому выходу ENC28J60 из-за его силиконовой ошибки в аппаратных средствах SPI. Если вы попытаетесь снизить тактовую частоту ARM, может возникнуть проблема с загрузкой или пропуском платы.

Библиотека SPI Ethernet поддерживает:

  Важно :

Дерево зависимостей библиотеки

SPI Ethernet Library Dependency Tree

Внешние зависимости библиотеки SPI Ethernet

Stellaris

Внешние зависимости o Следующие переменные должны быть определены во всех проектах с использованием библиотеки SPI Ethernet: f Библиотека Ethernet SPI Описание: Примеры:
var SPI_Ethernet_CS : sbit; sfr; external; ENC28J60 chip select pin. var SPI_Ethernet_CS : sbit at GPIO_PORTA_DATA.B0;
var SPI_Ethernet_RST : sbit; sfr; external; ENC28J60 reset pin. var SPI_Ethernet_RST : sbit at GPIO_PORTA_DATA.B1;
var SPI_Ethernet_CS_Direction : sbit; sfr; external; Direction of the ENC28J60 chip select pin. var SPI_Ethernet_CS_Direction : sbit at GPIO_PORTA_DIR.B0;
var SPI_Ethernet_RST_Direction : sbit; sfr; external; Direction of the ENC28J60 reset pin. var SPI_Ethernet_RST_Direction : sbit at GPIO_PORTA_DIR.B1;

MSP432

Следующие переменные должны быть определены во всех проектах с использованием библиотеки SPI Ethernet: Описание: Примеры:
var SPI_Ethernet_CS : sbit; sfr; external; ENC28J60 chip select pin. var SPI_Ethernet_CS : sbit at DIO_P6OUT.B0;
var SPI_Ethernet_RST : sbit; sfr; external; ENC28J60 reset pin. var SPI_Ethernet_RST : sbit at DIO_P6OUT.B1;
var SPI_Ethernet_CS_Direction : sbit; sfr; external; Direction of the ENC28J60 chip select pin. var SPI_Ethernet_CS_Direction : sbit at DIO_P6DIR.B0;
var SPI_Ethernet_RST_Direction : sbit; sfr; external; Direction of the ENC28J60 reset pin. var SPI_Ethernet_RST_Direction : sbit at DIO_P6DIR.B1;

STM32

Следующие переменные должны быть определены во всех проектах с использованием библиотеки SPI Ethernet: Описание: Примеры:
var SPI_Ethernet_CS : sbit; sfr; external; ENC28J60 chip select pin. var SPI_Ethernet_CS : sbit at GPIOB_ODR.B0;
var SPI_Ethernet_RST : sbit; sfr; external; ENC28J60 reset pin. var SPI_Ethernet_RST : sbit at GPIOB_ODR.B1;

CEC1x02

Следующие переменные должны быть определены во всех проектах с использованием библиотеки SPI Ethernet: Описание: Примеры:
var SPI_Ethernet_CS : sbit; sfr; external; ENC28J60 chip select pin. var SPI_Ethernet_CS : sbit at GPIO_OUTPUT_PIN_146_bit;
var SPI_Ethernet_RST : sbit; sfr; external; ENC28J60 reset pin. var SPI_Ethernet_RST : sbit at GPIO_OUTPUT_PIN_027_bit;

Следующие переменные должны быть определены во всех проектах с использованием библиотеки SPI Ethernet: Описание: Примеры:
function SPI_Ethernet_UserTCP(var remoteHost : array[4] of byte,
                               remotePort : word,
                               localPort : word,
                               reqLength : word)
                               var flags: TEthPktFlags) : word;
Обработчик запросов TCP. Обратитесь к примеру библиотеки в нижней части этой страницы для реализации кода.
function SPI_Ethernet_UserUDP(var remoteHost : array[4] of byte,
                               remotePort : word,
                               destPort : word,
                               reqLength : word,
                               var flags: TEthPktFlags) : word;
Обработчик запросов UDP. Обратитесь к примеру библиотеки в нижней части этой страницы для реализации кода.

Библиотечные процедуры

SPI_Ethernet_Init

Прототип

procedure SPI_Ethernet_Init(mac: ^byte; ip: ^byte; fullDuplex: byte);

Описание

Это процедура модуля MAC. Он инициализирует контроллер ENC28J60. Эта функция внутренне разделена на 2 части, чтобы помочь компоновщику при нехватке памяти.

Параметры контроллера ENC28J60 (параметры, не упомянутые здесь, установлены на значение по умолчанию):
  • начальный адрес буфера приема : 0x0000.
  • адрес конечного адреса получателя : 0x19AD.
  • начальный адрес буфера передачи: 0x19AE.
  • конечный адрес буфера передачи : 0x1FFF.
  • RAM buffer read/write pointers in auto-increment mode.
  • принимать фильтры, установленные по умолчанию: CRC + MAC Unicast + MAC Broadcast в режиме OR.
  • управление потоком с кадрами паузы TX и RX в полнодуплексном режиме.
  • кадры дополняются 60 байтами + CRC.
  • максимальный размер пакета равен 1518.
  • Back-to-Back Inter-Packet Gap: 0x15 in full duplex mode; 0x12 in half duplex mode.
  • Non-Back-to-Back Inter-Packet Gap: 0x0012 in full duplex mode; 0x0C12 in half duplex mode.
  • Окно столкновений установлено в 63 в полудуплексном режиме, чтобы разместить некоторые исправления по ENC28J60..
  • Выход CLKOUT отключен для уменьшения генерации EMI.
  • полудуплексная петля отключена.
  • Конфигурация светодиода: по умолчанию (статус светодиодной линии, активность светодиодного канала).
Параметры
  • mac: RAM-буфер, содержащий действительный MAC-адрес.
  • ip: Буфер ОЗУ, содержащий действительный IP-адрес.
  • fullDuplex: Ethernet-дуплексный режим. Допустимые значения: 0 (полудуплексный режим) и 1 (полнодуплексный режим).
Возвращает

Ничего.

Требует

Перед использованием этой функции необходимо определить внешние зависимости библиотеки от верхней части страницы.
Модуль SPI должен быть инициализирован. См. также процедуры SPIx_Init и SPIx_Init_Advanced.

Пример

Stellaris

// mE ehternet NIC pinout
var
  SPI_Ethernet_Rst : sbit at GPIO_PORTA_DATA.B0;
  SPI_Ethernet_CS  : sbit at GPIO_PORTA_DATA.B1;
  SPI_Ethernet_Rst_Direction : sbit at GPIO_PORTA_DIR.B0;
  SPI_Ethernet_CS_Direction  : sbit at GPIO_PORTA_DIR.B1;
// end ethernet NIC definitions

const SPI_Ethernet_HALFDUPLEX = 0;
const SPI_Ethernet_FULLDUPLEX = 1;

var 
  myMacAddr : array[6] of byte; // my MAC address	
  myIpAddr  : array[4] of byte; // my IP addr
  ...
  myMacAddr[0] := 0x00;
  myMacAddr[1] := 0x14;
  myMacAddr[2] := 0xA5;
  myMacAddr[3] := 0x76;
  myMacAddr[4] := 0x19;
  myMacAddr[5] := 0x3F;

  myIpAddr[0]  := 192;
  myIpAddr[1]  := 168;
  myIpAddr[2]  := 1;
  myIpAddr[3]  := 60;
  
  SPI1_Init();	
  SPI_Ethernet_Init(myMacAddr, myIpAddr, SPI_Ethernet_FULLDUPLEX);

MSP432

// mE ehternet NIC pinout
var
  SPI_Ethernet_Rst : sbit at DIO_P6OUT.B0;
  SPI_Ethernet_CS  : sbit at DIO_P6OUT.B1;
  SPI_Ethernet_Rst_Direction : sbit at DIO_P6DIR.B0;
  SPI_Ethernet_CS_Direction  : sbit at DIO_P6DIR.B1;
// end ethernet NIC definitions

const SPI_Ethernet_HALFDUPLEX = 0;
const SPI_Ethernet_FULLDUPLEX = 1;

var 
  myMacAddr : array[6] of byte; // my MAC address	
  myIpAddr  : array[4] of byte; // my IP addr
  ...
  myMacAddr[0] := 0x00;
  myMacAddr[1] := 0x14;
  myMacAddr[2] := 0xA5;
  myMacAddr[3] := 0x76;
  myMacAddr[4] := 0x19;
  myMacAddr[5] := 0x3F;

  myIpAddr[0]  := 192;
  myIpAddr[1]  := 168;
  myIpAddr[2]  := 1;
  myIpAddr[3]  := 60;
  
  SPI1_Init();	
  SPI_Ethernet_Init(myMacAddr, myIpAddr, SPI_Ethernet_FULLDUPLEX);

STM32

// mE ehternet NIC pinout
var
  SPI_Ethernet_Rst : sbit at GPIOB_ODR.B0;
  SPI_Ethernet_CS  : sbit at GPIOB_ODR.B1;
// end ethernet NIC definitions

const SPI_Ethernet_HALFDUPLEX = 0;
const SPI_Ethernet_FULLDUPLEX = 1;

var 
  myMacAddr : array[6] of byte; // my MAC address	
  myIpAddr  : array[4] of byte; // my IP addr
  ...
  myMacAddr[0] := 0x00;
  myMacAddr[1] := 0x14;
  myMacAddr[2] := 0xA5;
  myMacAddr[3] := 0x76;
  myMacAddr[4] := 0x19;
  myMacAddr[5] := 0x3F;

  myIpAddr[0]  := 192;
  myIpAddr[1]  := 168;
  myIpAddr[2]  := 1;
  myIpAddr[3]  := 60;
  
  SPI3_Init_Advanced(_SPI_FPCLK_DIV16, _SPI_MASTER  or _SPI_8_BIT or
                     _SPI_CLK_IDLE_LOW or _SPI_FIRST_CLK_EDGE_TRANSITION or
                     _SPI_MSB_FIRST or _SPI_SS_DISABLE or _SPI_SSM_ENABLE or _SPI_SSI_1,
                     @_GPIO_MODULE_SPI3_PB345);

  SPI_Ethernet_Init(myMacAddr, myIpAddr, SPI_Ethernet_FULLDUPLEX);

CEC1x02

// mE ehternet NIC pinout
var
  SPI_Ethernet_Rst : sbit at GPIO_OUTPUT_PIN_027_bit;
  SPI_Ethernet_CS  : sbit at GPIO_OUTPUT_PIN_146_bit;
// end ethernet NIC definitions

const SPI_Ethernet_HALFDUPLEX = 0;
const SPI_Ethernet_FULLDUPLEX = 1;

var 
  myMacAddr : array[6] of byte; // my MAC address	
  myIpAddr  : array[4] of byte; // my IP addr
  ...
  myMacAddr[0] := 0x00;
  myMacAddr[1] := 0x14;
  myMacAddr[2] := 0xA5;
  myMacAddr[3] := 0x76;
  myMacAddr[4] := 0x19;
  myMacAddr[5] := 0x3F;

  myIpAddr[0]  := 192;
  myIpAddr[1]  := 168;
  myIpAddr[2]  := 1;
  myIpAddr[3]  := 60;

SPI0_Init_Advanced(1000000,_SPI_MSB_FIRST,_SPI_SAMPLE_DATA_FALLING_EDGE OR _SPI_CLK_IDLE_LOW);

SPI_Ethernet_Init(myMacAddr, myIpAddr, SPI_Ethernet_FULLDUPLEX);
Примечания

Нет.

SPI_Ethernet_Enable

Прототип

procedure SPI_Ethernet_Enable(enFlt : byte);

Описание

Это процедура модуля MAC. Эта процедура обеспечивает соответствующий сетевой трафик на модуле ENC28J60 с помощью его принимающих фильтров (одноадресная, многоадресная, широковещательная, crc). Конкретный тип сетевого трафика будет включен, если установлен соответствующий бит входного параметра этой процедуры. Таким образом, одновременно можно включить более одного типа сетевого трафика. Для этой цели предопределенные константы библиотеки (см. Таблицу ниже) могут быть ORed для формирования соответствующего входного значения.

Эта расширенная фильтрация, доступная в модуле ENC28J60, такая как Pattern Match, Magic Packet и Hash Table, не может быть включена этой процедурой. Кроме того, все фильтры, кроме CRC, включенные с этой подпрограммой, будут работать в режиме OR, что означает, что пакет будет принят, если любой из разрешенных фильтров примет его.

Эта процедура изменяет конфигурацию фильтра приема на лету. Это никоим образом не будет препятствовать включению / отключению логики приема / передачи или любой другой части модуля ENC28J60. Модуль ENC28J60 должен быть правильно настроен с помощью процедуры SPI_Ethernet_Init.

Параметры
  • enFlt: network traffic/receive filter flags. Each bit corresponds to the appropriate network traffic/receive filter:
  • Бит Маска Описание Предопределенные библиотечные константы
    0 0x01 MAC широковещательный трафик / фильтр фильтра приема. Когда установлено, MAC-широковещательный трафик будет включен. _SPI_Ethernet_BROADCAST
    1 0x02 MAC Multicast трафик / фильтр фильтра приема. Когда установлено, многоадресный трафик MAC будет включен. _SPI_Ethernet_MULTICAST
    2 0x04 не используется Нет
    3 0x08 не используется Нет
    4 0x10 не используется Нет
    5 0x20 Флаг проверки CRC. Когда установлено, пакеты с недопустимым полем CRC будут отброшены. _SPI_Ethernet_CRC
    6 0x40 не используется Нет
    7 0x80 MAC Unicast трафик / фильтр фильтра приема. Когда установлено, MAC-одноадресный трафик будет включен. _SPI_Ethernet_UNICAST
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
SPI_Ethernet_Enable(_SPI_Ethernet_CRC or _SPI_Ethernet_UNICAST); // включить проверку CRC и одноадресный трафик
Примечания

Эта расширенная фильтрация, доступная в модуле ENC28J60, такая как Pattern Match, Magic Packet и Hash Table, не может быть включена этой процедурой. Кроме того, все фильтры, кроме CRC, включенные с этой подпрограммой, будут работать в режиме OR, что означает, что пакет будет принят, если любой из разрешенных фильтров примет его.

Эта процедура изменяет конфигурацию фильтра приема на лету. Это никоим образом не будет препятствовать включению / отключению логики приема / передачи или любой другой части модуля ENC28J60. Модуль ENC28J60 должен быть правильно настроен с помощью процедуры SPI_Ethernet_Init.

SPI_Ethernet_Disable

Прототип

procedure SPI_Ethernet_Disable(disFlt : byte);

Описание

Это процедура модуля MAC. Эта процедура отключает соответствующий сетевой трафик на модуле ENC28J60 с помощью его фильтров приема (одноадресная, многоадресная, широковещательная, crc). Конкретный тип сетевого трафика будет отключен, если установлен соответствующий бит входного параметра этой процедуры. Таким образом, одновременно можно отключить несколько типов сетевого трафика. Для этой цели предопределенные константы библиотеки (см. Таблицу ниже) могут быть ORed для формирования соответствующего входного значения.

Параметры
  • disFlt: network traffic/receive filter flags. Each bit corresponds to the appropriate network traffic/receive filter:
  • Бит Маска Описание Предопределенная библиотечная константа
    0 0x01 MAC широковещательный трафик / фильтр фильтра приема. Когда установлено, MAC-трафик будет отключен. _SPI_Ethernet_BROADCAST
    1 0x02 MAC Multicast трафик / фильтр фильтра приема. Когда установлено, многоадресный трафик MAC будет отключен. _SPI_Ethernet_MULTICAST
    2 0x04 не используется Нет
    3 0x08 не используется Нет
    4 0x10 не используется Нет
    5 0x20 Флаг проверки CRC. Когда установлено, проверка CRC будет отключена, и пакеты с недопустимым полем CRC будут приняты. _SPI_Ethernet_CRC
    6 0x40 не используется Нет
    7 0x80 MAC Unicast трафик / фильтр фильтра приема. Если установлено, одноадресный трафик MAC будет отключен. _SPI_Ethernet_UNICAST
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
SPI_Ethernet_Disable(_SPI_Ethernet_CRC or _SPI_Ethernet_UNICAST); // disable CRC checking and Unicast traffic
Примечания

Расширенная фильтрация доступна в модуле ENC28J60 такая как Pattern Match, Magic Packet и Hash Table не может быть отключена этой процедурой.

Эта процедура изменяет конфигурацию фильтра приема на лету. Это никоим образом не будет препятствовать включению / отключению логики приема / передачи или любой другой части модуля ENC28J60. Модуль ENC28J60 модуль должен быть надлежащим образом скомпонован средствами процедуры SPI_Ethernet_Init.

SPI_Ethernet_doPacket

Прототип

function SPI_Ethernet_doPacket() : byte;

Описание

Это процедура модуля MAC. Он обрабатывает следующий полученный пакет, если таковой существует. Пакеты обрабатываются следующим образом:

  • Запросы ARP и ICMP отвечают автоматически.
  • по запросу TCP функция SPI_Ethernet_UserTCP вызывается для дальнейшей обработки.
  • по запросу UDP функция SPI_Ethernet_UserUDP вызывается для дальнейшей обработки.
Параметры

Нет.

Возвращает
  • 0 - при успешной обработке пакетов (успешно обработанные или принятые пакеты с нулевыми пакетами успешно обработаны).
  • 1 - при ошибке приема или при получении буфера. Необходимо перезапустить контроллер ENC28J60.
  • 2 - полученный пакет не был отправлен нам (а не наш IP-адрес или IP-широковещательный адрес).
  • 3 - принятый IP-пакет не был IPv4.
  • 4 - полученный пакет был неизвестного типа для библиотеки.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
while true do
  begin
    ...
    SPI_Ethernet_doPacket(); // обрабатываемые принятые пакеты
    ...
  end;
Примечания

SPI_Ethernet_doPacket необходимо вызывать как можно чаще в коде пользователя.

SPI_Ethernet_putByte

Прототип

procedure SPI_Ethernet_putByte(v : byte);

Описание

Это процедура модуля MAC. Он хранит один байт в адресе, указанном текущим указателем записи ENC28J60 (EWRPT).

Параметры
  • v:значение для сохранения
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  data : byte;
  ...
  SPI_Ethernet_putByte(data);  // put an byte into ENC28J60 buffer
Примечания

Нет.

SPI_Ethernet_putBytes

Прототип

procedure SPI_Ethernet_putBytes(ptr : ^byte; n : word);

Описание

Это процедура модуля MAC. Он хранит запрошенное количество байтов в ОЗУ ENC28J60, начиная с текущего местоположения указателя записи ENC28J60 (EWRPT).

Параметры
  • ptr: RAM-буфер, содержащий байты, которые должны быть записаны в ОЗУ ENC28J60.
  • n: количество байтов, которые нужно записать.
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  buffer : array[17] of byte;	 
  ...
  buffer := 'mikroElektronika';	 
  ...
  SPI_Ethernet_putBytes(buffer, 16); // помещает массив RAM в буфер ENC28J60
Примечания

Нет.

SPI_Ethernet_putConstBytes

Прототип

procedure SPI_Ethernet_putConstBytes(const ptr : ^byte; n : word);

Описание

Это процедура модуля MAC. Он хранит запрошенное количество const-байтов в ОЗУ ENC28J60, начиная с текущего местоположения указателя записи ENC28J60 (EWRPT).

Параметры
  • ptr: const buffer containing bytes to be written into ENC28J60 RAM.
  • n: количество байтов, которые нужно записать.
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
const 
  buffer : array[17] of byte;	 
  ...
  buffer := 'mikroElektronika';	 
  ...
  SPI_Ethernet_putConstBytes(buffer, 16); // помещает массив констант в буфер ENC28J60
Примечания

Нет.

SPI_Ethernet_putString

Прототип

function SPI_Ethernet_putString(ptr : ^byte) : word;

Описание

Это процедура модуля MAC. Он сохраняет целую строку (исключая нулевое завершение) в ENC28J60 ОЗУ, начиная с текущего ENC28J60 позиции, определенной в указатели записи (EWRPT).

Параметры
  • ptr:строка, которая должна быть записана в ENC28J60 RAM.
Возвращает

Количество байтов, записанных в ENC28J60 RAM.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  buffer : string[16];	 
  ...
  buffer := 'mikroElektronika';	 
  ...
  SPI_Ethernet_putString(buffer); // put a RAM string into ENC28J60 buffer
Примечания

Нет.

SPI_Ethernet_putConstString

Прототип

function SPI_Ethernet_putConstString(const ptr : ^byte) : word;

Описание

Это процедура модуля MAC. Он хранит целую строку const (исключая нулевое завершение) в ОЗУ ENC28J60, начиная с текущего местоположения указателя записи ENC28J60 (EWRPT).

Параметры
  • ptr:const, которая должна быть записана в ENC28J60 RAM.
Возвращает

Количество байтов, запиываемых в ENC28J60 RAM.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
const 
  buffer : string[16];	 
  ...
  buffer := 'mikroElektronika';	 
  ...
  SPI_Ethernet_putConstString(buffer); // помещает константную строку в буфер ENC28J60
Примечания

Нет.

SPI_Ethernet_getByte

Прототип

function SPI_Ethernet_getByte() : byte;

Описание

Это процедура модуля MAC. Он извлекает байт с адреса, на который указывает текущий ENC28J60 указатель чтения (ERDPT).

Параметры

Нет.

Возвращает

Байт читается из ENC28J60 RAM.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  buffer : byte; 
  ...
  buffer := SPI_Ethernet_getByte(); // читает байт из буфера ENC28J60
Примечания

Нет.

SPI_Ethernet_getBytes

Прототип

procedure SPI_Ethernet_getBytes(ptr : ^byte; addr : word; n : word);

Описание

Это процедура модуля MAC. Он извлекает эквивалентное количество байтов из ОЗУ ENC28J60, начиная с заданного адреса. Если в качестве параметра адреса передано значение 0xFFFF, чтение начнется с текущего местоположения указателя чтения ENC28J60 (ERDPT).

Параметры
  • ptr: буфер для хранения байтов, считанных из ОЗУ ENC28J60.
  • addr: ENC28J60 Начальный адрес RAM. Допустимые значения: 0..8192.
  • n: количество прочитанных байтов.
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  buffer: array[16] of byte;	 
  ...
  SPI_Ethernet_getBytes(buffer, 0x100, 16); // read 16 bytes, starting from address 0x100
Примечания

Нет.

SPI_Ethernet_UserTCP

Прототип

function SPI_Ethernet_UserTCP(var remoteHost : array[4] of byte; remotePort, localPort, reqLength : word; var flags: TEthPktFlags) : word;

Описание

Это процедура TCP-модуля. Он внутренне называется библиотекой. Пользователь обращается к запросу TCP с помощью некоторых подпрограмм SPI_Ethernet_get. Пользователь помещает данные в буфер передачи, используя некоторые из подпрограмм SPI_Ethernet_put. Функция должна возвращать длину в байтах ответа TCP, или 0, если есть Ничего для передачи. Если нет необходимости отвечать на запросы TCP, просто определите эту функцию с возвратом (0) в качестве одного оператора.

Параметры
  • remoteHost: IP-адрес клиента.
  • remotePort: клиентский порт.
  • destPort: порт, на который отправляется запрос.
  • reqLength:Длина поля данных запроса UDP.
  • flags: запись состояла из двух полей :
    type TEthPktFlags = record
      canCloseTCP: boolean;  // flag which closes socket
      isBroadcast: boolean;  // flag which deПримечания that the IP package has been received via subnet broadcast address
    end;
                    
Возвращает
  • 0 - ответа на запрос не должно быть.
  • Длина поля данных ответа TCP - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример

Эта функция внутренне вызывается библиотекой и не должна вызываться по коду пользователя.

Примечания

Исходный код функции снабжен соответствующими примерами проектов. Код должен быть настроен пользователем для достижения желаемого ответа.

SPI_Ethernet_UserUDP

Прототип

function SPI_Ethernet_UserUDP(var remoteHost : array[4] of byte; remotePort, destPort, reqLength : word; var flags: TEthPktFlags) : word;

Описание

Это процедура модуля UDP. Он внутренне называется библиотекой. Пользователь обращается к запросу UDP с помощью некоторых подпрограмм SPI_Ethernet_get. Пользователь помещает данные в буфер передачи, используя некоторые из подпрограмм SPI_Ethernet_put. Функция должна возвращать длину в байтах ответа UDP или 0, если ничего не передать. Если вам не нужно отвечать на запросы UDP, просто определите эту функцию с помощью return (0) как одного оператора.

Параметры
  • remoteHost: IP-адрес клиента.
  • remotePort: клиентский порт.
  • destPort: порт, на который отправляется запрос.
  • reqLength:Длина поля данных запроса UDP.
  • flags: запись состояла из двух полей :
    type TEthPktFlags = record
      canCloseTCP: boolean;  // флаг, который закрывает сокет (не относится к UDP)
      isBroadcast: boolean;  // флаг, который означает, что пакет IP был получен через широковещательный адрес подсети
    end;
    
Возвращает
  • 0 - ответа на запрос не должно быть.
  • Длина поля данных ответа UDP - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример

Эта функция внутренне вызывается библиотекой и не должна вызываться по коду пользователя.

Примечания

Исходный код функции снабжен соответствующими примерами проектов. Код должен быть настроен пользователем для достижения желаемого ответа.

SPI_Ethernet_setUserHandlers

Прототип

procedure SPI_Ethernet_setUserHandlers(TCPHandler : ^TSPI_Ethernet_UserTCP; UDPHandler : ^TSPI_Ethernet_UserUDP);

Описание

Устанавливает указатели на реализацию функций пользовательского TCP и UDP-обработчика, которые автоматически вызывается библиотекой SPI Ethernet.

Параметры
  • TCPHandler: Обработчик запросов TCP
  • UDPHandler: Обработчик запросов UDP.
Возвращает

Ничего.

Требует

SPI_Ethernet_UserTCP and SPI_Ethernet_UserUDP have to be previously defined.

Пример
SPI_Ethernet_setUserHandlers(@SPI_Ethernet_UserTCP, @SPI_Ethernet_UserUDP);
Примечания

Since all libraries are built for SSA, SSA restrictions regarding function pointers dictate that modules that use SPI_Ethernet_setUserHandlers must also be built for SSA.

SPI_Ethernet_getIpAddress

Прототип

function SPI_Ethernet_getIpAddress() : ^byte;

Описание

Эта процедура должна использоваться, когда DHCP-сервер присутствует в сети для получения назначенного IP-адреса.

Параметры

Нет.

Возвращает

Указатель на глобальную переменную, содержащую IP-адрес.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  ipAddr : array[4] of byte;  // user IP address buffer
  ...	
  memcpy(ipAddr, SPI_Ethernet_getIpAddress(), 4); // fetch IP address
Примечания

Пользователь должен всегда копировать IP-адрес из места RAM, возвращаемого этой процедурой, в собственный буфер IP-адреса. В любом случае эти места не должны изменяться пользователем!

SPI_Ethernet_getGwIpAddress

Прототип

function SPI_Ethernet_getGwIpAddress() : ^byte;

Описание

Эта процедура должна использоваться, когда DHCP-сервер присутствует в сети для получения назначенного IP-адреса шлюза.

Параметры

Нет.

Возвращает

Указатель на глобальную переменную, содержащую IP-адрес шлюза.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  gwIpAddr : array[4] of byte;  // user gateway IP address buffer
  ...	
  memcpy(gwIpAddr, SPI_Ethernet_getGwIpAddress(), 4); // fetch gateway IP address 
Примечания

Пользователь должен всегда копировать IP-адрес из местоположения ОЗУ, возвращаемого этой процедурой, в собственный буфер IP-адреса шлюза. В любом случае эти места не должны изменяться пользователем!

SPI_Ethernet_getDnsIpAddress

Прототип

function SPI_Ethernet_getDnsIpAddress() : ^byte;

Описание

Указатель на глобальную переменную, содержащую IP-адрес DNS.

Параметры

Нет.

Возвращает

Указатель на глобальную переменную, содержащую IP-адрес DNS.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  dnsIpAddr : array[4] of byte;  // user DNS IP address buffer
  ...	
  memcpy(dnsIpAddr, SPI_Ethernet_getDnsIpAddress(), 4); // fetch DNS server address 
Примечания

Пользователь должен всегда копировать IP-адрес из местоположения ОЗУ, возвращаемого этой процедурой, в собственный DNS-адрес DNS-адреса. В любом случае эти места не должны изменяться пользователем!

SPI_Ethernet_getIpMask

Прототип

function SPI_Ethernet_getIpMask() : ^byte;

Описание

Эта процедура должна использоваться, когда DHCP-сервер присутствует в сети, чтобы получить назначенную маску подсети IP.

Параметры

Нет.

Возвращает

Указатель на глобальную переменную, содержащую маску подсети IP.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  IpMask : array[4] of byte;  // user IP subnet mask buffer
  ...	
  memcpy(IpMask, SPI_Ethernet_getIpMask(), 4); // fetch IP subnet mask
Примечания

Пользователь должен всегда копировать IP-адрес из места ОЗУ, возвращаемого этой процедурой, в свой собственный буфер маски подсети IP. В любом случае эти места не должны изменяться пользователем!

SPI_Ethernet_confNetwork

Прототип

procedure SPI_Ethernet_confNetwork(var ipMask, gwIpAddr, dnsIpAddr : array[4] of byte);

Описание

Настраивает сетевые параметры (маску подсети IP, IP-адрес шлюза, IP-адрес DNS), когда DHCP не используется.

Параметры
  • ipMask:Маска подсети IP.
  • gwIpAddr IP-адрес шлюза.
  • dnsIpAddr: IP-адрес DNS.
Возвращает

Ничего.

Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  ipMask    : array[4] of byte;  // network mask (for Пример : 255.255.255.0)
  gwIpAddr  : array[4] of byte;  // gateway (router) IP address
  dnsIpAddr : array[4] of byte;  // DNS server IP address
  ...	
  gwIpAddr[0]  := 192;
  gwIpAddr[1]  := 168;
  gwIpAddr[2]  := 20;
  gwIpAddr[3]  := 6;

  dnsIpAddr[0] := 192;
  dnsIpAddr[1] := 168;
  dnsIpAddr[2] := 20;
  dnsIpAddr[3] := 100;

  ipMask[0]    := 255;
  ipMask[1]    := 255;
  ipMask[2]    := 255;
  ipMask[3]    := 0;
  ...
  SPI_Ethernet_confNetwork(ipMask, gwIpAddr, dnsIpAddr); // set network configuration Параметры
Примечания

Вышеуказанные параметры сети должны быть установлены этой процедурой только в том случае, если модуль DHCP не используется. В противном случае DHCP переопределит эти параметры.

SPI_Ethernet_arpResolve

Прототип

function SPI_Ethernet_arpResolve(var ip : array[4] of byte; tmax : byte) : ^byte;

Описание

This is ARP module routine. It sends an ARP request for given IP address and waits for ARP reply. If the requested IP address was resolved, an ARP cash entry is used for storing the configuration. ARP cash can store up to 3 entries. For ARP cash structure refer to "eth_enc28j60LibDef.mpas" file in the compiler's Uses folder.

Параметры
  • ip: IP address to be resolved.
  • tmax: время в секундах, чтобы ждать ответа.
Возвращает
  • MAC-адрес за IP-адресом - исправлен запрошенный IP-адрес.
  • 0 - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  IpAddr : array[4] of byte;  // IP address
  ...	
  IpAddr[0] := 192;
  IpAddr[0] := 168;
  IpAddr[0] := 1;
  IpAddr[0] := 1;
  ...
  SPI_Ethernet_arpResolve(IpAddr, 5); // get MAC address behind the above IP address, wait 5 secs for the response
Примечания

Службы Ethernet не останавливаются, пока эта процедура ожидает ответа ARP. В течение этого времени входящие пакеты будут обработаны нормально.

SPI_Ethernet_sendUDP

Прототип

function SPI_Ethernet_sendUDP(var destIP : array[4] of byte; sourcePort, destPort : word; pkt : ^byte; pktLen : word) : byte;

Описание

Это процедура модуля UDP. Он отправляет UDP-пакет в сети.

Параметры
  • destIP: IP-адрес удаленного хоста.
  • sourcePort: локальный номер порта источника UDP.
  • destPort: номер порта UDP назначения.
  • pkt: пакет для передачи.
  • pktLen:длина в байтах пакета для передачи.
Возвращает
  • 1 - Пакет UDP был успешно отправлен.
  • 0 - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  IpAddr : array[4] of byte;  // remote IP address
  ...	
  IpAddr[0] := 192;
  IpAddr[0] := 168;
  IpAddr[0] := 1;
  IpAddr[0] := 1;
  ...
  SPI_Ethernet_sendUDP(IpAddr, 10001, 10001, 'Hello', 5); // send Hello message to the above IP address, from UDP port 10001 to UDP port 10001 
Примечания

Нет.

SPI_Ethernet_dnsResolve

Прототип

function SPI_Ethernet_dnsResolve(var host : string; tmax : byte) : ^byte;

Описание

This is DNS module routine. It sends an DNS request for given host name and waits for DNS reply. If the requested host name was resolved, it's IP address is stored in library global variable and a pointer containing this address is returned by the routine. UDP port 53 is used as DNS port.

Параметры
  • host: имя хоста, которое должно быть разрешено.
  • tmax: время в секундах, чтобы ждать ответа.
Возвращает
  • указатель на местоположение, в котором находится IP-адрес, - было исправлено запрошенное имя хоста.
  • 0 - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
var 
  remoteHostIpAddr : array[4] of byte;	// user host IP address buffer
  ...
  // SNTP server:
  // Zurich, Switzerland: Integrated Systems Lab, Swiss Fed. Inst. of Technology
  // 129.132.2.21: swisstime.ethz.ch
  // Service Area: Switzerland and Europe	
  memcpy(remoteHostIpAddr, SPI_Ethernet_dnsResolve('swisstime.ethz.ch', 5), 4);
Примечания

Службы Ethernet не останавливаются, пока эта процедура ожидает ответа DNS. В течение этого времени входящие пакеты будут обработаны нормально.

Пользователь должен всегда копировать IP-адрес из места ОЗУ, возвращаемого этой процедурой, в собственный разрешенный буфер IP-адреса хоста. В любом случае эти места не должны изменяться пользователем!

SPI_Ethernet_initDHCP

Прототип

function SPI_Ethernet_initDHCP(tmax : byte) : byte;

Описание

Это процедура модуля DHCP. Он отправляет запрос DHCP для сетевых параметров (IP, шлюз, DNS-адреса и маску подсети IP) и ожидает ответа DHCP. Если запрошенные параметры были успешно получены, их значения хранятся в глобальных переменных библиотеки.

Эти параметры можно извлечь, используя соответствующие процедуры доступа к библиотеке IP:

Порт UDP 68 используется как порт клиента DHCP и порт UDP 67используется как порт сервера DHCP.

Параметры
  • tmax: время в секундах, чтобы ждать ответа.
Возвращает
  • 1 - параметры сети были успешно получены.
  • 0 - в противном случае.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
...	
SPI_Ethernet_initDHCP(5); // get network configuration from DHCP server, wait 5 sec for the response 
...
Примечания

Службы Ethernet не останавливаются, пока эта процедура ожидает ответа DNS. В течение этого времени входящие пакеты будут обработаны нормально.

When DHCP module is used, global library variable SPI_Ethernet_userTimerSec is used to keep track of time. Пользователь несет ответственность за увеличение этой переменной каждую секунду в своем коде.

SPI_Ethernet_doDHCPLeaseTime

Прототип

function SPI_Ethernet_doDHCPLeaseTime() : byte;

Описание

Это процедура модуля DHCP. Он заботится о времени аренды IP-адреса, уменьшая счетчик библиотеки времени аренды в мире. Когда это время истечет, пришло время связаться с сервером DHCP и возобновить аренду.

Параметры

Нет.

Возвращает
  • 0 -срок аренды еще не истек.
  • 1 - lease time has expired, it's time to renew it.
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
while true do
  begin
    ...
    if (SPI_Ethernet_doDHCPLeaseTime() <> 0) then
      begin
        ... // it's time to renew the IP address lease                  
      end;  
  end;
Примечания

Нет.

SPI_Ethernet_renewDHCP

Прототип

function SPI_Ethernet_renewDHCP(tmax : byte) : byte;

Описание

Это процедура модуля DHCP. Он отправляет запрос на продление срока аренды IP-адреса на сервер DHCP.

Параметры
  • tmax: время в секундах, чтобы ждать ответа.
Возвращает
  • 1 - после успеха (время аренды было возобновлено).
  • 0 - в противном случае (время ожидания продления).
Требует

Модуль Ethernet должен быть инициализирован. См. также SPI_Ethernet_Init.

Пример
while true do
  begin 
    ...
    if (SPI_Ethernet_doDHCPLeaseTime() <> 0) then
      begin
        SPI_Ethernet_renewDHCP(5); // it's time to renew the IP address lease, with 5 secs for a reply                  
      end;  
    ...  
  end;  
Примечания

Нет.