2012年8月17日星期五

什麼是API函數以及如何使用W7100A進行初始化(TCPIPCore)?(二)

在昨天的博文里,我们介绍了API函数以及TCPIPCore初始化的部分内容,接下来,继续为大家介绍第二部分的内容,希望对大家有所帮助。




4.2 TCPIPCore初始化
TCPIPCore初始化用来设置最基本的网络配置信息,这些配置信息都是在网络通信中需要用到的,例如MAC地址、IP地址、子网掩码、网关等等。同时,也要分配TX和RX缓存器的大小。如果这些初始化程序不能正确地执行,通信就会失败。
下面的代码是TCPIPCORE初始化的一个例子。
4.2.1设置网关、子网掩码、IP地址、MAC地址
介质访问控制地址(MAC地址)、网关地址、子网掩膜地址以及IP地址的设置将会在后面的内容中提到。
4.2.2头(Header)文件/寄存器
-GAR0:网关IP地址寄存器。偏移地址为0x0001。
-SUBR0: 子网掩码地址寄存器. 偏移地址为0x0005。
-SHAR0: 本地MAC地址寄存器.偏移地址为0x0009。
-SIPR0: IP地址寄存器. 偏移地址为0x000F。
4.2.4设置TX/RX缓存器的大小
可以通过set_MEMsize()函数为每一个通道分别设置内部TX、RX缓存器的大小。每一个TX和RX存储器可设定的最大值都是16K字节。在8个端口内,可以自由将存储器空间的大小配置为1KB、2KB、4KB和8KB。如果用户将一个16K字节的存储器全部分配给一个已经建立连接的端口,其它的端口将没有可用的存储空间来收发数据。
5.函数描述
‘wizmemcy.c’函数会在’tcpipcore.c’下被IINCHIP_READ_BUF()和IINCHIP_WRITE_BUF()函数调用。并且当这一函数执行的时候,不允许发生中断。同时需要注意的是,例如fsrc,fdst以及len等这些参数需要根据不同的编译器来分配不同的值。所以,用户必须认真设定这些值。DPX0和DPX1用来快速复制存储器的信息。当使用INCHIP_WRITE_BUF()函数时, DPX0指示内部的存储器域,域值大小为0x00。DPX1也指示了存储器的域,但是这些域被指定给TCPIPCore,并且域值为0xFE。但是当调用IINCHIP_READ_BUF()函数时,正好相反,DPX0指示被指定给TCPIPCORE的域,域值大小为0xFE;DPX1指示了内部的存储器域,域值大小为0x00。因为这个函数是在启动ROM区域的0x0000 ~ 0x07FF用ISP代码中被定义的,wizmemcpy代码位置不是在0x0000 ~ 0x07FF中。否则,当存储器映射转换进程时,用户代码就不能从ISP路径返回到程序存储区域。如果想了解更多关于ISP代码,请参考“How to program Flash memory”.
5.3 tcpipcore.c
iinchip_irq(): 当发生TCPIPCore中断时,MCU将会执行iinchip_irq()函数。在中断模式下,用变量’I_STATUS’来节省中断标志位。如果‘__DEF_IINCHIP_INT__’未被定义的话,将不能执行iinchip_irq()函数。
--IINCHIP_WRITE_BUF(): 这个函数被send()以及sendto()函数调用。它可以计算实际的物理地址,并且将数据写入到TX存储缓存器中。在计算实际的物理地址时,首先计算出dst_mak和评定dst_ptr的值。如果dst_mak的值和数据的字节数相加之和比SSIZE(s)大的话,也就是要写入的数据大小超出TX存储器的范围,则需要将TX存储器范围内的数据复制到内存中,同时复制TX存储器的基地址所对应的剩余数据。用wizmemcpy()函数来复制数据。但是由于一些特定的编译器会造成wizmemcpy函数内参数的字节顺序的变化,所以必须根据相应的编译器来改变。在基本的驱动器中wizmemcpy字节顺序跟Keil编译器相匹配。
--IINCHIP_READ_BUF():这个函数被recv()和recvfrom()函数调用。它可以计算实际的物理地址,然后从RX存储器中读取数据。在计算实际的物理地址时,首先要计算src_mask和评定src_ptr的值。如果src_mask的值和数据字节数相加之和比RSIZE(s)大的话,也就是说要读取的数据大小超出了RX存储器的范围,则要将RX存储器范围内的数据复制到内存中,同时复制RX存储器的基地址所对应的剩余的数据。

这是本文的第二部分内容,剩余部分我将在以后的博文介绍。
更多有关W7100A产品信息,可参考我写的以下博文:
感兴趣的朋友也可以在博客主页观看我们的 WIZnet相关视频栏目。
更多相关产品信息请参考WIZnet中文网站及官方博客:
 


没有评论:

发表评论