1 硬件结构和电路设计
1.1 总体设计
整个系统设计采用atmel公司8位通用微控制器at89c51作为主处理器,驱动realtek公司的10m以太网控制芯片rtl8019as,实现串口数据和外部网络互连。
1.2 网卡接线设计
rtl8019as为100管脚pqfp封装,工作电压5v。其接线原理图如图1所示。地址sa0-4接到单片机p2的低五位上;sa8和sa9接电源;其余sa5-7,sa10-19这13个管脚全部接地;iorb和iowb分别接单片机的读写信号端;rstdrv接到p1.2上;8位数据sd0-7按顺序接到单片机p0.020.7脚;tpout+和ptout-是发送管脚对,连接到rj45口的发送脚1和2;而tpin+和tpin-则是接收管脚对,连接到rj45口的接收脚3和6;管脚x1和x2之间接20m的晶振及接地电容;led0和led1分别串接发光二极管和1k8电阻,连到5v电源上;iocs16b管脚串接27k8电阻接地;管脚bd0-3(ios0-3)是负责定义基地址位置的,全部悬空,作为0输入。
led0默认表示通信冲突col,led1表示接收数据包。发送对和接收对不能直接接到rj45插头上,要通过隔离电压模块(选用20f-01)和rj45相连。网卡有16bit数据线,可以使用16bit或8bit模式传送数据,使iocs16b管脚为低,我们选中的是8bit模式。
1.3 串行接口部分
1串口部分采用max232和9针串口。单片机p3.0/rxd0和p3.0/rxd0通过max232芯片分别接到串口的2针和3针上。串口5针接地。
串行口选择工作方式1,这时的波特率计算公式为:
串口在9600波特率时,晶振选用11.0592m,预设值算得0xfd,smod=0;晶振选用16mhz,预设值为0xf7,smod=1。
2 网卡的初始化和工作过程
2.1 网卡芯片rtl8019as的控制方法
控制网卡芯片rtl8019as是通过读写芯片上的32个字节的控制寄存器组实现的。另外该芯片含有16kbyte的ram,地址为0x400020x7fff。这些ram不能通过单片机直接寻址,必须通过32个字节的控制寄存器组,以dma方式读写它们。
32个字节的控制寄存器组可以由单片机直接寻址,但其基地址是通过管脚bd0-3(ios0-3)配置的。电路中将四个管脚全部悬空,全0输入,产品资料说明其基地址为300h。
这32个字节的控制寄存器组分成4页,00h寄存器称为commandregister(cr),cr的最高两位代表目前寄存器处于哪一页。01h到0fh在不同的页有不同的意义,同时,即使同一页,读和写代表的意义也可能不同,这一点很值得注意。10h217h是远程dma端口,而18h-1fh是网卡复位端口。
2.2 dma数据通道
rtl8019as内部划分为远程dma(remotedma)通道和本地dma(localdma)通道两个部分。本地dma完成控制器与网线的数据交换,远程dma完成主处理器与网卡数据交换。单片机主处理器收发数据只需对远程dma操作。接收数据时,rtl8019as接收到的数据通过mac比较、crc校验后,由fifo存到接收缓冲区,收满一帧后,以中断或寄存器标志的方式通知主处理器,主处理器通过远程dma通道将其读出。当主处理器要向以太网发送数据时,先将一帧数据通过远程dma通道送到rtl8019as中的发送缓存区,然后发出传送命令;rtl8019as在完成了上一帧的发送后,再完成此帧的发送。
所谓的dma就是直接内存访问(directmem2oryaccess)。普通的寻址方式是给出一个地址,然后取出对应的值。而在dma方式下,我们指定一个寄存器地址,主机只要反复地读取或写入这个地址,就可以取出或写入大量的数据。网卡指定的远程dma端口就是这个用途。设置好起始地址和读出的byte数后,我们反复读远程dma端口,就可以将网卡里从网线收到的数据包,从0x400020x7fff的ram区读出;反之,同样设置好起始地址和写入的byte数后,我们反复写远程dma端口,就可以将数据发送到网卡的发送缓冲ram中,然后发出发送的命令,就可以把数据包发送到网线中。
2.3 网卡的初始化过程
复位,使rstdrv先高后低,注意每一步都要有100ms的延时,以确保复位成功。然后进行热复位,就是先后读、写网卡复位端口。
使cr=0x21,停止芯片运行,选择页面0。
使rbcr1=0;rbcr0=0,将远程dma操作的传输字节数清零。
使pstart=0x46;pstop=0x80;bnry=0x46,设置接收开始页面、结束页面和边界页面。
使imr=0x0,清除中断屏蔽寄存器。
使rcr=0x08+0x04,设置接收配置寄存器,允许接收多址和广播报文。
使tcr=0,设置发送配置寄存器,使用默认配置。
使dcr=0x80+0x40+0x00,设置数据配置寄存器,选择字节dma。
使isr=-1,设置中断状态寄存器,清除所有已有中断。
使用dma方式,从0000h2000bh中取得本网卡mac地址。注意,mac地址每个byte都是重复一遍存放的,所以只要取单数1、3、5等byte就可以了。
使cr=0x61,选择页面1。
将刚才取得的mac地址放入par0-5中。网卡检查接收到的包是否和par里mac值匹配,然后决定收下或丢弃。所以,也可以任意设置这个par值,来伪造自己的mac值。
将mar02mar7全部设为0xff,允许接收所有的多址数据包。
使curr=0x47,设置当前接收页面为0x47。
使cr=0x22,启动网卡芯片,开始接收和发送过程。
2.4 网卡工作接收和发送过程
网卡ram是以256byte为一页,是按页存储的结构,16bit的ram地址高8bit又叫页码。网卡的16k的ram地址从0x400020x7fff,从页0x40到页0x7f,一共有64页。64页被接收和发送数据包用。接收和发送都是以页为最小的单位进行的。接收缓冲区需要定义,剩下的就可以作为发送缓冲区。
接收缓冲区由两个寄存器决定:pstart(pagestartregister)和pstop(pagestopregister)。设置了接收缓冲区之后,这个缓冲区就形成了一个循环队列。控制接收缓冲区的有两个寄存器curr、bnry。curr是网卡写缓冲区的指针,指向当前要写的页;bnry是读指针,指向用户已经读走的页。
bnry不可以超过curr,否则没被用户读取的数据就被覆盖了。用户设置完了curr以后,就不用管它,网卡接收到新的数据后,会自动修改它。用户读出数据后,要修改bnry的值,以通知网卡该数据已经读出了。
网卡ram区如图2所示,我们设置pstart和pstop,就决定了接收区域在46和7f之间,剩下6页作为发送缓冲区,可以满足一次发送容量为1514byte的最大以太网数据包的要求。curr初始值设为47,bnry初始值设为46。当收到新的数据包时(例如3页),网卡将它们依次放到47、48和49页,curr自动指向4a页。当我们读完这3页的数据包后,要将bnry改为49,以通知网卡数据包已经读完了。
网卡芯片接收到以太网数据包后,存在curr指向的页面中。一个数据包可以占据一页,也可以占据多页。在接收包的包头里,保存有该包的信息。包头格式如表1:
读完这个包头,我们就能知道本包的接收状态,包长度,以及下一个包的位置。在接收循环中,检查中断状态寄存器isr状态,发现有新包来,先读取包头信息,接着按照包头指示读取全包,然后改写bnry,再接着读下一个包,这样循环,直到达到curr位置。注意,一个包有可能占据接收缓冲区的首、尾页面,此时须小心读取。
发送数据包比较简单,将准备好的数据用dma传到发送缓冲区,然后设置发送长度到tbcr1和tbcr0中,再设置传输开始页面,即令tpsr=0x40,最后,使cr=0x26,就开始传送了。
传送完成后要清掉中断状态寄存器isr的发送完成标志。值得注意的是,发送包的包长度不能小于以太网规定的60byte,否则网卡不会将其发出。
3 tcp/ip协议在单片机上的软件设计
3.1 tcpip协议栈和链路层格式
internet上使用的是tcp/ip协议簇,由下至上包含四层:数据链路层、网络层(ip)、传输层(tcp)和应用层。我们在单片机上能实现的是数据链路层的功能,上层协议鉴于单片机有限的资源,只能实现部分功能。tcp/ip协议栈如表2:
数据链路层处于协议栈的最低层,传输以太网的物理传输帧,其帧格式如表3:
数据链路层是所有tcp/ip包的基础,所有它上层的包都被封装到链路层帧的数据段中。链路层就是mac对mac的通信。
3.2 ping命令在单片机上的实现
ping是网络层(ip层)的命令,网络层就是ip对ip之间的通信。主机对一个目标ip地址发出状态请求,后者发出回应,这样,就可以用来检查两者之间的线路是否畅通。这里涉及到两个网络层协议:
arp和icmp。首先,网络中要知道目标ip的mac地址,才能发送数据。为了获取该地址,我们向整个网络发送一个arp广播包,询问该ip对应的mac地址,然后目标ip应答,我们就从应答信息中得到mac地址。其次,发送一个icmp包,请求目标ip状态,目标ip回应,就完成网络连接测试。在我们的实验中,发出ping命令的是网络中的pc主机,接收信号并产生响应的是我们的单片机系统。我们假定单片机系统控制的网卡的ip为192.168.0.176。
第一步,实现arp协议。arp协议是addressresolutionprotocol(地址解析协议)的缩写,它的作用是将ip地址转换成物理地址(就是常说的mac地址)。协议arp的分组格式如表4:
当单片机主处理器处理网卡收到的arp广播请求时,如果发现是请求“192.168.0.176”的mac地址,于是按要求打一个arp应答包,将自己的mac地址放到应答包中,发送回网络就完成了ping的第一步。注意,要在应答包尾加18byte的补丁,否则应答包长度不满足最小60byte的要求。
第二步,实现icmp协议。icmp是“internetcontrolmessageprotocol”(internet控制消息协议)的缩写。用于在ip主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
icmp是封装在ip协议中,所以有ip包头。
icmp协议结构如表5:
网络主机在收到arp的应答包后,取出其中的mac地址,然后向该mac发出icmp请求。主处理器处理该请求时,将请求包的标识和序列号对应填入icmp应答包,其它部分按要求填写。校验和的计算有成熟的公式,容易计算,只要先把校验和部分置0,将包头的计算结果再填入校验和就可以了。
最后将该icmp应答包送入网络,这样就完成了ping的全过程。此时,发出ping命令的网络主机就会得到“replyfrom192.168.0.176:bytes=32time<10msttl=128”的信息。
4 串行数据与网络的数据交换的讨论
网络层之上,有两种传输层协议:tcp(trans2missioncontrolprotocol)和udp(userdatagramprotocol)。对于数据传输要求高的场合,需要使用tcp协议作为双方通信方式,但此种方式较为复杂。而对于一些实时信号及其反向控制信号的传递,实现udp协议就可以满足要求了。表6是udp协议结构:
当原始数据从串口送到到主处理器后,主处理器将其打包成udp报文,发送到网络中。网络端监控主机接收并处理该udp报文,然后将控制信息同样以udp报文发出。主处理器把网络控制信号返回给串口。这样,我们在internet中就可以方便地完成对现场串口数据源的监视和控制过程。
5 结语
因为单片机对于各种电器设备有良好的接入和控制能力,所以,我们实现了单片机的网络接入功能后,就在电器的硬件设备和网络之间建起了一道桥梁。通过它,可以实现对各种实时信号、仪器仪表、家用设施等目标的远程监视,在宏观上对各种设备统一管理,实现人与系统的和谐的交互。这必将大大提高工作效率,改善工作环境,提升人们的生产、生活水平。
浅谈物联网操作系统选择,浏览器比安卓更合适!
arduino扩展板引脚及其特性的详细说明
亚洲消费电子展在上海新国际博览中心举办 带来各种有趣的黑科技产品
服务器数据恢复-服务器硬盘黄色指示灯常亮的数据恢复案例
开关电源的布局及印制板布线原则的介绍(下)
基于单片机的串口协议网络化设计
智能制造的本质是解决不确定性
泰克为您免费升级示波器
入门级存储也可以开创大局面
小米老大雷军乡镇取经:一个人逛OPPO 店员不识 雷军孤独背影照亮了
苹果ToF镜头年底采用 续用Face ID有杂音
TIX640热像仪屏幕测温白屏维修
MPC-1812工业级嵌入式主控机的技术参数和应用范围
滤波电路中电感有什么设计准则?电感磁环的计算要怎样进行?
中国联通日前发布公告,拟采购OTN协同器软件一套
使用Digilent Zybo板的数字示波器的制作
利亚德公开发行可转换公司债券8亿元
产品设计包括哪些内容?
浅谈美团遭到反垄断诉讼背后的原因
EMC测试实质之共模传导性抗扰度