最近要用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
看示波器抓的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没有低电平中断。