ch395一次发数据 触发几次中断呢?发一次 触发几次中断呢?

最近要用ch395做服务器,使用stm32F1的串口(115200)与ch395通信,stm32F1的中断只有边沿触发,我用的下降沿触发,应为用了ucosii,每次来中断,就给ch395线程发信号,中断的处理在线程中,目前通信正常,但是每发一次数据,总感觉有无用的中断,比如发一次数据:

(interrpute code:。。。是我在全局中断中的printf,每进一次全局中断,查询中断代码,就打印一次)

void Ch395_task(void *pdata)
{
	u8 res = 0,i = 0,cnt = 0;
	INT8U Err;
	pdata=pdata;
	
	OSTimeDly(100);
	CH395CMDReset();
	OSTimeDly(100);
	i = CH395CMDGetVer();
	
	CH395SetTCPMss(TcpMss);                                          /* 定义TCPMSS*/
	
	InitCH395InfParam();                                             /* 初始化CH395相关变量 */
	i = CH395Init();                                                 /* 初始化CH395芯片 */
	mStopIfError(i);
	printf("ch395 init succeed!\n");

	while((res<=1)&&(cnt<30))
	{
		res = CH395CMDGetPHYStatus();
		OSTimeDly(1000);
		cnt++;
		if((res != PHY_DISCONN)&&(res!=0))                     /* 查询CH395是否连接 */
		{
			CH395Inf.isConnect = 1;
			printf("CH395 Connect Ethernet,spend %dS\n",cnt);                       /* CH395芯片连接到以太网,此时会产生中断 */
			InitSocketParam();                                        /* 初始化socket相关变量 */
			CH395SocketInitOpen();
			break;
		}
	}
	
	while(1)
	{   
		OSSemPend(Ch395_interrupt,200,&Err); 
		
		if(Err == OS_ERR_NONE)
		{
		  CH395GlobalInterrupt();
		}
		else if(Err == OS_ERR_TIMEOUT)
		{
			
		}
	}
}
void CH395GlobalInterrupt(void)
{
    UINT16  init_status;
    UINT8  buf[10]; 
 
    init_status = CH395CMDGetGlobIntStatus_ALL();
	  
    printf("interrpute code :0x%04x\n",init_status);
    if(init_status & GINT_STAT_UNREACH)                              /* 不可达中断,读取不可达信息 */
    {
        CH395CMDGetUnreachIPPT(buf);                                
    }
    if(init_status & GINT_STAT_IP_CONFLI)                            /* 产生IP冲突中断,建议重新修改CH395的 IP,并初始化CH395*/
    {
    }
    if(init_status & GINT_STAT_PHY_CHANGE)                           /* 产生PHY改变中断*/
    {
      printf("Init status : GINT_STAT_PHY_CHANGE\n");
		}
    if(init_status & GINT_STAT_SOCK0)
    {
        CH395SocketInterrupt(0);                                     /* 处理socket 0中断*/
    }
}
[19:19:09.441]收←◆interrpute code :0x0010
receive len = 13
Tcp RecvData:1fdgvdfgsdfgv
interrpute code :0x0010
interrpute code :0x0000

微信图片_20200720192238.jpg

看示波器抓的int脚的信号。有的时候,在比较长的低电平那段,还回有一个短时间的上升下降。


一下是收发一次的。

[18:59:38.719]收←◆interrpute code :0x0010
receive len = 13
Tcp RecvData:1fdgvdfgsdfgv
interrpute code :0x0010
SINT_STAT_SENBUF_FREE
interrpute code :0x0000
interrpute code :0x0000

[18:59:38.841]收←◆interrpute code :0x0010


interrpute code :0x0000这是怎么回事,另外

[18:59:38.841]收←◆interrpute code :0x0010

进入socket中断后,查询socket中断状态也是零。这怎么回事啊???

stm32F103没有低电平中断。

额这个问题我也发现了。你就认为是报空中断时,底层有一些中断产生,但是不涉及到应用层吧。你可以在获取全局中断后加个判断,如果是0就break.


我也是碰到这个问题搜到了这个帖子。

TCP 服务器,下降沿中断或低电平中断,收到数据后有两次中断,第一次中断后读出数据,第二次中断读出的socket状态为0x00。中断管脚的波形也和楼主一样。

还请大牛们不吝赐教!


您好,395报中断时,底层有空中断产生,但是不影响到应用层数据使用。


只有登录才能回复,可以选择微信账号登录