单片机IP技术在智能小区系统中的应用

[09-12 17:55:08]   来源:http://www.88dzw.com  单片机学习   阅读:8447

文章摘要: 网卡驱动及TCP/IP协议栈的简化 从程序员的角度来说,对8019的操作是比较简单的,驱动程序只需要将要发送的数据按一定的格式写入芯片并启动发送命令,8019会自动添加接收状态、下一页指针、以太网帧长度和校验FCS段,并将数据包转换成物理帧格式在物理信道上传输。反之,8019收到物理信号后将其还原成数据,按指定格式存放在芯片RAM中以便主机程序取用。简言之就是8019完成数据包和电信号之间的相互转换:数据包<===>电信号。以太网协议由芯片硬件自动完成,对程序员透明。驱动程序有3种功能:芯片初始化、收包、发包

单片机IP技术在智能小区系统中的应用,标签:单片机开发,单片机原理,单片机教程,http://www.88dzw.com


网卡驱动及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_DMACR_STOPCR_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_BYTEDCR_NORMALDCR_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_STARTCR_XMITCR_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_STOPCR_NO_DMACR_PAGE1;
//读取当前CURRENT的值
CURR= XBYTE[IO_BASE_ADDRESS + NIC_CURRENT];
//读取当前BOUNDARY的值
XBYTE[IO_BASE_ADDRESS + NIC_COMMAND] = CR_STOPCR_NO_DMACR_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_STARTCR_DMA_READCR_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];

上一页  [1] [2] [3]  下一页


Tag:单片机学习单片机开发,单片机原理,单片机教程单片机学习
分类导航
最新更新
热门排行