Ethernet Library
The internal Ethernet Controller consists of a fully integrated media access controller (MAC) and network physical (PHY) interface. The Ethernet Controller conforms to IEEE 802.3 specifications and fully supports 10BASE-T and 100BASE-TX standards.
The internal Ethernet library supports :
- IPv4 protocol.
- ARP requests.
- ICMP echo requests.
- UDP requests.
- TCP requests (no stack, no packet reconstruction).
- ARP client with cache.
- DNS client.
- UDP client.
- DHCP client.
- packet fragmentation is NOT supported.

- Global library variable
Ethernet_Intern_userTimerSec
is used to keep track of time for all client implementations (ARP, DNS, UDP and DHCP). It is user responsibility to increment this variable each second in it's code if any of the clients is used. - For advanced users there is
__Lib_Ethernet_Intern.mbas
unit in Uses folder of the compiler with description of all routines and global variables, relevant to the user, implemented in the Ethernet Library.
Library Routines
- Ethernet_Intern_Init
- Ethernet_Intern_Enable
- Ethernet_Intern_Disable
- Ethernet_Intern_doPacket
- Ethernet_Intern_writePayloadByte
- Ethernet_Intern_writePayloadBytes
- Ethernet_Intern_writeConstPayloadBytes
- Ethernet_Intern_writePayloadString
- Ethernet_Intern_writeConstPayloadString
- Ethernet_Intern_readPayloadByte
- Ethernet_Intern_readPayloadBytes
- Ethernet_Intern_UserTCP
- Ethernet_Intern_UserUDP
- Ethernet_Intern_getIpAddress
- Ethernet_Intern_getGwIpAddress
- Ethernet_Intern_getDnsIpAddress
- Ethernet_Intern_getIpMask
- Ethernet_Intern_confNetwork
- Ethernet_Intern_arpResolve
- Ethernet_Intern_sendUDP
- Ethernet_Intern_dnsResolve
- Ethernet_Intern_initDHCP
- Ethernet_Intern_doDHCPLeaseTime
- Ethernet_Intern_renewDHCP
- Ethernet_Intern_configLED
Ethernet_Intern_Init
Prototype |
sub procedure Ethernet_Intern_Init(dim byref mac as byte[6], dim byref ip as byte[4], dim configuration as byte) |
---|---|
Returns |
|
Description |
This is MAC module routine. It initializes Ethernet controller. This function is internaly splited into 2 parts to help linker when coming short of memory. Ethernet controller settings (parameters not mentioned here are set to default):
Parameters:
![]() 0.0.0.0 .
|
Requires | Nothing. |
Example |
dim myMacAddr as byte[6] ' my MAC address myIpAddr as byte[4] ' 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] = 20 myIpAddr[3] = 60 Ethernet_Intern_Init(myMacAddr, myIpAddr, _ETHERNET_CFG_AUTO_NEGOTIATION) |
Ethernet_Intern_Enable
Prototype |
sub procedure Ethernet_Intern_Enable(dim filterType as byte) |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Returns |
Nothing. |
||||||||||||
Description |
This is MAC module routine. This routine enables appropriate network traffic on the MCU's internal Ethernet module by the means of it's receive filters (unicast, multicast, broadcast, crc). Specific type of network traffic will be enabled if a corresponding bit of this routine's input parameter is set. Therefore, more than one type of network traffic can be enabled at the same time. For this purpose, predefined library constants (see the table below) can be ORed to form appropriate input value. Parameters:
![]() |
||||||||||||
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
||||||||||||
Example |
Ethernet_Intern_Enable(_ETHERNET_FILTER_TYPE_CRC or _ETHERNET_FILTER_TYPE_MULTICAST) ' enable CRC checking and Multicast traffic |
Ethernet_Intern_Disable
Prototype |
sub procedure Ethernet_Intern_Disable(dim filterType as byte) |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Returns |
Nothing. |
||||||||||||
Description |
This is MAC module routine. This routine disables appropriate network traffic on the MCU's internal Ethernet module by the means of it's receive filters (unicast, multicast, broadcast, crc). Specific type of network traffic will be disabled if a corresponding bit of this routine's input parameter is set. Therefore, more than one type of network traffic can be disabled at the same time. For this purpose, predefined library constants (see the table below) can be ORed to form appropriate input value. Parameters:
![]() |
||||||||||||
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
||||||||||||
Example |
Ethernet_Intern_Disable(_ETHERNET_FILTER_TYPE_CRC or _ETHERNET_FILTER_TYPE_MULTICAST) ' disable CRC checking and Multicast traffic |
Ethernet_Intern_doPacket
Prototype |
sub function Ethernet_Intern_doPacket() as byte |
---|---|
Returns |
|
Description |
This is MAC module routine. It processes next received packet if such exists. Packets are processed in the following manner:
![]() Ethernet_Intern_doPacket must be called as often as possible in user's code.
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
while true ... Ethernet_Intern_doPacket() ' process received packets ... wend |
Ethernet_Intern_writePayloadByte
Prototype |
sub procedure Ethernet_Intern_writePayloadByte(dim dat as byte, dim offset as word) |
---|---|
Returns |
Nothing. |
Description |
It writes one byte in the TCP payload. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim data_ as byte ... Ethernet_Intern_writePayloadByte(data_, 0) ' put a byte at the beginning of the TCP payload |
Ethernet_Intern_writePayloadBytes
Prototype |
sub procedure Ethernet_Intern_writePayloadBytes(dim dat as ^byte, dim offset as word, dim numOfBytes as word) |
---|---|
Returns |
Nothing. |
Description |
It writes a requested number of bytes into TCP payload. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim buffer as byte[17] buffer = "mikroElektronika" ... Ethernet_Intern_writePayloadBytes(buffer, 0, 16) ' put an RAM array into TCP payload |
Ethernet_Intern_writeConstPayloadBytes
Prototype |
sub procedure Ethernet_Intern_writeConstPayloadBytes(dim dat as ^const byte, dim offset as word, dim numOfBytes as word) |
---|---|
Returns |
Nothing. |
Description |
It writes a requested number of bytes from prgram memory into TCP payload. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
Ethernet_Intern_writeConstPayloadBytes(@buffer, 0, 16) ' put a const bytes into TCP payload |
Ethernet_Intern_writePayloadString
Prototype |
sub function Ethernet_Intern_writePayloadString(dim dat as ^byte, dim offset as word) as word |
---|---|
Returns |
Number of bytes written into the TCP payload. |
Description |
This is MAC module routine. It stores whole string (excluding null termination) into RAM at current write location. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim buffer as string[16] ... buffer = "mikroElektronika" Ethernet_Intern_writePayloadBytes(@buffer, 0) ' put an RAM array into TCP payload |
Ethernet_Intern_writeConstPayloadString
Prototype |
sub function Ethernet_Intern_writeConstPayloadString(dim dat as ^const byte, dimoffset as word) as word |
---|---|
Returns |
Number of bytes written into the TCP payload. |
Description |
This is MAC module routine. It stores whole const string (excluding null termination) into RAM at current write location. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
Ethernet_Intern_writeConstPayloadString(@buffer, 0); // put a const string into TCP payload |
Ethernet_Intern_readPayloadByte
Prototype |
sub function Ethernet_Intern_readPayloadByte(dim offset as word) as byte |
---|---|
Returns |
Byte read from TCP payload. |
Description |
It fetches a byte from the TCP payload, from the position detemined by the Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim buffer as byte ... buffer = Ethernet_Intern_readPayloadByte(0) ' read a byte from TCP payload |
Ethernet_Intern_readPayloadBytes
Prototype |
sub procedure Ethernet_Intern_readPayloadBytes(dim dat as ^byte, dim offset as word, dim numOfBytes as word) |
---|---|
Returns |
Nothing. |
Description |
It fetches requested number of bytes from the TCP payload. Parameters:
This routine is called either from the Ethernet_Intern_UserTCP or Ethernet_Intern_UserUDP. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim buffer as byte[16] ... Ethernet_Intern_getBytes(@buffer, 0, 16) ' read an array from TCP payload |
Ethernet_Intern_UserTCP
Prototype |
sub function Ethernet_Intern_UserTCP(dim byref remoteHost as byte[4], dim remotePort, localPort, reqLength as word, dim byref flags as TEthInternPktFlags) as word |
---|---|
Returns |
|
Description |
This is TCP module routine. It is internally called by the library. The user accesses to the TCP/HTTP request by using some of the Ethernet_Intern_get routines. The user puts data in the transmit buffer by using some of the Ethernet_Intern_put routines. The function must return the length in bytes of the TCP/HTTP reply, or 0 if there is nothing to transmit. If there is no need to reply to the TCP/HTTP requests, just define this function with return(0) as a single statement. Parameters:
![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
This function is internally called by the library and should not be called by the user's code. |
Ethernet_Intern_UserUDP
Prototype |
sub function Ethernet_Intern_UserUDP(dim byref remoteHost as byte[4], dim remotePort, destPort, reqLength as word, dim byref flags as TEthInternPktFlags) as word |
---|---|
Returns |
|
Description |
This is UDP module routine. It is internally called by the library. The user accesses to the UDP request by using some of the Ethernet_Intern_get routines. The user puts data in the transmit buffer by using some of the Ethernet_Intern_put routines. The function must return the length in bytes of the UDP reply, or 0 if nothing to transmit. If you don't need to reply to the UDP requests, just define this function with a return(0) as single statement. Parameters:
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
This function is internally called by the library and should not be called by the user's code. |
Ethernet_Intern_getIpAddress
Prototype |
sub function Ethernet_Intern_getIpAddress() as ^byte
|
---|---|
Returns |
Pointer to the global variable holding IP address. |
Description |
This routine should be used when DHCP server is present on the network to fetch assigned IP address. ![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim ipAddr as byte[4] ' user IP address buffer ... memcpy(ipAddr, Ethernet_Intern_getIpAddress(), 4) ' fetch IP address |
Ethernet_Intern_getGwIpAddress
Prototype |
sub function Ethernet_Intern_getGwIpAddress() as ^byte
|
---|---|
Returns | Pointer to the global variable holding gateway IP address. |
Description |
This routine should be used when DHCP server is present on the network to fetch assigned gateway IP address. ![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim gwIpAddr as byte[4] ' user gateway IP address buffer ... memcpy(gwIpAddr, Ethernet_Intern_getGwIpAddress(), 4) ' fetch gateway IP address |
Ethernet_Intern_getDnsIpAddress
Prototype |
sub function Ethernet_Intern_getDnsIpAddress() as ^byte
|
---|---|
Returns | Pointer to the global variable holding DNS IP address. |
Description |
This routine should be used when DHCP server is present on the network to fetch assigned DNS IP address. ![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim dnsIpAddr as byte[4] ' user DNS IP address buffer ... memcpy(dnsIpAddr, Ethernet_Intern_getDnsIpAddress(), 4) ' fetch DNS server address |
Ethernet_Intern_getIpMask
Prototype |
sub function Ethernet_Intern_getIpMask() as ^byte
|
---|---|
Returns | Pointer to the global variable holding IP subnet mask. |
Description |
This routine should be used when DHCP server is present on the network to fetch assigned IP subnet mask. ![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim IpMask as byte[4] ' user IP subnet mask buffer ... memcpy(IpMask, Ethernet_Intern_getIpMask(), 4) ' fetch IP subnet mask |
Ethernet_Intern_confNetwork
Prototype |
sub procedure Ethernet_Intern_confNetwork(dim byref ipMask, gwIpAddr, dnsIpAddr as byte[4])
|
---|---|
Returns | Nothing. |
Description |
Configures network parameters (IP subnet mask, gateway IP address, DNS IP address) when DHCP is not used. Parameters:
![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim ipMask as byte[4] ' network mask (for example : 255.255.255.0) gwIpAddr as byte[4] ' gateway (router) IP address dnsIpAddr as byte[4] ' 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 ... Ethernet_Intern_confNetwork(ipMask, gwIpAddr, dnsIpAddr) ' set network configuration parameters |
Ethernet_Intern_arpResolve
Prototype |
sub function Ethernet_Intern_arpResolve(dim byref ip as byte[4], dim tmax as byte) as ^byte
|
---|---|
Returns |
If successful, returns MAC address, NULL otherwise. |
Description |
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 Parameters:
![]() |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim IpAddr as byte[4] ' IP address ... IpAddr[0] = 192 IpAddr[0] = 168 IpAddr[0] = 1 IpAddr[0] = 1 ... Ethernet_Intern_arpResolve(IpAddr, 5) ' get MAC address behind the above IP address, wait 5 secs for the response |
Ethernet_Intern_sendUDP
Prototype |
sub function Ethernet_Intern_sendUDP(dim byref destIP as byte[4], dim sourcePort, destPort as word, dim pkt as ^byte, dim pktLen as word) as byte |
---|---|
Returns |
|
Description |
This is UDP module routine. It sends an UDP packet on the network. Parameters:
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim IpAddr as byte[4] ' remote IP address ... IpAddr[0] = 192 IpAddr[0] = 168 IpAddr[0] = 1 IpAddr[0] = 1 ... Ethernet_Intern_sendUDP(IpAddr, 10001, 10001, "Hello", 5) ' send Hello message to the above IP address, from UDP port 10001 to UDP port 10001 |
Ethernet_Intern_dnsResolve
Prototype |
sub function Ethernet_Intern_dnsResolve(dim byref host as string, dim tmax as byte) as word |
---|---|
Returns |
|
Description |
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 Parameters:
The above mentioned network parameters should be set by this routine only if DHCP module is not used. Otherwise DHCP will override these settings. ![]()
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
dim remoteHostIpAddr as byte[4] ' 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, Ethernet_Intern_dnsResolve("swisstime.ethz.ch", 5), 4) |
Ethernet_Intern_initDHCP
Prototype |
sub function Ethernet_Intern_initDHCP(dim tmax as byte) as byte |
---|---|
Returns |
|
Description |
This is DHCP module routine. It sends an DHCP request for network parameters (IP, gateway, DNS addresses and IP subnet mask) and waits for DHCP reply. If the requested parameters were obtained successfully, their values are stored into the library global variables. These parameters can be fetched by using appropriate library IP get routines:
UDP port Parameters:
![]()
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
... Ethernet_Intern_initDHCP(5) ' get network configuration from DHCP server, wait 5 sec for the response ... |
Ethernet_Intern_doDHCPLeaseTime
Prototype |
sub function Ethernet_Intern_doDHCPLeaseTime() as byte |
---|---|
Returns |
|
Description |
This is DHCP module routine. It takes care of IP address lease time by decrementing the global lease time library counter. When this time expires, it's time to contact DHCP server and renew the lease. |
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
while true ... if(Ethernet_Intern_doDHCPLeaseTime() <> 0) then ... ' it's time to renew the IP address lease end if wend |
Ethernet_Intern_renewDHCP
Prototype |
sub function Ethernet_Intern_renewDHCP(dim tmax as byte) as byte |
---|---|
Returns |
|
Description |
This is DHCP module routine. It sends IP address lease time renewal request to DHCP server. Parameters:
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
while true ... if(Ethernet_Intern_doDHCPLeaseTime() <> 0) then Ethernet_Intern_renewDHCP(5) ' it's time to renew the IP address lease, with 5 secs for a reply end if ... wend |
Ethernet_Intern_configLED
Prototype |
sub function Ethernet_Intern_configLED(dim ledCfg1 as byte, dim ledCfg2 as byte) as word |
---|---|
Returns |
|
Description |
This routine sets user selectable pins as LED indicators of network activity. Parameters:
|
Requires |
Ethernet module has to be initialized. See Ethernet_Intern_Init. |
Example |
|
What do you think about this topic ? Send us feedback!