显示标签为“W7100A”的博文。显示所有博文
显示标签为“W7100A”的博文。显示所有博文

2012年10月29日星期一

如何使用網路單片機W7100A實現TCP通信?

今天给大家介绍的是以太网控制网络单片机W7100A的应用笔记之如何实现TCP通信。

TCP(传输控制协议)是用于控制网络间数据通信的协议。作为组成互联网的主要协议之一,更多的详细内容已经写入IETF(互联网工程任务组)的RFC 793中。TCP是运行于IP层上的协议,它保证了数据的有效传输并且可以按照数据的发送顺序依次进行接收。

因为W7100A单片机支持传输层的TCP协议,所以用户不需要做任何整合就可以直接使用TCP/IP协议。

下面一一给大家做阐述。

1 TCP SOCKET

用户可以在W7100A提供的所有8个SOCKET中使用TCP协议,但是必须首先创建要使用的SOCKET。在创建SOCKET时,需要用到SOCKET号、协议、端口号以及标志位。这篇文档将会介绍什么是TCP协议,以及在使用TCP协议时如何将Sn_MR(TCPIP核心中的SOCKET n模式寄存器)设置为Sn_MR_TCP(0×01)。SOCKET号表示用户可以选择从0到7这8个SOCKET中的任意一个使用。端口号表示TCP协议下用户指定使用的端口。如果上面需要的这些都已经设定好,那么socket()函数就可以自行分配创建一个SOCKET。


由于W7100A单片机的TCP协议支持服务器模式和客户端模式,用户可以任意选择一个模式实现此应用。服务器模式和客户端模式的不同见下图:


          <图1.1> TCP 服务器和TCP 客户端

如图1.1所示,TCP服务器模式和客户端模式的过程大致相同。唯一的区别在于打开SOCKET之后,SOCKET状态是监听还是连接。当TCP协议在服务器模式下运行时,服务器处于监听状态等待来自客户端的连接请求。如果TCP协议运行于客户端模式下,客户端将会在连接状态下请求连接服务器。一旦成功建立连接,SOCKET的状态将会变成建立(SOCK_ESTABLISHED,0×17)。SOCKET在点对点建立连接之后仍然可以保持连接状态,从而进行数据交换直到SOCKET关闭。
服务器模式下的SOCKET循环周期是由打开、监听、发送、接收、断开和关闭组成。客户端模式的SOCKET循环周期则是由打开、连接、发送、接收、断开和关闭组成。


1.1 打开(OPEN) 

无论是在服务器模式或是客户端模式下,在创建SOCKET时第一步都是打开SOCKET。利用SOCKET()函数设置SOCKET号、协议、端口号以及标志位来创建一个SOCKETn(取第n-1个SOCKET值)。由于使用的是TCP协议,需要将协议设置为Sn_MR_TCP(0×01)。而端口号的设置则取决于是在服务器模式还是客户端模式下。如果是在服务器模式下,服务器会根据当前用户所使用的端口来设置源端口号。但是如果是在客户端模式下,因为目的端口号正在被使用,最好随机选择一个端口号,并每次增加一个数字,直到SOCKET被连接为止。TCP协议的标志位表示‘无延时确认标志位’,一般来说,将该位设置为0。更多关于协议类型、标志位等信息,将会在‘TCPIPCore.h’文件下的‘Sn_MR value’中介绍。
在所有的设置完成之后,通过检查Sn_SR(n)寄存器来查看SOCKETn的状态是否变成SOCK_INIT(0×13)。用户可以通过getSn_SR(SOCKETn)函数来完成Sn_SR(N)寄存器的检查过程。如果SOCKET的状态为SOCK_INIT(0×13),表示SOCKET创建成功;如果没有成功,用户需要重新创建SOCKET。

                             例1.1 打开SOCKET


1.2 监听(LISTEN)
监听过程只能在服务器模式下使用。在SOCKETn创建完成后,为了能与客户端连接,需要将SOCKET的状态从SOCK_INIT(0×13)变成监听。用户可以直接将Sn_CR(n)寄存器设置为Sn_CR_LISTEN(0×02)或者可以直接使用’SOCKET.c’文件中的LISTEN()函数。在变成监听状态之后,SOCKET将会改变为SOCK_LISTEN(0×14)。然后,SOCKET等待客户端发出连接请求。一旦与客户端建立连接,SOCKET的状态将会重新变成SOCK_ESTABLISHED(0×17)。此时,便可以与客户端之间进行数据传输。

                           例 1.2 设置监听状态

1.3 连接(CONNECT)
连接过程发生在客户端模式连接到服务器时。在连接SOCKET时需要用到SOCKET号、目的IP以及目的端口号这些参数。用户可以通过CONNECT()函数进行设置;一旦成功建立连接,SOCKET的状态将会变成SOCK_ESTABLISHED(0×17)。

                           例 1.3 设置连接状态

1.4 发送(SEND)
在使用TCP协议时,与对端的连接在发送数据前就已经完成。用户可以通过SEND()函数查看设置的SOCKET号、将要发送数据的地址、数据的大小等参数。将要发送的数据的地址通常由选择的区域确定,输入数据,并且通过指针设定区域。

                             例1.4 发送数据

1.5 接收(RECEIVE)
接收过程和发送过程基本相同,唯一不同的是接收(RECEIVE)过程需要检查的是Sn_RX_RSR(n)。接收过程是指将来自接收缓存器的数据移动到用户数据存储区。因此,用户必须在接收之前检查Sn_RX_RSR(n)的值是否大于0。如果大于0,表示数据已经保存在接收缓存器中。用户必须通过getSn_RX_RSR(n)函数在此过程之前确认数据是否被接收。

                            例1.5 接收数据

1.6 断开(DISCONNECT)

关闭SOCKET的方法通常有两种:第一种方法是通过DISCONNECT(n)函数。DISCONNECT(n)函数不能用来直接关闭SOCKET。它先向对端发送断开连接请求(FIN数据包),然后等待回复信息(FIN/ACK数据包),之后才能将SOCKET的状态变成SOCK_CLOSED(0×00),最后关闭SOCKET。当收到断开连接请求时,W7100A发送一个FIN/ACK数据包表示允许对端关闭SOCKET。如果在发送断开连接请求之后没有收到对端的回复,将会发生TCP超时,SOCKET的状态将会变成SOCKET_CLOSED(0×00)。当用户需要断开连接时,通过DISCONNECT()函数,选择合适的SOCKET号,然后发送断开连接请求。


                           例1.6 设置断开连接

1.7 关闭(CLOSE)

和断开的过程不同,关闭过程可以直接将SOCKET变成SOCK_CLOSED(0×00)。用户通过
CLOSE(n)函数选择合适的端口号,然后无论对端有没有做出响应都将关闭SOCKET。如果RST数据包来自对端,SOCKET将会无条件变成SOCK_CLOSED(0×00)。一旦SOCKET变成为SOCK_CLOSED(0X00), SOCKET将不再可用除非重新打开它。


                             例1.7 设置关闭


2 TCP回路测试(LOOPBACK)

2.1 服务器模式 

TCP回路测试可以通过回送来自于对端的数据从而检测TCP协议的性能。这一章节将会介绍服务器模式下回路测试的例子。程序范例如下:

                     例2.1 设置回路测试(LOOPBACK)服务器
如上面的例子所示,在SOCKET循环周期内除了connect()函数,其他所有函数都可以使用。首先利用getSn_SR(s)函数检测SOCKET状态,在W7100A复位后,所有的SOCKET全都变成SOCK_CLOSED(0×00)状态。然后利用close()函数完全关闭SOCKET,再通过socket(s,Sn_MR_TCP,port,0×00)函数来创建一个新的SOCKET。如果SOCKET创建成功,状态将会变成SOCK_INIT,再通过listen(s)函数将SOCKET的状态变成监听。一旦与对端建立连接,SOCKET的状态将变成SOCK_ESTABLISHED,并且等待数据。所有接收到的数据都保存在接收缓存器中,recv(s,data_buf,len)函数中的data_buf变量定义为接收到的数据的长度。最后再通过send(s,data,len)函数将数据回送到客户端。客户端会比较数据交换前后的差异来检测数据通信是否正常。


2.2 客户端模式
本章节将会介绍客户端模式下回路测试的例子。程序范例如下:


                        例2.2 设置回路测试(LOOPBACK)客户端
TCP客户端的程序例子和TCP服务器的例子基本相同。唯一的区别在于SOCK_INIT状态下,是通过connect()函数而不是listen()函数与服务器连接。

3 回路测试服务器演示
这一章将会介绍TCP回路测试程序运行的例子。在下载完成TCP回路测试应用的二进制文件后,运行iMCUW7100单片机内的数据包实现回路测试的演示过程。更多的详细信息,请参阅文档‘如何在W7100A中创建工程’,‘WizISP程序指南’以及‘W7100A Debugger指南’。
对TCP串行回路,用户按照下面的步骤进行设定:
● 确认测试环境。请参考‘iMCU7100EVB用户指南’
直接利用UTP线连接PC机与iMCU7100EVB
直接利用串口线连接PC机与iMCU7100EVB
使能iMCU7100EVB的5V电源适配器
● 添加下面测试PC机的网络信息
- IP地址 : 192.168.1.xxx (‘xxx’ 为用户PC机的IP地址,在客户端模式下此IP地址 也是服务器的IP地址,即我们之前在TCP客户端代码中设置在destip[4]的IP地址)。 在本文档中,IP设置为192.168.1.69,但是用户可以进行修改。
- 网关IP地址 : 192.168.1.1
- 子网掩码 : 255.255.255.0
● 运行超级终端机程序以及AX1程序

3.1 超级终端机程序

          <图3.1> 超级终端机程序选项
在超级终端机程序行完成之后,如图4.1设置串行通信的选项。超级终端机程序将会显示串行通信时iMCU7100EVB的运行状态。


3.2 AX1 设置
想了解更多关于AX1程序的信息,请参考AX1用户手册。

3.2.1 TCP服务器模式下的iMCU7100EVB
当iMCU7100EVB运行于服务器模式时,PC作为TCP客户端利用AX1程序连接到iMCU7100EVB。在AX1程序中,选择TCP => CONNECT 菜单来实现与iMCU7100EVB的连接,此时对端的IP地址为192.168.1.2,端口号为5000。
一旦连接成功,如图4.2选择TCP => SEND 菜单发送数据。因为此时iMCU7100EVB作为服务器,AX1程序窗口将会显示客户端的状态。

                      <图3.2> AX1 发送数据

3.2.2 TCP客户端模式下的iMCU7100EVB

当iMCUW7100EVB运行于客户端模式下时,PC机作为TCP服务器使用AX1程序将iMCU7100EVB连接到服务器端口。如果在AX1程序中打开的服务器端口号是5000(监听状态),iMCU7100EVB将会连接到服务器IP地址以及服务器端口(192.168.1.xxx,5000)。需要注意的是IP地址必须是打开AX1程序的PC机上的IP地址。
一旦连接成功,选择TCP =>SEND菜单, 然后发送数据,如图4.2。因为iMCU7100EVB作为客户端,AX1程序窗口将会显示服务器的状态。

                     <图3.3> AX1监听

3.3 TCP回路测试结果 

3.3.1 TCP服务器结果

在设置完成TCP服务器之后,点击TCP发送。然后AX1程序将会显示PC机客户端的处理进程。如图4.4所示,图中显示了发送/接收的数据大小,而超级终端机程序将会显示iMCU7100EVB服务器的处理情况。

                            <图3.4> TCP服务器的结果

3.3.2 TCP客户端结果
在TCP客户端所有的设置完成后,点击TCP发送。AX1将会显示PC机服务器的处理情况。如图4.5所示,图中显示了发送/接收数据的大小,而超级终端机程序将会显示iMCU7100EVB客户端的处理情况。

                     <图3.5> TCP客户端结果




更多参考资料请访问官网,有任何问题请随时联系我们。谢谢阅读!

2012年10月17日星期三

教你如何使用網路單片機W7100A實現UDP通信

今天给大家介绍如何用网络单片机W7100A实现UDP通信。iMCU W7100A 是一款单片式以太网控制芯片,内嵌8051单片机、硬件 TCP/IP协议栈,以及10/100 高速以太网络MAC/PHY。

UDP提供不可靠、无连接的数据报文传输,它在没有建立连接时仍然能够处理数据。这样,可能会造成UDP信息的丢失、重叠或者改变。当数据包以高速方式传输时,接收端无法处理所有的数据。在这种情况下,用户必须考虑UDP是否符合自己的应用需求。由于UDP能够广播数据包,所以它通常用在多播系统下。

1. UDP SOCKET

用户可以使用W7100A所支持的8个socket作为UDP通信中的协议。但是,首先必须创建SOCKET。在创建SOCKET时需要用到socket号、使用的协议、使用的端口号以及设定的标志位。因为UDP协议是由Sn_MR_UDP(0×02)寄存器设定的(后面将会介绍)。Socket号则是由用户自己确定,可以选择W7100中0到7这8个socket中的任意一个或者全部8个socket。除此,用户也可以指定UDP协议中要使用的端口号。在打开UDP socket时,通过WIZnet提供的SOCKET()函数,来完成上面提到的各项参数的设定。

1.1 网络初始化

W7100A单片机的网路配置需要用到IP地址、网关、子网掩码以及MAC地址。网络参数的处理如图2.2.1所示。除此以外,还需要设置每一个socket的TX/RX缓存器以及其它寄存器的大小。

                       <图2.1> 设定网络配置

1.2 打开(OPEN)

由于UDP不需要建立连接就可以进行通信,可以通过调用socket()函数轻松创建UDP
socket。如图2.2.2所示为创建UDP socket的例程。

                     <图2.2> UDP socket的创建

1.3 接收(RECEIVE)

图2.2.3显示了数据的接收过程。在接收数据之前,用户可以通过检查Sn_RX_RSR来确定要接收的数据的长度。一旦有数据被接收到,用户便可以利用recvfrom()函数来执行接收过程。

                          <图2.3> 接收数据

1.4 发送(SEND)

在发送UDP数据报文之前,用户必须设置目的地IP地址和端口;一旦设置完成,用户再通过sendto()函数将UDP数据报文送出。

                            <图2.4>发送UDP数据

2. UDP回路测试程序

这一章节将会介绍如何利用第二章中的函数来实现UDP回路测试。UDP回路测试程序是一种编码,它可以将从对端接收到的数据准确无误的发送回去。
下面就是UDP串行回路测试程序的例子:

                     <图3.1> UDP回路测试程序

后面将会介绍UDP回路测试程序的代码示例。首先,设置IP或端口等网络信息,然后打开Sn_SR寄存器。Sn_SR在UDP模式下存在两种状态:一种是SOCK_UDP, 此时UDP socket已经成功打开并且可以进行UDP通信。在此状态下,在接收到UDP数据后,通过recfrom()函数和sento()函数再将数据回送。另一种状态是SOCK_CLOSED,UDP在这种状态下是未被打开的,必须先通过close()函数关闭socket,之后重新调用socket()函数打开socket。


3. UDP回路测试演示

在这一章节,将会用具体的示例代码程序来演示UDP回路测试。首先,下载UDP回路测试程序的应用文件到iMUCW7100EVB开发板,执行该程序确认iMCUW7100EVB是否可以正常进行回路测试。更多的详细信息,请参阅文档‘如何在W7100中建立工程(project)’,‘WizISP程序指南’以及‘W7100A Debugger指南’。

对于UDP回路测试程序,用户可以按照下面的步骤操作:

l 确认测试环境。详细信息,请参阅文档‘iMCUW7100EVB用户指南’。
用UTP线连接PC测试机和iMCUW7100EVB
用串行线连接PC测试机和iMCUW7100EVB
连接5V电源适配器到iMCUW7100EVB,并打开电源

l 确认测试PC机的网络信息:
源IP地址 : 192.168.1.2
网关IP地址: 192.168.1.1
子网掩码: 255.255.255.0

l 运行超级终端机程序和AX1程序


3.1 超级终端机

                 <图4.1> 超级终端机选项

运行超级终端机,如图4.1所示,设置串行通信选项,超级终端机程序将会然后通过串行通信显示iMCU7100EVB开发板的状态。

3.2 AX1程序

                   <图4.2> AX1设置为UDP通信

运行AX1程序,然后将AX1程序设置为UDP通信方式,如上图4.2所示。关于AX1程序设置的更多详细信息请参考AX1用户手册。如果要想使用UDP发送,请选择菜单栏中的UDP => SEND,然后点击OK按钮,AX1程序将会显示客户端PC机的状态。

3.3 UDP回路测试程序演示

在所有的设置完成后,点击UDP发送按钮。AX1将会显示PC机的进程,如图4.3中显示了发送/接收数据的大小,同时如图4.4超级终端机程序将会显示服务器iMCU7100EVB的处理进程。


                    <图4.3>使用UDP发送临时数据



            <图4.4> 超级终端机程序窗口



2012年10月12日星期五

如何實現用代碼操作網路單片機W7100A的代碼快閃記憶體


 

iMCU W7100A 是一款單片式乙太網控制晶片,內嵌8051單片機、硬體 TCP/IP協定棧,以及10/100高速乙太網路MAC/PHY

W7100A的內部記憶體由兩部分組成:程式記憶體和資料記憶體。

程序記憶體又由啟動ROM和代碼快閃記憶體組成。啟動ROM的地址範圍從0×00000x07FF,啟動ROM中含有ISP函數以及W7100A內嵌的其它必需 的代碼程式。代碼快閃記憶體的位址範圍從0×00000xFFFF,它位於另外一個不同的記憶體空間內並且和啟動ROM共用部分位址範圍以節省使用者的應用代 碼。更多關於W7100A記憶體組成的詳細資訊請參考中文主頁中的 ‘W7100資料手冊



                               圖1.1 代碼快閃記憶體更新過程

如圖1.1在用戶應用代碼執行過程中允許修改或者更新64kbyte的程式快閃記憶體,這樣使用者可以在程式運行時更新固件。本篇文檔將會介紹如何讀取、寫入以及擦除代碼快閃記憶體。

下面是用來控制代碼快閃記憶體的函數,將會在下面部分詳細介紹。



                  表1.1 代码闪存存取函数


2012年9月27日星期四

【FINAL】單片式乙太網控制晶片W7100A / W7100 Debugger指南(三)



繼續給大家介紹單片式乙太網控制晶片——W7100A / W7100 Debugger指南 最後一個部分。

第二部分可參考:W7100A /W7100 Debugger指南(二)

前兩篇講到驅動程式安裝、連接Debugger、如何安裝W7100A / W7100 DebuggerDebugger功能表,最後部分是搜索和變數視窗及記憶體視窗的介紹,希望對大家有幫助!

同樣,先來簡單介紹下W7100W7100A的基本特點。網 絡微處理器W7100提供一體成型嵌入式網路方案(內嵌8051單片機 + TCP/IP協議棧+ 10/100 高速乙太網路MAC/PHY)。而W7100A(100Pin封裝) 100 % 相容 W7100W7100A W7100 升級版,增加了一些新功能,詳細可登錄官網查看。



———————————————————————————————————————————


6. 搜索和变量窗口

W7100A / W7100 Debugger程序提供变量窗口可以查看本地变量、全局变量和寄存器的值。



6.1 搜索窗口(Search Window)

搜索窗口根据用户的登记来显示全局变量、本地变量或者存储器的值。全局/本地变量窗口也显示变量的值。但是通常用户如果想要查看一个或者两个变量的值并且有时会同时想要查看全局和本地变量的值时只需要在搜索窗口中登记这些值。




为了能够登记全局/本地变量,在搜索窗口的Name区域写下寄存器名称。

在搜索窗口,用户不仅可以确认变量的值同时可以进行修改。点击搜索窗口的值区域写入值就可以修改变量的值。

为了能够查看搜索窗口中存储器的值,以‘存储器类型:地址:大小’的格式写入。存储器的类型是C、D和X(代码存储器、内部数据存储器和外部数据存储器)。

Ex) 代码存储器 => C:0×1000:5
内部存储器 => D:0×30:2
外部存储器 => E:0×000300:4



用户可以通过点击鼠标右键在搜索、本地和全局窗口中选择显示格式,如二进制、十进制、八进制和十六进制。



6.2 本地变量窗口(Local Variable Window)

本地变量窗口显示在PC处的函数的本地变量值。


本地变量窗口与搜索窗口具有几乎相同的界面。但是,它不允许登记一个新的变量或者存储器地址。



6.3 全局变量窗口(Global Variable Window)

全局变量窗口显示工程中的所有全局变量。全局变量窗口具有和本地变量窗口相同的界面。




6.4 符号窗口(Symbol window)

符号窗口显示工程中的所有符号信息。它显示类(Class)类型和相关符号的地址。




6.5 寄存器窗口(Register window)

在寄存器窗口中,用户可以验证或者修改寄存器的值。寄存器窗口显示默认寄存器、
PSW和特殊函数寄存器(SFR)。点击寄存器值区域写入新的值就可以修改寄存器的值。如果寄存器是只读的,值将不会变化。


 

7. 存储器窗口(Memory window)

注意: 要读取iMCU7100EVB存储器的值,首先应该打开一个Keil工程或者HEX文件。





7.1 Idata存储器窗口(Idata Memory Window)

Idata存储器窗口能够显示或者修改内部数据存储器的值(D:0×00 ~ D:0xFF)。



想要修改内部数据存储器的值,点击内部数据存储器的值区域并且写入新的值。所有的存储器窗口可以变成显示格式,例如2/4/8字节显示单元或者CHAR/INT/LONG显示格式。如图7.3所示。



如果内部数据存储器的值更新并且Debugger命令处于停止状态,它将内部数据存储器的值更新到iMCU7100API开发板。



7.2 外部数据存储器窗口(External Data Memory Window)

外部数据存储器窗口显示外部数据存储器的值(X:0×000000 ~ X:0xFFFFFF).





7.3 程序存储器窗口(Code Memory Window)

程序存储器窗口显示代码存储器的值(0xFF0000 ~ 0xFFFFFF)。该窗口只能可读,所以不能对它修改。





7.4 闪存窗口(Flash Memory Window)

7.4.1 程序存储器域(Code Memory Domain)

在闪存窗口中,如果没有选中’Data memory’选项,它将会显示程序存储器的值(0xFF0000 ~ 0xFFFFFF)。基本上它和‘程序存储器窗口’相同,但是它能够利用闪存写入按钮来修改值。



7.4.2 数据存储器域(Data Memory Domain)



——————————————————————————————————————————————


單片式乙太網控制晶片——W7100A / W7100 Debugger指南已經全部介紹完畢了,謝謝閱讀!
 
明天開始我要實施我的短期旅行計畫了,因此要暫別大家一段時間。我們回來再見吧!! See you!! ^@^