引言
住宅小区智能化(或称为"智能小区")的概念是本世纪90年代引入国内的,它是以家庭智能化为核心,包括远程抄表,家庭防盗报警,医疗救助,家电控制等功能,采用系统集成方法,建立一个沟通小区内部住户之间、住户与小区综合服务中心之间、住户与外部社会的综合信息交互系统,从而为住户营造一个安全、舒适、便捷、高效的居住和生活环境。现行的智能小区系统多是以RS485、CAN总线、LONWORKS等总线进行联网,布线复杂,冲突多,系统不够稳定且涉及到消防安全及成本的考虑。而以太网实现联网,布线简单,且也比CAN、LONWOKS等更便宜,更有利于小区智能化产品的兼容和统一。在当今计算机技术及信息技术不断发展的情况下,以及人们对家居生活的需求及观念上的变化,电话、电视、计算机三网有合一的趋势,将来智能小区的发展必定是以太网的天下。所以针对当前行业的发展情况和趋势,对于基于IP的以太网家庭智能终端的研究顺应时代发展的潮流,有一定的现实意义。
智能小区系统结构
本文中提出的小区智能系统由小区计算机管理系统、网络交换设备、家庭智能终端(CDT)三个主要部分组成,网络结构如图1所示。
图1 系统网络结构图(略)
小区管理系统是指安装在小区管理中心,完成全小区内用户数据终端数据采集和处理的计算机系统,对于用户数较多的系统,可以采用客户机/服务器(C/S)结构。小区管理系统分为监控微机(Client)和服务器(Server)两个部分,客户端只作数据采集使用,数据的处理在服务器端进行。小区管理系统的功能包括:显示用户终端的上网状态,接受并显示住户报警,读取水电气表数据并产生报表,报警日志处理,系统管理等。用户数据终端:用户终端用来与管理系统通讯、并完成对各种计量信号和报警信号的采集、应答主机的呼叫、回答上网状态,并提供操作面板欢迎用户查询。
用户终端硬件结构及RTL8019的配置
1、用户终端结构硬件结构图如图2所示:系统由两块单片机组成,一块负责五表读数、安防红外遥控器及安防信号的采集工作,另一块负责驱动RTL8019通讯、家电控制,并响应键盘及驱动液晶显示。两块MCU之间通过串口交换数据。
图2 用户终端结构图(略)
2、RTL8019的配置
RTL8019是一款高度集成的以太网控制芯片,它有两种工作模式:一种是跳线模式jumper,一种是非跳线模式 jumperless,后者也支持Plug
and Play。在单片机中一般都采用跳线模式选项。I/O端口的基地址IO_BASE_ADDRESS由单片机和8019之间的接线决定。此外8019还具有8个IRQ接口,本系统中没用到IRQ,采用查询方式。
8019输入输出地址共32个,地址偏移量为00H――1FH:
其中00H--0FH共16个地址,为寄存器地址,寄存器分成4页PAGE0――PAGE3,与NE2000兼容的寄存器只有3页(Page0-Page2),为了保证驱动程序对所有Ne2000的网卡有效,不要去操作第四页的寄存器。
10H--17H共8个地址,为DMA地址。
18H--1FH共8个地址,为软复位端口。8019的硬件复位很简单,只需在上电时对RSTDRV输出一高电平就可以了。8019复位的过程将执行一些操作,比如将93c46读入,将内部寄存器初始化等,至少需要2毫秒的时间。推荐等待更久的时间之后才对网卡操作,比如100毫秒之后才对它操作,以确保完全复位。
ICS16B=LOW时采用8位DMA操作模式,上面的地址中只有18个是有用的: 00H--0FH共16个寄存器地址。10H DMA地址
(10H--17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)。1FH 复位地址(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H、1AH、1CH、1EH这几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H、1BH、1DH等奇数地址的复位)。
网卡驱动及TCP/IP协议栈的简化
从程序员的角度来说,对8019的操作是比较简单的,驱动程序只需要将要发送的数据按一定的格式写入芯片并启动发送命令,8019会自动添加接收状态、下一页指针、以太网帧长度和校验FCS段,并将数据包转换成物理帧格式在物理信道上传输。反之,8019收到物理信号后将其还原成数据,按指定格式存放在芯片RAM中以便主机程序取用。简言之就是8019完成数据包和电信号之间的相互转换:数据包<===>电信号。以太网协议由芯片硬件自动完成,对程序员透明。驱动程序有3种功能:芯片初始化、收包、发包。发送数据包是先将待发送的数据包通过DMA写操作存入网卡芯片RAM,并给出发送缓冲区首地址(TPSR0、TPSR1)和数据包长度(TBCR0,TBCR1),启动发送命令,网卡芯片会自动按以太网协议完成发送并将结果写入状态寄存器。接收数据包时,采用查询的方式,根据CURR==BNRY+1?可以判断是否收到新的数据包,如果有则通过DMA读操作从网卡芯片RAM读出数据。发送、接收子程序如下所示:
1发送子程序
bit Transmit(void)
{
CardCopyDown();
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_NO_DMA|CR_STOP|CR_PAGE0;//停止8019
XBYTE[IO_BASE_ADDRESS + NIC_INTR_STATUS] = 0xFF;//清中断标志
XBYTE[IO_BASE_ADDRESS + NIC_XMIT_START] = XMIT_START;//设置发送开始地址
XBYTE[IO_BASE_ADDRESS + NIC_XMIT_CONFIG] = TCR_NO_LOOPBACK;//设置为一般模式
XBYTE[IO_BASE_ADDRESS+NIC_DATA_CONFIG]=DCR_FIFO_8_BYTE|DCR_NORMAL|DCR_BYTE_WIDE;//设置8位DMA模式
XBYTE[IO_BASE_ADDRESS + NIC_XMIT_COUNT_LSB] = 100;//设置发送数据长度
XBYTE[IO_BASE_ADDRESS + NIC_XMIT_COUNT_MSB] = 0;
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_START|CR_XMIT|CR_PAGE0;//启动8019
return (TRUE);
}
2接收子程序
bit Receive(void)
{
uint TempShort;
uchar Temp;
uchar CURR;
uchar BNRY;
uint i;
//停止网卡
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_STOP|CR_NO_DMA|CR_PAGE1;
//读取当前CURRENT的值
CURR= XBYTE[IO_BASE_ADDRESS + NIC_CURRENT];
//读取当前BOUNDARY的值
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_STOP|CR_NO_DMA|CR_PAGE0;
BNRY= XBYTE[IO_BASE_ADDRESS + NIC_BOUNDARY];
if(CURR==0)
return (FAULSE);
if((++BNRY)> PAGE_STOP)
BNRY=PAGE_START;
if(CURR!=BNTY)//表示有包收到
{
//设置远端DMA地址和长度
XBYTE[IO_BASE_ADDRESS + NIC_RMT_ADDR_LSB] = 0x00;
XBYTE[IO_BASE_ADDRESS + NIC_RMT_ADDR_MSB] = BOUNDARY;
XBYTE[IO_BASE_ADDRESS+NIC_RMT_COUNT_LSB]=__dread&0xFF;
XBYTE[IO_BASE_ADDRESS + NIC_RMT_COUNT_MSB] = (__dread>>8)&0xFF;
//设置DMA读
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_START|CR_DMA_READ|CR_PAGE0;
//重复读DMA端口
for (i=0;i<__dread;i++)
{
Receive_data[i] = XBYTE[IO_BASE_ADDRESS + NIC_RACK_NIC];
}
//等待DMA停止
TempShort = 0xFFFF;
while(TempShort)
{
Temp = XBYTE[IO_BASE_ADDRESS + NIC_INTR_STATUS];
if (Temp&ISR_DMA_DONE) break;
TempShort --;
}
return (TRUE);
}
else
return(FAULSE);
}
3协议栈的精简
单片机中TCP/IP的实现与PC机不同,在PC里可支持比较完整的TCP/IP协议组,但在单片机里无法做到,这是因为单片机根本没有足够的代码空间来支持这些协议。一般在单片机里实现与需要有关的部分,而不使用的协议则一概不支持。例如文件共享SMB协议,在UNIX、WINDOWS都支持,但单片机上却没有必要。一般只能在单片机中实现:ARP、IP,ICMP、TCP/UDP这些协议,而更高层的协议,HTTP、SMTP、FTP一般是不需要支持的。虽然有些单片机例如AVR上网方案实现了这些协议,但实用性不大。因为单片机应用的TCP/IP协议大多是为了完成数据采集和数据传输,而不是网页浏览、文件传输这些功能。另外由于单片机资源的有限性,对某一协议而言,也有可能要作简化。本系统中实现的协议只有ARP、IP、ICMP、UDP。在选择传输层协议时我们放弃了面向链接的TCP,因为TCP为了保证数据的可靠性采用一问一答的方式,这在数据量并不大的嵌入式系统中,反而增加了网络的负担;另外TCP的很多机制,如分段机制、窗口机制等都适合于数据量大、处理能力强的PC机网络,并不适合于嵌入式系统。UDP虽然不提供面向链接的、可靠的服务,但是协议简单,实时性更强,应用层也可以做相应的定时等待、重发处理等辅助性的操作来弥补它的缺陷。
a.ARP:ARP的本质就是实现IP地址到MAC地址的转换,抓住了这一点实现就比较简单。嵌入式系统中没有必要实现PC机网络中地址表的更新功能,只需完成地址转换。管理中心机在初始化CDT时发送ARP请求,CDT只需响应中心对它的ARP请求,但不主动发送ARP请求。
b.ICMP:ICMP的种类很多,在本系统中只要实现ICMP信息回显功能。管理中心在执行PING命 令 时,发送ICMP请求信息,CDT中只需实现ICMP回应信息。
c.IP:IP包最大可达65k,单片机中无法存放如此大的数据包,因此一般不支持分段,以发送小数据的方式来避免分段。另外IP层的选项功能都可以完全忽略,IP层只需要根据协议类型分包。
d.应用层:应用层采用自己的数据协议格式为:
头部+命令字段+布防字段+报警字段+五表参数字段+五表读数字段+家电控制字段
接收方根据命令段的含义来分别实现布防、报警、五表参数设置、五表读书、家电控制等功能。
结束语
本文以基于TCP/IP技术的智能小区家庭智能终端系统的研究为例,详细讲述了RTL8019网卡芯片的驱动方法,并给出了单片机中TCP/IP协议的精简方案。本系统已经成功地运用于多个小区,其可行性、可靠性和灵活性已经得到证实,并且基于以太网智能小区系统低廉的造价、简洁的布线更使得基于TCP/IP的以太网技术成为了替代传统现场总线技术的一种重要手段。
|