Sie sind auf Seite 1von 32

Application Report

SBAA114 - June 2004

Building a Complete Webserver on the MSC121x Using


FlexGateE Technology
Russell Anderson

Data Acquisition Products

Jrgen Wickenhuser

Wickenhuser Elektrotechnik
ABSTRACT

The MSC121x family of 8051 microcontrollers, with its rich array of on-chip features, is an
ideal hardware platform for sophisticated applications built with the FlexGate TCP/IP Stack.
This application report describes the use of the MSC121x as an ultra-compact webserver on
a simple printed circuit board (PCB) containing only a few components. Except where
otherwise noted, all references to the MSC121x indicate any member of the MSC1210,
MSC1211, and/or MSC1212 family of microcontrollers.

Contents
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1

Protocol Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Selecting an Ethernet Driver IC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

The Ethernet Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

The CPU Board . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

The User Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Setting Up the FlexGate TCP/IP Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Generating Dynamic HTML Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Receiving Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Main Software Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

10

User Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

11

Demonstration Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

12

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Related Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Appendix A Schematics, Board Layout, and Parts Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Appendix B \SRC\MSC1210\ELM_FLEX\ELMET.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Appendix C ELM_FLEX.C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

FlexGate is a registered trademark of Wickenhuser Elektrotechnik. All other trademarks are the property of their respective
owners.
1

SBAA114

Introduction
Technological advancements as a result of the Internet are now accepted as a matter of fact.
Changes in terminology have also occurred as the use of the Internet has become more and
more widespread. Until recently, for example, connectivity was merely synonymous with a
device being capable of linking to a PC via an RS-232 or RS-485 interface and a simple cable.
However, connectivity now refers to the ability to link to the global network of the Internet;
sharing data is both enabled and expected through a series of physical and virtual connections.
Although Internet usage is common, many users may have only a trivial understanding of the
process by which the Internet works. Even training courses in networking are often abstract and
theoretical, with very little hands-on experience. Consequently, this report includes a brief
discussion of stack protocols and their function in the process of networking.
The FlexGate TCP/IP Stack is an open-source implementation of an internet protocol stack for
virtually all 8051 microcontrollers. It is a highly scalable software package that requires a
minimum of hardware resources. This application report describes the use of the MSC121x
family of microcontrollers as an ultra-compact webserver, built on the FlexGate TCP/IP stack.

Protocol Basics
Communication between electronic systems occurs through a series of standard protocols, or
established hardware and software rules which collectively form a communications language.
Protocols are most often combined in a suite (that defines the entire set) which is then
implemented by software in a given configuration called a protocol stack.
Protocol stacks are typically divided into three primary sections (or layers): media, transport, and
applications. Network servers and user PCs built on a given operating system, such as Microsoft
Windows, generally have two well-defined software interfaces: one between the applications
and transport layers, and one between the transport and media layers. Two of the protocols that
have been fundamental in the development of Internet technology are Transmission Control
Protocol (TCP) and Internet Protocol (IP), which are implemented in a stack commonly known
as TCP/IP. One of the most common network architectures that enables TCP/IP networking is
the Ethernet. Ethernet architecture uses a bus (or star) topology and supports data transfer
rates of 10MBPS to 100MBPS.
The software interface between the transport and media layers defines how transport protocol
software uses specific media and hardware types, or card drivers. For example, this interface
level would define how TCP/IP transport software would talk to Ethernet hardware.
The application-to-transport interface defines how application programs make use of the
transport layers. For instance, this interface level would define how a web browser program
would talk to TCP/IP transport software.
There are several implementations of the TCP/IP stacking protocol presently in wide use. (For
additional information, see Application Report SLAA137A, MSP430 Internet Connectivity,
available for download at www.ti.com.) This implementation of the MSP430 is
application-specific; that is, it supports only one software object that connects a network protocol
to an application (a single socket) and was tailored to only one single HTML page. This limited
usage may be sufficient in some cases (and makes it much easier to understand the underlying
software design), but is inadequate as a practical webserver for real-world applications.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Two other commonly-used protocols in the realm of Internet-based networking are file-transfer
protocol (FTP) and user datagram protocol (UDP). FTP requires at least two sockets for
communication to be successfully transmitted, received, and acknowledged, while one socket is
sufficient for UDP.
The MSC121x with the FlexGate TCP/IP Stack offers various possibilities for Internet
connectivity. This document will discuss only the topics of how to build and operate a webserver;
it will not review any other features of the FlexGate TCP/IP Stack.

Selecting an Ethernet Driver IC


Several comparable Ethernet devices were evaluated for this report. Two of these devices, the
RTL8019AS (from RealTek) and the CS8900A (from Crystal Semiconductor/Cirrus Logic), are
designed for use in industry-standard architecture (ISA) PC systems. Both the RTL8019AS and
the CS8900A support only 10MB Ethernet connections; each has some additional RAM that
enables the buffering of transmitted and received data. A third device, the AX88796 (from Asix),
is more powerful; it has a larger on-chip RAM and supports 10/100MB connections. In light of
the overall speed requirements (10MB is more than adequate for an embedded web server), the
CS8900A was selected; porting the lower software driver communication layers to either of the
other Ethernet devices did not pose any problem in this investigation.
For a detailed discussion of using an Ethernet-driving IC, refer to Application Report SLAA137A,
as well as supporting documentation for the CS8900A (available at www.cirrus.com).

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

The Ethernet Board


Figure 1 shows a standard system design for this project, consisting of two separate PCBs that
are connected by a 2 x 17 pin row. (Schematics and a parts list are provided in Appendix A.)

Figure 1. Ethernet Board Design


As a result of a unique feature of the MSC121x, no glue-logic is required in order to map the
CS8900A into the MSC121x memory space; at start-up, the internal RAM of the MSC121x is
mapped to 0x8400. This leaves the lower 32k completely free for the CS8900A. Consequently,
the address bit Adr15 (P2.7 of the CPU) is used as a chip-select for the CS8900A. The data bus
is 8 bits wide; four address lines are required to control the CS8900A. Two LEDs show the
common signals (Link and Activity), similar to those used on a PC network card. It is also
significant to note that because of the required transformer, this Ethernet design creates a
galvanically-isolated network.
A liberal use of ceramic bypass capacitors is recommended, even in light of the low (10MB) data
transmission rate. For evaluation purposes, two additional LEDs (LED3 and LED4), a
push-button and a small breadboard were also included on the PCB.

The CPU Board


The CPU board was originally designed as a development board and reference design for the
C/51 ANSI C-Compiler from Wickenhuser (www.wickenhaeuser.de). Elektor Electronics, a
European trade publication, has published several articles about this board (beginning with the
August, 2003 issue) and offers ready-to-run hardware kits.
It is important to note that the CPU analog input has an RC low-pass filter. As a result, using the
MSC121x analog input buffer is recommended for precise measurements.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Although it is not obvious, the PCB layout is fully compatible with the standard downloader
(supplied by Texas Instruments) for the MSC121x family. The only difference is that the two
jumpers (JP1 and JP2) must be set to enable PC download. The two jumpers must remain in
this position during development. If the software is finished, JP1 and JP2 must be removed, so
the CPU is protected against further downloads. Jumper JP3 enables traditional download by
pulling PSEN low. Normally, JP3 should always be left open; downloading via JP1 and JP2 is
recommended.
The webserver runs fine with the 11.0592MHz CPU (keep in mind that the MSC121x family is
more than 2.5 times faster than a generic 8051). The PCB incorporates a standard RS-232 port
(UART0), an RS-485 port (for UART1), and an I2C port which is not supported in this software.
The power consumption of the complete webserver is between 100140mA, with most current
being taken by the Ethernet driver IC. The supply voltage should be between 7.59V. A higher
voltage will dissipate unnecessary heat.

The User Software


The software is divided into several parts, which are loosely coupled. The complete software is
open-source code, and can be compiled with a free evaluation version of the Wickenhuser
C/51 ANSI C-Compiler. This software can also be used as the basis for further projects. Please
review the source code, elm_flex.c, which contains many additional remarks. (See Appendix C.)
The primary purpose of an embedded webserver is for system measurement and/or control. In
this application, the webserver performs an RTC (Real-Time-Clock) function and measures a
temperature signal, connected to the analog input channel AIN7, as shown in Figure 2:
REFOUT, 2.5V

1.13k,
0.01%

Platinum Temperature Resistor


PT100
0C: 100.00
50C: 119.40

Signal

AINCOM/AGND

Figure 2. Temperature Sensor


Platinum temperature resistors are widely available in different precisions. If using a precise
PT100 with a precise resistor, it is possible to achieve a precision of better than 0.1C without
performing any calibration in the range of 20C to +80C. Small deviations in the reference
voltage will have no impact on the result, because the reference voltage is the same that the
MSC121x uses for measurements. The PT100 is a nonlinear device, but its nonlinearity is
known and well-documented. In the past, analog circuitry was needed in order to linearize and
amplify a PT100 signal. By using an MSC121x, almost all analog circuitry is unnecessary: the
MSC121x offers a precise excitation for the PT100 (REF_OUT), then amplifies and digitizes the
signal. If desired, a mathematical (digital) linearization can also be applied. Significant additional
noise reduction can be achieved by using the MSC121x summation register.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

To keep this application simple, no additional linearization is made, thus giving an expected
precision of about 0.5C in the range of 10C to +50C. Summation could be enabled by a
software switch, as described in the companion source code. If working with PT100, the device
self-heating should be considered; the current passing through the PT100 may increase the
temperature slightly. Most PT100 suppliers offer maximum current recommendations. Another
approach is to use higher currents for measurement, but then switch off the sensor excitation.
The MSC121x auxiliary interrupt can be used to build an RTC and access the temperature in a
precise yet simple manner. After the auxiliary interrupt is enabled, it can be configured to trigger
each second and each time the analog-to-digital (A/D) converter has a new result. For additional
details, please see \SRC\MSC1210\ELM_FLEX\ELMET.C (Appendix B). Care must be taken if
accessing data that are modified by the interrupt. For this purpose, several transfer functions
exist (that is, for reading and setting the RTC, or reading the A/D converter result). In light of the
fact that this was only a demonstration project, the A/D converter was calibrated only at
power-up. For an actual system, a calibration should also be performed from time to time, which
could best be resolved by a logical state machine within the auxiliary interrupt routine.
The complete MSC121x initialization is also done in the above-mentioned file. Note that the
internal RAM must be mapped to 0x8400 as the first action. This mapping is performed by the
function, startup_first().

Setting Up the FlexGate TCP/IP Stack


The stack is completely located in \SRC\FLEXGATE\TCPIP\*.*. This code is available for
download along with this application report at www.ti.com. The only file that must be regarded is
NET.H; this file contains definitions for scaling the stack. This is the only part of the file that is
intended for user changes. List 1 shows this applications settings:

List 1: NET.H
/**************************************************************************
* OPTION DEFs for this Stack (Change for your needs)
**************************************************************************/
//#define DEBUG_REC
//if defined: Record Send/received Frames
//#define USE_UDP
//If defined: UDPSupport added
//#define USE_TCP_CLIENT
//If defined: TCPClient (Active open, Active
ARP)
// RXBuffer (only one)
#define MAX_RX
100

// May be up to 14001500 Bytes, use at least


100 Bytes

// TXBuffers (>=1)
#define MAX_TX
100

#define MAX_SOCK 4
#define TX_BUFFERS

// Transmission Buffer Size, may be up to


14001500 Bytes
// No. of sockets (should be >= TX_BUFFERS,
18 recom.)
// Maximum No. of Sockets
// Recommended: 3 to 3*MAX_SOCK

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

For an MSC121x webserver, the first three options are not required. Because there is only 1kB
RAM available (movx accessible), only a small number of buffers are available. MAX_SOCK
defines the maximum number of simultaneously active TCP/IP connections. The MSC12x
webserver forces immediate closing after a page is transmitted, so a total of four sockets is
sufficient.
It should be noted that embedded graphics in HTML code may require more than one socket,
even if only one page is generated. Moreover, the limited RAM of the CS8900A can only buffer a
small number of Ethernet data frames. Although TCP retransmission mechanisms will monitor
this, it will increase the overall transmission time of a page.

Generating Dynamic HTML Pages


Generating dynamic HTML pages is the most important function of an embedded webserver.
Because the FlexGate TCP/IP stack comes with its own ANSI C-Compiler, it offers a unique
feature: C variables can be included in HTML code by name. This is an example of a very
simple HTML page in tag format:

List 2: d_page.html
<html>
<head>
<title>Dynamic HTML</title>
</head>
<body>
Hello @adr @name!<br><br>
</body>
</html>

The tag for dynamic variables is the @. Thus, the adr and name tags are actually C variables
(strings). These strings could be defined in the corresponding C file as:
char adr[5];
char name[50];

// will be automatically located in xdata


// and must be a global variable!

If the FlexGate webserver driver encounters a tagged variable, it will simply include the
variables content in the generated HTML code. If adr[ ] is equal to Mr. and name[ ] is
Wickenhuser, the HTML will be Hello Mr. Wickenhuser!
There is no limit to the number of available variables other than the CPU RAM (movx
accessible). It is important that the reserved space for the variable must be large enough and
that the terminating \0 byte of a C-string counts as 1 byte. For example, adr[ ] must not hold
longer strings than Mrs. (four characters) for the declaration char adr[5].
The contents of the strings can be altered or assigned with all standard C functions such as
sprintf() or strcpy(). The application is responsible for setting up the required variables.
This document will not go into any deeper description of HTML; many good and easy-to-read
resources are widely available. If opened in a raw state with a standard browser, developing
HTML pages for the FlexGate TCP/IP Stack is not complicated because the tagged C variables
will appear as simple text. It is even possible to include advanced features such as JavaScript or
URL-attached session management.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

As mentioned before, it is also possible to include graphics (GIF and JPEG) in FlexGate
dynamic pages, as shown in this example:
<img src=logo.gif>

or as a dynamic version, as shown here:


<img src=@dyn_graf>

Note that moving graphics to other webservers will save a great deal of memory on the
MSC121x. In this case, a reference to a graphics would look like this example code:
<img src=http://www.xxx.com/logo.gif>

The screen display for the webserver appears as in Figure 3, which shows the current
temperature and time. The bar graph contains two nested tables. The outer table has a yellow
background and a fixed size, while the inner table size depends on the measured temperature.

Figure 3. Webserver Temperature Display

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

7.1

Embedding Dynamic HTML


If a users browser asks any webserver for an HTML page, it expects to receive a single HTML
file as a response. The receiving browser does not care about the process by which the contents
of this file are created.
The most pragmatic way to create a dynamic HTML page in C-code may be to use a large
printf()-type function and store the entire reply in a large buffer. This is the method by which
most PC-based webservers will solve the request. Unfortunately, this technique requires a huge
amount of available RAM, which is most likely not available on an embedded system.
A more economical approach to dynamic HTML page creation is to have only a very small part
of the HTML page contain the dynamic information; the rest of the page remains static. Because
the locations where the dynamic information will be placed are known in advance (at compile
time), a tool named Webcode.exe was designed as a helper. Webcode can be thought of as a
pre-processor that uses an HTML file (with tagged C-variables) as input, and generates an 8051
assembly file output. This assembly will perfectly fit into the embedded project. The design goal
of the assembly is that it consists only of pure static information that can be stored in code
memory. The dynamic information is completely hidden by static references to dynamic
information.
A small example demonstrates the effectiveness of this approach. This is a simplified version of
the assembly code that Webcode generates; assuming that the templates filename might be
d_page.html, the assembly output will be d_page.s51:

List 3: WEBCODE Assembly Code


; *** generated by WEBCODE, do not modify ***
.import adr
; as (xdata) char adr[];
.import name ; as (xdata) char name[];
.export d_page ; as (code) char d_page[];
.segment sclass code ; locate into CODE d_page:
.dc.b <html><head><title>Dynamic HTML</title></head><body>Hello
.dc.b D_TOKEN
.dc.w adr ; insert address of adr
.dc.b
.dc.b D_TOKEN
.dc.w name ; insert address of name
.dc.b !<br><br></body></html>,END_TOKEN

D_TOKEN and END_TOKEN are special characters. It is evident that this file can be
assembled separately. If the receiving web browser finds unresolved references, of course,
there will be error messages exchanged. Consequently, the user must declare these unresolved
references somewhere within the program, as in this example:
char adr[5];
// defines and reserves space in xram
char name[50];
// dto.
extern code char d_page[]; // declaration without definition

Now the process for embedding dynamic HTML is clearer:


1. The user must verify that the file d_page.s51 is somehow added to his HTML project. On
the C/51 compiler, this is solved by simply adding Webcode.exe (it can be found in
Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

\BIN\WEBCODE.EXE as a command-line-driven tool) to the C/51 default make rules.


Adding Webcode enables the C/51 to add and encapsulate HTML, GIF and JPEG
files to any 8051 project. (The make rules can be found in \BIN\BUILTINS.MAK; the
C/51 uses MAKE (a well-established industrial standard) for managing rules.)
2. The user must define the required dynamic data as strings. The names of the available
pages must be declared in the source code, as shown in List 3. Remember: In C, a
definition will reserve space and implicitly include a declaration, whereas a simple
declaration (indicated by the C keyword extern) only expresses that an object with the
declared name and type will be available later at linking time. Thus, there must be only
one definition for each name, but many declarations are allowed. According to the
example given in List 3, adr[ ] and name[ ] will physically reserve space, whereas
extern plus d_page[ ] only express that the requestor will find this object somewhere in
the project.
3. If an HTML page is requested by a web browser, the user first must initialize the dynamic
data that the requested page may require. It can then pass the name (that is, the address)
of the reply page to a function called webpage_bin(). This function, and the other related
functions of the FlexGate TCP/IP stack, then generates the complete dynamic reply page
without further user interaction. Of course, if no changes are required for any dynamic
data, the actual value will be used. The stack is designed in such a way that it will
automatically assemble the HTML (in fragments that are as large as possible) each time
poll_webserver() is called (as described later, in Section 9.3).
4. If the TCP/IP stack encounters a special token (DTOKEN in the List 3 example), it will
insert the actual value. If name[ ] is holding Anderson, each occurence of @name in
the HTML template (List 2, page 7) will be replaced by Anderson before the HTML is
transmitted to the client. Because the generated HTML might be larger than the
applications transmission buffer, the stack automatically verifies that the dynamic data is
consistent. Because the transmission is done in the background, it might happen that the
application changes the contents of name[ ], for example, from Anderson to
Wickenhuser at a random time. But in no case will corrupt data, such as
Andeenhuser be generated.

Receiving Input
The FlexGate webserver supports URL-attached argument passing, which is equal to the
GET-method used in HTML forms.
The webserver supports only variables named a1 to a255 or A1 to A255. Webserver
functions will retrieve the number of such an argument or zero; another function will retrieve a
pointer to the arguments value. By looking into the example source code, the mechanism by
which this is accomplished is clear. Using these limited names for input is a design trade-off; it
should be emphasized that there is no possibility to use a similar system such as tagged
variables (which are used for output), because the input arguments are not known at the compile
time (as shown in 9.4).
If a URL request is too long, the webserver will ignore the request in order to prevent a buffer
overflow.

10

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Main Software Functions

9.1

Initialization
The main() function is located in \SRC\MSC1210\ELM_FLEX\ELM_FLEX.C. This is the entry
point of the software.

9.2

Selecting an IP Address
There is one item to be cleared; that is the webservers IP address. Keep in mind that each
member system within a local TCP/IP network must have an unique IP address. The selection of
this address is not the focus of this document, however; and if the user has any concerns
regarding the IP address assigned to the webserver, the local network administrator should be
contacted. The source code default IP assignment s is 192.168.1.156. A macro from NET.H
will execute the instruction:
COMPOSE_IP(my_ip,192,168,1,156);

my_ip is the variable within the stack that is holding the local IP address. After the two
initfunctions init_msc1210() and init_net() have been called, the sockets that can be used for
HTML must be initialized (note that some sockets may be reserved for other types of
connections, such as e-mail, Telnet, or UDP).
// Enable ALL (or less) Sockets as General Server HTTP at port 80
for(i=0;i<MAX_SOCK;i++) SOCKET_SETUP(i,SOCKET_TCP,80,FLAG_PASSIVE_OPEN);

MAX_SOCK is defined in NET.H, while SOCKET_SETUP is a macro from NET.H. It should


be mentioned, however, that the FlexGate TCP/IP Stack monitors all sockets for timeouts; any
dead or stalled connections will be released after a certain time.
One final function call configures the MSC121xs analog functions:
// Initialize A/D at last: Vref on 2.5V, Buff on, BOD off, PGA 1
set_adval_bip(0x78,EVREF|EBUF|VREFH|GAIN_8);

9.3

Poll Webserver
After this, the software will stay in an endless loop that must periodically call the function
poll_webserver().
If no transactions or executions have occurred, poll_webserver() will return 0. In any other
case, the result (or event) will contain a code in its high byte, and (optionally) the number of the
socket in its low byte. There are many more events than the few that are required for a
webserver. Here only two events are needed:

9.4

EVENT_HTTP_REQUEST
EVENT_SOCKET_IDLETIMER

Respond to Events
The last event appears about twice each second and will do nothing more than toggle the
User-LED. The other event shows that an HTML page was requested. If this event is not
processed, a default page containing the text Page not found will be sent.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

11

SBAA114

In this application, the name of the requested page is examined first. Because there are only a
few pages on the webserver, only the first letter is used for distinction. Each page may require
filling out a limited number of variables.
In the demo, there is only one page that may receive arguments: reply.html. A simple loop
scans the arguments until no further arguments are found. Arguments A1 to A3 control the
RTC; A4 to A6 set LED3 and LED4. The usage of A4 may be unclear (because there are only
a total of two LEDs and three arguments), but A4 serves as a hidden input that clears both
LEDs. Arguments A5 and A6 will appear only if explicitly checked in the HTML form.
It is important to reiterate that the URL arguments copied to C variables never exceed the
reserved space. Any size limits in the corresponding HTML forms should not be relied upon.
Functions such as strlen() could be used for verification.
Figure 4 shows another example of the webserver screen display, containing a dynamic form.
The page shown here actually contains two forms. Both forms pass their arguments to
reply.html, depending on which Set-button was pressed.

Figure 4. Webserver Forms Display


Here are two examples for calls. The first comes from Set Clock, while the second comes from
Set LEDs (both lines will be automatically created by the users browser):

12

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

http://192.168.1.156/reply.html?A1=16&A2=24&A3=37&A9=Set+Clock
http://192.168.1.156/reply.html?A4=&A5=on&A9=Set+LEDs

A ? character announces that parameters are following. All parameters are connected by a &.
Space characters in the input are replaced by a +. Argument A4 (corresponding to LED3) is
empty.

10

User Tasks
There is no explicit user task that must be performed on the MSC121x, because the auxiliary
interrupts execute all necessary functions.
In cases where an additional user task is required, several points must be noted:

11

The user task should be called only if poll_webserver() returns 0

The user task should be kept as short as possible. Although the CS8900A has some on-chip
RAM, it will buffer only a certain number of Ethernet frames. As a recommendation, the user
task should not run longer than 10100 msec.

It is more efficient to use a software state machine for more complex user tasks.

Demonstration Results
The complete source code is available for free download (www.wickenhaeuser.de). It can be
compiled with the free demo version of the C/51 ANSI C-Compiler. Normally, the demonstration
version will compile only 8kB of code, but contributions have been made that allow up to 16kB
under several conditions, such as those described here for the hardware and software.
Upon installation of the C/51 ANSI C-Compiler, a short step-by-step instruction about the
software from this application note can be found in the directory \SRC\MSC1210\ELM_FLEX\*.*.
Ready-to-run hardware kits are also available from Elektor Electronics magazine
(www.elektor.org).

12

Summary
This document gives only a very brief overview about some of the possible applications of the
FlexGate TCP/IP Stack. Many other protocols and services are widely available; for example,
UDP can be used for transferring data to many receivers simultaneously, while TELNET enables
text-based applications. The FlexGate TCP/IP stack also includes support for SMTP and POP3,
thus enabling the sending and receipt of e-mail.
Internal details of the stack have also been intentionally omitted.
Many other additional features are currently under construction, such as firmware upload over
Ethernet or using a GSM-dial-up-PPP connection instead of the Ethernet.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

13

SBAA114

References
Stevens, W.R. (1993.). TCP/IP Illustrated, Volume 1: The Protocols. Reading, MA:
AddisonWesley.
Postel, J. (1981.). RFC791: Internet Protocol. http://www.faqs.org/rfcs/rfc791.html
Postel, J. (1981.). RFC792: Internet Control Message Protocol.
http://www.faqs.org/rfcs/rfc792.html
Postel, J. (1981.). RFC793: Transmission Control Protocol. http://www.faqs.org/rfcs/rfc793.html
Bentham, J. (2002.). TCP/IP Lean: Web Servers for Embedded Systems. (2nd ed.) Lawrence,
KS: CMP Books.
MSP430 Internet Connectivity (SLAA137A). (Available for download from www.ti.com)

Related Links
Wickenhuser Elektrotechnik (www.wickenhaeuser.de). Information on the C/51 ANSI
C-Compiler and FlexGate TCP/IP stack.
Elektor Electronics magazine (www.elektor.org).
Cirrus Logic/Crystal Semiconductor (www.cirrus.com) Information on the CS8900A.
RealTek (www.realtek.com.tw). Information on the RTL8019AS.
Asix (www.asix.com.tw). Information on the AX88796L.

14

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Appendix A
A.1

Schematics, Board Layout, and Parts Lists

CPU Board.

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

15

SBAA114

CPU Board (continued)

16

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

CPU Board (continued)

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

17

SBAA114

CPU Board (continued)

18

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Table A1. CPU Board Parts List


Reference
Designator

Qty

Description

IC1

Micromonitor (MAX810, LM8103M3, ZxCM210 or compatible), Threshold 4V, SOT23/3

IC2, IC6

Standard voltage regulator (no low-drop) 78LO5, SO8/150mil

RS-485 driver (SN75176, DS75716, MAX485, LTC485, or compatible). Slew rate


(125kB) limited variant preferred. SO8/150mil.

IC4

Microconverter MSC1210 (Y35 for 8-32kB Flash), PQFP P64

IC5

Hex inverter with Schmitt trigger input, 74HCT14, TSSOP14

T1

PNP Transistor TUP (BC557B or compatible), SOT23/3

D1

1A Rectifier diode, GF1M, DO214

D2, D3

Zener diode BZX84-9V1, SOT23/3

D4, D5

Zener diode BZX84-4V7, SOT23/3

D6

Fast diode with common anode (BAW56 or compatible), SOT23/3

LED1

Chip LED, 0805

C1, C4, C11,


C16C18

Ceramic capacitor, 470nF/16V, 0805

C7, C5

Ceramic capacitor, NPO, 10pF, 0603

C8

Ceramic capacitor, NPO, 1pF, 0603

C9, C10, C3,


C12, C2, C6

Ceramic capacitor, 100nF/16V, 0603

C13

Ceramic capacitor, 2F2/16V or polar tantalum 2F2, 1206 or tantalum-A

C14, C15

Ceramic capacitor array, 4x47100nF, 1206

C19C21

Tantalum capacitor 10F/6.3V (parts may be omitted for low-cost version of board),
tantalum-B

R1R3,
R12R13

Resistor 4K7, 0603

R5, R4, R10

Resistor 47, 0805

R6R7, R11,
R14, R22

Resistor 1K, 0603

R8R9,
R17R18,
R20R21

Resistor 100K, 0603

R15, R16

Resistor array, 4x1K, 1206

R19

Resistor 10, 0603

X1

Crystal, 11.0592MHz, HC49/4H or HC49/SMX

K1

Modular-10 socket (2x5)

K2

Sub-D-9 connector, male, European size, with solder mounting

K3

Cramp, 4 poles, metric RM5 or RM5.08

(K4, K5)

Not assembled for standard version

J1J2

Jumper

(J3)

Jumper (not assembled for standard version)

S1

Mini push-button, 6x6mm-SMD

B1B4

Distance holder (screw M3x16, nut M3, distance roll 10mm)

PCB

PCB ELMET v1.1

IC3

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

19

SBAA114

2. LAN Board.

20

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

LAN Board (continued)

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

21

SBAA114

LAN Board (continued)

22

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

Table A2. LAN Board Parts List


Reference
Designator

Qty

Description

IC1

CS8900A-CQ (5V) / TQFP100

LED1LED4

Chip-LEDS LED_CHIP / 0805


Recommended colors:
LED1: Green
LED2: Yellow
LED3, LED4: Red

C1C2,
C4C10

Ceramic capacitor, 100nF, 0603, Low-cost

C3

Ceramic capacitor, 68pF, 0603, NPO

R1

Resistor, 100, 0603

R6R9

Resistor, 1k, 0603

R2R3

Resistor, 24.9, 0603

R5, R10

Resistor, 4k7, 0603

R4

Resistor, 4k99, 0603

IND1

Ethernet transformer (see CS8900A datasheet)

X1

20MHz crystal, HC49_SMD

CON1

RJ-45 socket (shielded)

K1

2x17 connector or pin row

K2

1x8 (not assembled)

S1

Mini push-button

B1B4

Distance or PCB holder (with M3 screws)

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

23

SBAA114

Appendix B

\SRC\MSC1210\ELM_FLEX\ELMET.C

/************************************************************************
* ELEKTORMETER TOOLBOX V2.0
WICKENHAEUSER.DE
*
* MSC1210 @ 11.0592 MHz
************************************************************************/
#include <stdio.h>
#include <irq52.h>
#include <REG1210.H>
#include <ROM1210.H>
#asm
.include <REG1210.DEF>
#endasm
#include utility.h
#include elmet.h

// SFR
// ROM Routines
// SFR for ASM
// Utility functions for accessing the A/D
// special ELMET routines and constants

static near long sample;


// advaluebypass, valid if semaphore is lit
static near UTIME cnt_time={0,0,0}; // System Timer
near UTIME rtc_time;
// Global Variable
//#define AD_FILT8

// if defined, Summation is used instead of


// direct samples!

#define ONEMS 11059 // XTAL1 ms


#define DECIMATION (uint)1440 // 720: 20 Hz data rate (max. 2047)
#define RCAP2 65500 // T2: 9600 Bd
//***** Set sepecial configuration registers HCR0/1 *****
#asm
.segment _hcr,org $807E
.dc.b $FC, $FF ; HCR1,HCR0 ; Allow external Memory Access (required for LAN)
#endasm
/************************************************************************
* set_adval_bip(): Set MUX, Buffers etc.. and init a self calibration.
* Bipolar mode must be set! Note: After selfcalibration and/or MUX
* channel change the first n Samples must be discarded. Retrieve the
* values with adval.bip(). If AD_FILT8 is defined, the summation register
* will be used to average 8 samples
************************************************************************/
void set_adval_bip(unsigned char chan, unsigned char amode){
#ifdef AD_FILT8
SSCON=0;
SSCON=0xdb;
#endif
ADCON0=amode;
ADMUX=chan; // Set new MUX
ADCON1 = 0x31; // bipolar, self calibration, offset, gain, sinc3
}
/************************************************************************
* get_adval_bip(): Get one sample
************************************************************************/
long get_adval_bip(void){
unsigned long res;
EAI=0;
// Disable Auxiliary IRQ
res=sample;
EAI=1;
// ReEnable Auxiliary IRQ
return res;
}

24

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114
/************************************************************************
* get_rtc_time(): Copy static (IRQ maintained) time to uservariable
* The structure is copied by components (although uC/51 allows structure
* copy (like rtc_time=cnt_time) but for small structures this is faster:
************************************************************************/
void get_rtc_time(void){
EAI=0;
// Disable Auxiliary IRQ
rtc_time.hr=cnt_time.hr; // Copy components
rtc_time.min=cnt_time.min;
rtc_time.sec=cnt_time.sec;
EAI=1;
// ReEnable Auxiliary IRQ
}
/************************************************************************
* set_rtc_time(): Copy usertime to static (IRQ maintained) time.
* user_s time is verified, on success return 0, else time will not be set.
************************************************************************/
uchar set_rtc_time(void){
if(rtc_time.hr>23 || rtc_time.min>59 || rtc_time.sec>59) return 1; // FAIL
EAI=0;
// Disable Auxiliary IRQ
cnt_time.hr=rtc_time.hr; // Copy components
cnt_time.min=rtc_time.min;
cnt_time.sec=rtc_time.sec;
EAI=1;
// ReEnable Auxiliary IRQ
return 0; // OK
}

// We dont want to have debug info in the interrupt,


// additionaly only bank 0 is allowed
#pragma option g0 cpu51 b0
// Install a vector to the function for Timer 0
IRQ_VECTOR(aux_irq,0x33) // uC/51 special: Bind IRQ to function
/***********************************************************************
* IRQ: Auxiliary interrupt: A/DConversion and Timer
*
* If the MACRO AD_FILT8 is defined, the MSCs 8SampleAverageHardware
* Filter will be used. Thus giving an even better analog resolution...
***********************************************************************/
void aux_irq(void) interrupt{
#ifdef AD_FILT8
if(AIE & 64){ // Check ESUM
sample=summer(); // get averaged analog value
SSCON=0; // Setup new average
SSCON=0xdb;
}
#else
if(AIE & 32){ // Check EADCBit
sample=bipolar(); // get analog value directly
}
#endif
if(AIE & 128){ // Check ESECBit
#asm
mov A,SECINT // A dummy read of the SECINT clears the Interrupt
#endasm
if(++cnt_time.sec==60){ // Force Dummy read of SECINT...
cnt_time.sec=0;
if(++cnt_time.min==60){
cnt_time.min=0;
if(++cnt_time.hr==24){

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

25

SBAA114
cnt_time.hr=0;
}
}
}
}
AI=0; // Clear Aux INT (Bit in EICON)
}
#pragma option g cpu51 b0 // Restore debug info level to default
// and enable temporaries
/********************************************************************
* Because the Adr. Space 0..$7FFF is decoded for the CS8900A,
* the internal XRAM of the CPU must be mapped to >$8000 prior to
* the C startup()function (startup() expects the RAM to be found at the
* correct location, for initialisation)
**********************************************************************/
#asm
.segment ___startup_first
.export __startup_first
.export STARTUP_FIRST ; This two lines generate a global linker definition
STARTUP_FIRST=1
; if anything <>0, _startup() will the users
; call __startup_first()
__startup_first:
; as first action (see lib\lib_c\startup.c).
mov MCON,#1
; Map RAM to $8400
ret
#endasm
/***********************************************************************
* init_msc1210(): Initialize CPU 11.0592 MHz
***********************************************************************/
void init_msc1210(void){
T2CON = 0x34;
// T2 as baudrate generator
RCAP2H = (RCAP2>>8);
RCAP2L = (RCAP2&255);
SCON
= 0x50;
// Async mode 1, 8bit UART, enable rcvr, TI=0, RI=0
MSECH=(ONEMS>>8);
MSECL=(ONEMS&255);
HMSEC=99;
#ifdef USE_WD
PDCON &= ~0x04;
WDTCON=0x80;
WDTCON=0x00;
WDSERV();
#endif

// Milisecond register
// 100 Milisecondregister
// Defined from extern (see elm_flex.h)
// WD ON
// WDEnable
// initial serve Watchdog

// A/DConverter
PDCON &= 0x0f7;
//ADCON
ACLK = 11;
// ACLK = 11.0592MHz/(11+1)= 0.9216MHz
ADCON3=(DECIMATION>>8);
ADCON2=(DECIMATION&255); // ADSpeed
ADCON0 = EVREF|EBUF|GAIN_1;
// Vref on 1.25V, Buff on, BOD off, PGA 1
// Sec Timer
PDCON &= 0x0fD;
SECINT=9|128;

// System Timer ON
// Load immediatelly 1/sec

// IRQ enable (Dontt OR the AIE, else unwanted IRQs may be enabled!)
#ifdef AD_FILT8
AIE=0x80+0x40;
// Enable SEC_INT(0x80), SUMMER_INT (0x40);
#else
AIE=0x80+0x20;
// Enable A/D_INT(0x20), SEC_INT(0x80);

26

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114
#endif
EAI=1;
// Fast XRAM
CKCON=0;

// Enable Auxiliary IRQ


// NO Stretch of XRAM Access...

}
// EOF

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

27

SBAA114

Appendix C

ELM_FLEX.C

/*************************************************************************
* ELM_FLEX.C ELEKTORMETER as Webserver V1.0
*
* (C) 2004 ELEKTORVERLAG, WWW.WICKENHAEUSER.COM
*
* MSC1210 @ 11.0592 MHz
*************************************************************************/
#include <stdio.h>
#include <irq52.h>
#include <REG1210.H>
#include <ROM1210.H>

// SFR
// ROM Routines

#include utility.h
#include elmet.h

// Utility functions for accessing the A/D


// special ELMET routines and constants

// Webserver Headers
#include ..\..\flexgate\tcpip\net.h

// Basic network handling


// (public)
#include ..\..\flexgate\tcpip\web_serv.h
// Webserver
/***********************************************************************
* Declaration of he Webdata (Pages & Graphics)
**********************************************************************/
extern code uchar home[];
extern code uchar t_disp[];
extern code uchar reply[];
extern code uchar set[];
/***********************************************************************
* Declaration of Dynamic DATA and relied decls.
* Data are initialised, although not necessary, but who knows
***********************************************************************/
uint id_num=0;
uint hits_num=0;
char
char
char
char
char
char
char
char
char
char

// Numeric ID
// Numeric HitCounter

id[6]=0;
// ID Must hold strings max. 65535+\0
t_wid[6]=256;
// Width for T_DISP Bar 0..512\0
t_deg[12]=98.76;
// Temp. in Celsius xx.yy as Text
ctime[12]=11:22:33; // Time for T_DISP hh:mm:ss
hr[4]=12;
// Hrs for Setup
min[4]=34;
// Hrs for Setup
sec[4]=56;
// Hrs for Setup
ls3[2];
// The Checkboxes for the LED3+4s
ls4[2];
//
are a little bit tricky...
hits[6]=0;
// a hit_counter

/**************************************************************************
* get_temp(): Get the current temperature as int
*
* Settings are for a PT1001/3DIN Temperature Sensor and a Resistor 1.13k
* (0.01%, TK15) If calibrated to 0 Degr. C (use ICE) and 40 Degr. C (use a
* fever thermometer and warm water) The maximum deviation in the range
* 20...+50 Degr. C is smaller than +/ 0.25 Degr. C
**************************************************************************/
#define T_SUB 5456005L
// 0Point at 0 Degr. in A/DCounts
// as LONG (calc)
#define T_MUL 5.20036910E03
// Slope for 40 Degr. (calculated)
int get_temp(void){
long trel_lt;
float trel_f;

28

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114
trel_lt=get_adval_bip()T_SUB;
//
trel_f=(float)trel_lt*T_MUL;
//
// Result
return (int)trel_f;
//
//

// First: get AD Counts,


subtract 0Deg. Offset
Scale with 40 Deg.Coefficient,
is FLOAT
Cast to INT (Range 5000..+10000
for 50.00 to +100.00 Degr.

}
/************************************************************************
* M A I N
************************************************************************/
void main(void){
uint res;
uchar i;
uchar socket;
xdata uchar *pc;
int temp100;
init_msc1210();
puts(*** www.FLEXGATE.com TCP/IP __DATE__ , __TIME__ ***);
// A HTTPServer with only passive sockets requires only an IP
// address
COMPOSE_IP(my_ip,192,168,1,156);
if(Init_net()) puts(<NET FAILURE>);// Init Variables,
// Counter, ...
printf(My MAC: %02x:%02x:%02x:%02x:%02x:%02x\n, my_mac[0],my_mac[1],
my_mac[2],my_mac[3],my_mac[4],my_mac[5]);
printf(My IP: %u.%u.%u.%u\n,my_ip.bytes[0],my_ip.bytes[1],
my_ip.bytes[2],my_ip.bytes[3]);
puts(*** MINIWEBSERVER Elektors ElmFlex ***);
// Enable ALL (or less) Sockets as General Server HTTP at port 80
for(i=0;i<MAX_SOCK;i++) SOCKET_SETUP(i,SOCKET_TCP,80,
FLAG_PASSIVE_OPEN);
// Initialise A/D at last...
set_adval_bip(0x78,EVREF|EBUF|VREFH|GAIN_8); // Vref on 2.5V,
// Buff On,
// BOD off, PGA 1
// * Now Net is ready to start *
for(;;){
// ENOUGH TIME IN THIS LOOP FOR OTHER JOBS...
WDSERV();
// Serve Watchdog about every 3 seconds! (see elmet.h)
res=poll_webserver();
if((res&0xFF00) ==EVENT_HTTP_REQUEST){
socket=(uchar)res;
pc=webpage_name(); // get name of requested page
printf(Request %s\n,pc);// Show requested page
// (for Debug)
switch(*pc){
case r:
id_num++;
// Increment ID
sprintf(id,%u,id_num);
for(;;){
// ReplyPage: Parse Arguments
i=url_getarg_no();
if(!i) break;
pc=url_getarg_str();

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

29

SBAA114
printf(Arg A%u: %s\n,i,pc);
// Opt. Show Args...
// (Enable for Debug)
switch(i){
case 1:
rtc_time.hr=(uchar)atoi(pc);
break;
case 2:
rtc_time.min=(uchar)atoi(pc);
break;
case 3:
rtc_time.sec=(uchar)atoi(pc);
set_rtc_time();
break;
case 4:// Hidden Argument comes first...
LED3=1;
// OFF
LED4=1;
// OFF
ls3[0]=0;
// Empty String
ls4[0]=0;
// Empty String
break;
case 5:
ls3[0]=d; // d gives checked
LED3=0;
// ON
break;
case 6:
ls4[0]=d; // d gives checked
LED4=0;
// ON
break;
}
// ignore other Args...
}
webpage_bind(socket,reply);
break;
case s:
sprintf(id,%u,id_num);
get_rtc_time();
sprintf(hr,%02u,rtc_time.hr);
sprintf(min,%02u,rtc_time.min);
sprintf(sec,%02u,rtc_time.sec);
webpage_bind(socket,set);
break;
case t:
sprintf(id,%u,id_num);
get_rtc_time();
sprintf(ctime,%02u:%02u:%02u,rtc_time.hr, rtc_time.min,
rtc_time.sec);
temp100=get_temp();
sprintf(t_deg,%d.%02u,temp100/100,((uint)temp100)%100);
if(temp100<1000) temp100=1000;
else if(temp100>3499) temp100=3499;
sprintf(t_wid,%u,(temp1001000)/5);//0..500: FullScale
webpage_bind(socket,t_disp);
break;
default:
sprintf(hits,%u,++hits_num);
sprintf(id,%u,id_num);
webpage_bind(socket,home);
}

30

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

SBAA114

}else if(res==EVENT_SOCKET_IDLETIMER){
RED_LED^=1; // *** BLINK LED ***
}
} // for(;;)
}
// EOF

Building a Complete Webserver on the MSC121x Using FlexGateE Technology

31

IMPORTANT NOTICE
Texas Instruments Incorporated and its subsidiaries (TI) reserve the right to make corrections, modifications,
enhancements, improvements, and other changes to its products and services at any time and to discontinue
any product or service without notice. Customers should obtain the latest relevant information before placing
orders and should verify that such information is current and complete. All products are sold subject to TIs terms
and conditions of sale supplied at the time of order acknowledgment.
TI warrants performance of its hardware products to the specifications applicable at the time of sale in
accordance with TIs standard warranty. Testing and other quality control techniques are used to the extent TI
deems necessary to support this warranty. Except where mandated by government requirements, testing of all
parameters of each product is not necessarily performed.
TI assumes no liability for applications assistance or customer product design. Customers are responsible for
their products and applications using TI components. To minimize the risks associated with customer products
and applications, customers should provide adequate design and operating safeguards.
TI does not warrant or represent that any license, either express or implied, is granted under any TI patent right,
copyright, mask work right, or other TI intellectual property right relating to any combination, machine, or process
in which TI products or services are used. Information published by TI regarding third-party products or services
does not constitute a license from TI to use such products or services or a warranty or endorsement thereof.
Use of such information may require a license from a third party under the patents or other intellectual property
of the third party, or a license from TI under the patents or other intellectual property of TI.
Reproduction of information in TI data books or data sheets is permissible only if reproduction is without
alteration and is accompanied by all associated warranties, conditions, limitations, and notices. Reproduction
of this information with alteration is an unfair and deceptive business practice. TI is not responsible or liable for
such altered documentation.
Resale of TI products or services with statements different from or beyond the parameters stated by TI for that
product or service voids all express and any implied warranties for the associated TI product or service and
is an unfair and deceptive business practice. TI is not responsible or liable for any such statements.
Following are URLs where you can obtain information on other Texas Instruments products and application
solutions:
Products

Applications

Amplifiers

amplifier.ti.com

Audio

www.ti.com/audio

Data Converters

dataconverter.ti.com

Automotive

www.ti.com/automotive

DSP

dsp.ti.com

Broadband

www.ti.com/broadband

Interface

interface.ti.com

Digital Control

www.ti.com/digitalcontrol

Logic

logic.ti.com

Military

www.ti.com/military

Power Mgmt

power.ti.com

Optical Networking

www.ti.com/opticalnetwork

Microcontrollers

microcontroller.ti.com

Security

www.ti.com/security

Telephony

www.ti.com/telephony

Video & Imaging

www.ti.com/video

Wireless

www.ti.com/wireless

Mailing Address:

Texas Instruments
Post Office Box 655303 Dallas, Texas 75265
Copyright 2004, Texas Instruments Incorporated

Das könnte Ihnen auch gefallen