查看: 2982|回复: 2

[求助] 请问W5500中断的问题

[复制链接]

81

主题

33

好友

3063

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    2016-5-31 17:39
  • 签到天数: 483 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 在线达人勋章 优秀会员勋章 热心会员勋章 发帖机器勋章 原创先锋勋章 推广达人勋章 论坛骨干勋章 技术先锋勋章 原创达人勋章 技术高手勋章 突出贡献勋章 灌水专家勋章 在线之王勋章

    发表于 2014-4-26 12:57:27 |显示全部楼层
    本帖最后由 powerdruy 于 2014-4-26 13:03 编辑

    我打开了socket 0的接收中断,收到数据也能产生中断,写中断寄存器相应为也能清除中断,现在的问题是如果把Process_LoopBack();环回测试程序放在主循环里,连接成功后就可以一直来测试还回,主循环代码如下
    1. while(1)
    2. {
    3.         Process_IR();
    4.         i=Read_SOCK_1_Byte(0,Sn_SR);
    5.         if(i==0)         //若超时等重新建立TCP连接,这里只建了一个端口的连接。
    6.        {
    7.              do
    8.             {
    9.                  Delay_ms(100);
    10.                 /* set Socket n Port Number as 5000 */
    11.                 Write_SOCK_2_Byte(0, Sn_PORT, S0_Port);
    12.             }while(Socket_Connect(0)==FALSE);
    13.        }
    14.       else if(i==SOCK_ESTABLISHED)
    15.       {
    16.             unsigned char n;
    17.             Process_LoopBack();
    18.             Delay_ms(100);
    19.       }
    20.       else if(S0_TimeOut)
    21.      {
    22.            S0_TimeOut=0;
    23.      }
    复制代码

    但是如果把主循环里的Process_LoopBack();屏蔽,而是放到中断服务程序里,就会有两个问题

    1,中断服务程序里只有Process_LoopBack();和清除中断的指令,那么环回的时候,接收缓存数据长度读出不对,发了一堆无意义的数据回来了,代码如下
    /*中断服务*/
    void EXTI0_IRQHandler(void)
    {
       if(EXTI_GetITStatus(EXTI_Line0) != RESET)         //判别是否有外部中断
       {
         //清除中断请求标志
         Process_LoopBack();        
         Write_SOCK_1_Byte(0,Sn_IR,IR_RECV); //清除socket 0的接收中断
         Write_1_Byte(SIR,S0_INT); //清除socket 0的中断
         EXTI_ClearITPendingBit(EXTI_Line0);        
       }
    }


    /*主循环*/
    while(1)
    {
        Process_IR();
        i=Read_SOCK_1_Byte(0,Sn_SR);
        if(i==0)         //若超时等重新建立TCP连接,这里只建了一个端口的连接。
        {
              do
                    {
                         Delay_ms(100);
                         /* set Socket n Port Number as 5000 */
                         Write_SOCK_2_Byte(0, Sn_PORT, S0_Port);
                    }while(Socket_Connect(0)==FALSE);

         }
         else if(i==SOCK_ESTABLISHED)
         {
           //unsigned char n;
          //Process_LoopBack();
          //Delay_ms(100);
          }
          else if(S0_TimeOut)
         {
         S0_TimeOut=0;
         }
    }


    2,中断服务程序如果把主循环的代码全部包含进去,则会出现能够环回数据,但是发个1-2次就会自动断开连接,然后又会自动连接,代码如下

    /*中断服务*/
    void EXTI0_IRQHandler(void)
    {
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)         //判别是否有外部中断
    {
    //清除中断请求标志
    unsigned char i;
    Process_IR();        
    i=Read_SOCK_1_Byte(0,Sn_SR);

    if(i==0)         //若超时等重新建立TCP连接,这里只建了一个端口的连接。
    {
    do
    {
    Delay_ms(100);
    /* set Socket n Port Number as 5000 */
    Write_SOCK_2_Byte(0, Sn_PORT, S0_Port);
    }while(Socket_Connect(0)==FALSE);
    }
    else if(i==SOCK_ESTABLISHED)
    {
    Process_LoopBack();        
    }        
    Write_SOCK_1_Byte(0,Sn_IR,IR_RECV); //清除socket 0的接收中断
    Write_1_Byte(SIR,S0_INT); //清除socket 0的中断
    EXTI_ClearITPendingBit(EXTI_Line0);        
    }
    }


    /*主循环*/
    while(1)
    {
    Process_IR();
    i=Read_SOCK_1_Byte(0,Sn_SR);

    if(i==0)         //若超时等重新建立TCP连接,这里只建了一个端口的连接。
    {
    do
    {
    Delay_ms(100);
    /* set Socket n Port Number as 5000 */
    Write_SOCK_2_Byte(0, Sn_PORT, S0_Port);
    }while(Socket_Connect(0)==FALSE);
    }
    else if(i==SOCK_ESTABLISHED)
    {
    //unsigned char n;
    //Process_LoopBack();
    //Delay_ms(100);
    }
    else if(S0_TimeOut)
    {
    S0_TimeOut=0;
    }
    }

    不知道有遇见过这个问题的能否解答一下,感谢

    最近板子好多啊,玩都玩不过来了,我看可以开个板子铺了
    回复

    使用道具 举报

    0

    主题

    0

    好友

    18

    积分

    白丁

    Rank: 1

    该用户从未签到

    发表于 2016-1-7 20:12:14 |显示全部楼层
    你好,我现在也正在用STM32+W5500做一个UDP通信的开发,打算使用中断接收的方式,楼主可以提供你的程序参考交流一下吗
    回复

    使用道具 举报

    81

    主题

    33

    好友

    3063

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    2016-5-31 17:39
  • 签到天数: 483 天

    [LV.9]以坛为家II

    爱板会员勋章 活跃会员勋章 在线达人勋章 优秀会员勋章 热心会员勋章 发帖机器勋章 原创先锋勋章 推广达人勋章 论坛骨干勋章 技术先锋勋章 原创达人勋章 技术高手勋章 突出贡献勋章 灌水专家勋章 在线之王勋章

    发表于 2016-3-2 08:58:13 |显示全部楼层
    risky 发表于 2016-1-7 20:12
    你好,我现在也正在用STM32+W5500做一个UDP通信的开发,打算使用中断接收的方式,楼主可以提供你的程序参考 ...

    其实没什么难的,就是要确定好需要打开哪些中断,进中断读标志位判断是什么产生的中断
    最近板子好多啊,玩都玩不过来了,我看可以开个板子铺了
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-11 16:03 , Processed in 0.137939 second(s), 10 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部