打印
[寄存器]

28335 SCI做485通信时连续接受数据出现进不了中断现象

[复制链接]
3063|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wolf19860612|  楼主 | 2015-8-2 22:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用28335的SCIA接个MAX3485,用GPIO40来控制收发位,来进行485通信。功能很简单,9600波特率,接受上位机指令,处理后进行回复相应指令。
编码下载程序后,一收一发都完全正常。但当上位机以30ms周期发送指令时,一开始收发也正常,但发送一会后发现串口进不了中断了,其他程序还正常(定时器0有个1s的闪灯程序)。
调试了几遍,有时收发1万多帧时出现进不了中断现象,有时是2万多帧出现,但都会出现问题。

////////////////////////////////////////////
SCI初始化,用普通收发模式,没有用FIFO,接受用中断
//////////////////////////////////////////
void InitScia()
{
  ScibRegs.SCICCR.all = 0x0007;
ScibRegs.SCICTL1.all = 0x0003;
ScibRegs.SCICTL2.all =0x0002;  //使能接受中断
   SciaRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
   SciaRegs.SCILBAUD    =0x00E7;
ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}
//////////////////////////////////////////
SCI的GPIO设置、中断设置应该都没问题,中断程序里PIEACK也都清了,否则一开始不会正常。程序在单位没拷过来,就不粘了。
//////////////////////////////////////////
发现问题后我在编译器里观察了SCI的寄存器,发现进不了中断后SCIRXST的 第4位(FE)和第7位(RX ERROR)为1,正常情况下应该为0
  
根据手册里显示FE位是因为在接受串口时没有收到停止位,从而出现了接受错误。
于是我想这出现错误时将错误标志位修改了,根据手册,要清标志位需要用清SW RESET寄存器((SCICTL1)的第5位)才可以。
  
于是我修改了InitScia函数,使发生接受错误时也能进接受中断函数,修改如下:
////////////////////////////////////////////
SCI初始化,接受错误中断
//////////////////////////////////////////
void InitScia()
{
  ScibRegs.SCICCR.all = 0x0007;
ScibRegs.SCICTL1.all = 0x0003;
ScibRegs.SCICTL1.bit.RXERRINTENA = 1; //接受错误中断
ScibRegs.SCICTL2.all =0x0002;  //使能接受中断
   SciaRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
   SciaRegs.SCILBAUD    =0x00E7;
ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
}
///////////////////////////////////////////////
并在中断处理函数里增加请SW RESET寄存器程序
///////////////////////////////////////////////
interrupt void SCITXINTA_ISR(void)   
{
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
  if(SciaRegs.SCIRXST.bit.RXERROR == 1)
{
        SciaRegs.SCICTL1.bit.SWRESET = 0;
}        
……
……
下面是正常接受程序
……
……
}
修改后测试,上位机连续发送,发送一会的确进错误中断这代码里来了,SWRESET清零后也果然将FE和RX ERROR错误清零了,但是我继续发,还是进不了中断!
接下来又使其他几种方法,还是一样,而且发现跟上位机发送周期有关,发送周期为1s时就没出现过错误,发送周期为15ms时,马上就出现错误。
没办法继续研究手册,发现SWRESET 位置1时是直接复位SCI,于是又把上面中断函数里的代码修改了下
SciaRegs.SCICTL1.bit.SWRESET = 1;//复位SCI
测试后发现出现错误后,进中断,然后复位SCI后又可以继续工作了。

虽然最后通过修改代码可以工作了,但时还有不明白以下问题,看哪位知道的赐教下,谢谢
问题1:为什么会出现接受不到停止位的现象呢?DSP485的接线与上位机接线很紧,不到20cm?
问题2:为什么出现RX ERROR接受错误后就不能进中断了呢?
问题3:为什么将FE和RX ERROR错误清零后还是进不了中断,到底是什么原因导致进不了中断的呢?

相关帖子

沙发
liubinghui| | 2015-8-4 23:19 | 只看该作者
三克油我的也出现类似的现像.

使用特权

评论回复
板凳
wolf19860612|  楼主 | 2015-8-4 23:25 | 只看该作者
liubinghui 发表于 2015-8-4 23:19
三克油我的也出现类似的现像.

没找到问题的本质呀,求大神们解答

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝