4067|2

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

W5100的中断方式与单片机联合编程 [复制链接]

    w5100是自带网络协议的芯片,具体我不讲了,我就讲下中断方式应用,这个应用是采用TCP/IP网络协议,单片机是客户端跟服务器进行相连的。
    这里先讲两种寄存器,W5100_IR和W5100_S0_IR,后面这个这个芯片总共有4个S0\S1\S2\S3,这里我只用一个端口0,也就是W5100_S0_IR。W5100_IR是W5100中断寄存器,W5100_S0_IR是W5100端口0寄存器,是两个不同的寄存器。如果端口0有了一个连接信号,则W5100_IR里面的端口0中断位置1,同时W5100_S0_IR里面的连接位置1。其他的断开信号、接收到数据信号、超时信号类似。
    w5100有一个引脚INT,这个引脚正常的时候是高电平,当5100的端口产生连接、断开、接收到数据或超时时会产生低电平,这个低电平会一直保持低电平直到W5100_IR这个寄存器里面的值为0才会恢复成高电平。我就是用这个引脚来设计。将这个INT与单片机的某一个中断引脚相连就可以检测W5100模块是否有信号来了。
    当单片机检测到INT中断信号,进入中断服务程序,先读W5100_IR寄存器里面的值,如果端口0位置1了,就继续读W5100_S0_IR寄存器里面的值,如果寄存器里面的接收到数据位置1了,就置端口0接收到数据标志,下面就可以随功能进行设置了。
    成都浩然电子有相应的例程,例程都是用查询方式编程的,其实查询方式跟中断方式大多都相同,只是例程里面有一个部分的处理需要修改下才能使中断方式正常运行。就是void W5100_Interrupt_Process(void)这个中断处理程序框架,这个程序里面只进行了一次中断处理。如果有多个中断连续来了,这个程序就会导致以太网连接失败。我们只需要在这个函数最后再次读一下W5100_IR寄存器是不是等于0了,如果不是要返回到程序的开始重新执行下。这样一改,中断方式就没有问题了。
    这个问题出现我记录下,我在这里多花了一个星期的时间找原因,最后还是由一个前辈点醒了,所以说前辈是宝藏啊宝藏!我最初开始测试的时候在我自己的电脑上是可以连接服务器的,不停连接断开连接断开有时就会变成无法连接了。到了其他电脑,情况更差,基本上就只有刚上电那会儿才连接上,总之,我的程序肯定不行。后来经过单步调试、示波器测试发现,以太网的工作模式在每个电脑上是不一样的,这个方面我完全不懂,我只知道插上网线后,无法连接的电脑的以太网会有很多信号到我W5100上,我的单片机在W5100接收到很多中断的时候无法处理好,就是W5100_IR里面的值在我清了后会立即置位,也就是多中断的问题。后来前辈说你只要在中断处理程序后面再确认一下中断都处理好了再跳出程序就好了。最终是改好了,也就是上一个段落的方法。
此帖出自单片机论坛

最新回复

本帖最后由 duanchao1230 于 2014-7-1 11:52 编辑 你好我的中断程序里面是这样处理的 你看看对不对 我现在老是断了 然后就连不上了void W5100_Interrupt_Process(void) {                        unsigned char i,j;               while(1)            {                                                   i=Read_W5100(W5100_IR);      Write_W5100(W5100_IR, (i&0xf0));                       if(i == 0)                             {                                          break;        }                                                                if((i & IR_CONFLICT) == IR_CONFLICT)          {                                                }                            if((i & IR_UNREACH) == IR_UNREACH          {                                     }                              if((i & IR_S0_INT) == IR_S0_INT)     {                                        j=Read_W5100(W5100_S0_IR);//¶áè¡Socket0ÖD¶Ï±êÖ¾¼Ä′æÆ÷                                 //»ØD′ÇåÖD¶Ï±êÖ¾             Write_W5100(W5100_S0_IR, j);//»ØD′ÇåÖD¶Ï±êÖ¾                                        if(j&S_IR_CON)//ÔúTCPÄ£ê½ÏÂ,Socket03é1|á¬½ó                                    {                                                  S0_State|=S_CONN;//íøÂçᬽó×′ì¬0x02,¶Ë¿úíê3éᬽ󣬿éòÔÕy3£′«êäêy¾Y                           }                                      if(j&S_IR_DISCON)//ÔúTCPÄ£ê½ÏÂSocket¶Ï¿aᬽó′|àí                             {                                                 Write_W5100(W5100_S0_CR, S_CR_CLOSE);// 1رն˿ú,μè′yÖØDÂ′ò¿aá¬½ó                                                  S0_State=0;//íøÂçᬽó×′ì¬0x00,¶Ë¿úᬽó꧰ü                             }                                   if(j&S_IR_SENDOK)//Socket0êy¾Y·¢Ëííê3é,¿éòÔÔù′ÎÆô¶ˉS_tx_process()oˉêy·¢Ëíêy¾Y                                   {                                               S0_Data|=S_TRANSMITOK;//¶Ë¿ú·¢Ëíò»¸öêy¾Y°üíê3é           w5100sendflg = 0;                 }                                     if(j&S_IR_RECV)//Socket½óêÕμ½êy¾Y,¿éòÔÆô¶ˉS_rx_process()oˉêy             {                  S0_Data|=S_RECEIVE;//¶Ë¿ú½óêÕμ½ò»¸öêy¾Y°ü        }                                   if(j&S_IR_TIMEOUT)//Socketᬽó»òêy¾Y′«êä3¬ê±′|àí                               {                                                 Write_W5100(W5100_S0_CR, S_CR_CLOSE);             S0_State = 0;                                    }                            }               } }   详情 回复 发表于 2014-7-1 11:46
点赞 关注
 

回复
举报

3238

帖子

5

TA的资源

五彩晶圆(中级)

沙发
 
谢谢分享
此帖出自单片机论坛
 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
本帖最后由 duanchao1230 于 2014-7-1 11:52 编辑

你好我的中断程序里面是这样处理的 你看看对不对 我现在老是断了 然后就连不上了void W5100_Interrupt_Process(void)
{                    
   unsigned char i,j;           
   while(1)         
  {                                             
     i=Read_W5100(W5100_IR);
     Write_W5100(W5100_IR, (i&0xf0));                 
     if(i == 0)                        
    {                                 
        break;   
    }                                                           
    if((i & IR_CONFLICT) == IR_CONFLICT)      
   {                                          
     }                        
   if((i & IR_UNREACH) == IR_UNREACH      
   {                                 
   }                          
   if((i & IR_S0_INT) == IR_S0_INT)  
  {                                 
      j=Read_W5100(W5100_S0_IR);//¶áè¡Socket0ÖD¶Ï±êÖ¾¼Ä′æÆ÷                                 //»ØD′ÇåÖD¶Ï±êÖ¾             Write_W5100(W5100_S0_IR, j);//»ØD′ÇåÖD¶Ï±êÖ¾                                 
      if(j&S_IR_CON)//ÔúTCPÄ£ê½ÏÂ,Socket03é1|á¬½ó                              
     {                                       
          S0_State|=S_CONN;//íøÂçᬽó×′ì¬0x02,¶Ë¿úíê3éᬽ󣬿éòÔÕy3£′«êäêy¾Y                     
     }                                
     if(j&S_IR_DISCON)//ÔúTCPÄ£ê½ÏÂSocket¶Ï¿aᬽó′|àí                        
    {                                       
         Write_W5100(W5100_S0_CR, S_CR_CLOSE);// 1رն˿ú,μè′yÖØDÂ′ò¿aá¬½ó                                                  S0_State=0;//íøÂçᬽó×′ì¬0x00,¶Ë¿úᬽó꧰ü                        
    }                              
    if(j&S_IR_SENDOK)//Socket0êy¾Y·¢Ëííê3é,¿éòÔÔù′ÎÆô¶ˉS_tx_process()oˉêy·¢Ëíêy¾Y                                   {                                       
       S0_Data|=S_TRANSMITOK;//¶Ë¿ú·¢Ëíò»¸öêy¾Y°üíê3é   
       w5100sendflg = 0;            
    }                                
    if(j&S_IR_RECV)//Socket½óêÕμ½êy¾Y,¿éòÔÆô¶ˉS_rx_process()oˉêy        
    {         
        S0_Data|=S_RECEIVE;//¶Ë¿ú½óêÕμ½ò»¸öêy¾Y°ü   
    }                              
    if(j&S_IR_TIMEOUT)//Socketᬽó»òêy¾Y′«êä3¬ê±′|àí                          
    {                                       
         Write_W5100(W5100_S0_CR, S_CR_CLOSE);   
         S0_State = 0;                                
   }                        
   }               }
}
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表