导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[wsfeitian]老古,帮忙看看这个udp发送程序啊



No.54231
作者:wsfeitian
邮件:wsfeitian@yahoo.com.cn
ID:20382
登陆:2次
文章数:31篇
最后登陆IP:202.103.243.118
最后登陆:2004/6/10 10:17:57
注册:2004/4/19 21:17:01
财富:232
发帖时间:2004/5/11 11:47:38
发贴者IP:202.103.243.98
标题:wsfeitian:老古,帮忙看看这个udp发送程序啊
摘要:No.54231老古,帮忙看看这个udp发送程序啊 电路参考您的一体化电路,去掉了串口,在P2口接一个液晶显示器.cpu用89s52.

以下仅仅是实现8019发udp数据程序,不用arp协议.

typedef struct
{
  unsigned char dest_hwaddr[6];
  unsigned char source_hwaddr[6];
  unsigned  int  frame_type;
} ETH_HEADER;


typedef struct
{
   unsigned char ver_len;
   unsigned char type_of_service;
   unsigned  int  total_length;
   unsigned  int  identifier;
   unsigned  int  fragment_info;
   unsigned char time_to_live;
   unsigned char protocol_id;
   unsigned  int  header_cksum;
   unsigned  long source_ipaddr;
   unsigned  long dest_ipaddr;
} IP_HEADER;

typedef struct 
{
   unsigned  int  source_port;
   unsigned  int  dest_port;
   unsigned  int  length;
   unsigned  int  checksum;
 unsigned char msg_data;
} UDP_HEADER;


sbit reset=P3^4;

#define reg00   XBYTE[0xc000]   //reg00- 10为isa网卡接口的寄存器地址240-25fh;
#define reg01   XBYTE[0xc100]
#define reg02   XBYTE[0xc200]
#define reg03   XBYTE[0xc300]
#define reg04   XBYTE[0xc400]
#define reg05   XBYTE[0xc500]
#define reg06   XBYTE[0xc600]
#define reg07   XBYTE[0xc700]
#define reg08   XBYTE[0xc800]
#define reg09   XBYTE[0xc900]
#define reg0a   XBYTE[0xca00]
#define reg0b   XBYTE[0xcb00]
#define reg0c   XBYTE[0xcc00]
#define reg0d   XBYTE[0xcd00]
#define reg0e   XBYTE[0xce00]
#define reg0f   XBYTE[0xcf00]
#define reg10   XBYTE[0xd000]
#define reg1f   XBYTE[0xdf00]

/******************************设置网卡地址***********************/

void ReadRtl8019NodeID(void)
{
}

void WriteRtl8019NodeID(void)  //直接设置本机物理地址
{
 page(1);
 reg01=0x00;
 reg02=0x01;
 reg03=0x02;
 reg04=0x03;
 reg05=0x04;
 reg06=0x05;
 page(0);

}

void rtl8019as_rst() //复位网卡
{
        uchar temp;
 reset=1;   
 delay_ms(800);
 reset=0;
 delay_ms(800);
}

/************8019初始化*******************/
void page(unsigned char pagenumber)//选择页面
{
 unsigned char data temp;
 temp=reg00;  
 temp=temp&0x3B ;
 pagenumber=pagenumber   <  <6;
 temp=temp | pagenumber;
 reg00=temp;
}


void init_8019(void)
{
 delay_ms(10);
 rtl8019as_rst();  //复位8019
// R8019_CHIP_SELECT;
 reg00=0x21;    //使芯片处于停止模式,这时进行寄存器设置 停止模式下,将不会发送和接收数据包
 delay_ms(10);   //延时10毫秒,确保芯片进入停止模式
 page(0);
 reg0a=0x00; 
 reg0b=0x00;
 reg0c=0xe0;        //RCR 
 reg0d=0xe2;   //loop back mode 使芯片处于mon和loopback模式,跟外部网络断开 

//使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包。
//使用0x4c-0x7f为网卡的接收缓冲区,共52页?
 reg01=0x4C; //Pstart  接收缓冲区范围
 reg02=0x80; //Pstop    接收缓冲区尾地址

 reg04=0x40; //TPSR    发送缓冲区范围

 reg03=0x4C; //BNRY  指向最后一个已经读取的页(读指针)
             //刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第一个接收缓冲区的页0x4c)
 

 reg07=0xff;    //清除所有中断标志位
 reg0f=0x00;    //disable all interrupt
 reg0e=0xc8;    //byte dma 8位dma方式

 page(1); //选择页1的寄存器
 reg07=0x4D; //CURR  CURR 当前的接收结束页地址。(写指针)
 reg08=0x00; //MAR0 设置多点播送的参数
 reg09=0x41; //MAR1
 reg0a=0x00; //MAR2
 reg0b=0x80; //MAR3
 reg0c=0x00; //MAR4
 reg0d=0x00; //MAR5
 reg0e=0x00; //MAR6
 reg0f=0x00; //MAR7 

 reg00=0x22;    //这时让芯片开始工作
 ReadRtl8019NodeID(); //读出网卡的物理地址48位  
 WriteRtl8019NodeID(); //将网卡地址写入到mar寄存器 
 
//将网卡设置成正常的模式,跟外部网络连接
 page(0);
 reg0c=0xcc; //RCR       接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收
 reg0d=0xe0; //TCR       发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式
 reg00=0x22;    //这时让芯片开始工作
 reg07=0xff;    //清除所有中断标志位
}

/************udp***************/
static ulong code my_ipaddr=0xC0A8000A;//设置ip为192.168.0.10
static uint xdata sender_udpport=1025;//发送端口为1025
static ulong xdata sender_ipaddr=0xCAC1318C;//pc机ip为202.193.49.140

void udp_send(uchar xdata *inbuf, uint port, uint len)
{   
    
 unsigned long idata sum;
   unsigned int idata result;
   unsigned char xdata * outbuf;
   UDP_HEADER xdata * udp;
    IP_HEADER xdata * ip;

 
   // Allocate memory for entire outgoing message including
   // eth & IP headers. Total ethernet message length is:
   // 14 byte eth header + 20 byte IP header + 8 byte UDP header
   // + length of this data 
   outbuf = (uchar xdata *)malloc(42 + len);//malloc返回为一个(42+len)大小对象所分配的内存指针.如果返回
                                           
   
   udp = (UDP_HEADER xdata *)(outbuf + 34);
   ip = (IP_HEADER xdata *)(outbuf + 14);
   
   // Direct message back to the senders port. 
 udp->  dest_port = sender_udpport;
 udp->  source_port = port;
 udp->  length = 8 + len;
 udp->  checksum = 0;
  
 // Fill in data ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:31毫秒 最大:78531毫秒 查询6次