This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

BRKDT标志位的误触发

在使用28027进行485通讯时,使用8位数据位+1位地址位+1位停止位的方法进行通讯。

其中地址为1是标识该字节为地址,0标识该字节为数据。

当接收数据为0x00+0时,包含起始位一共会有连续10位的低电平发生,此时28027会误认为BRKDT,通过阅读ds,发现触发BRKDT的前提是先丢失一位停止位,但实际工作情况下,并未有FE中断产生?

请问这是28027的缺陷,还是我们通讯方式有问题?

  • 这个问题,我抛砖引玉一下。

    我认为,肯定不是28027的缺陷,也应不是通信方式有问题,可能是楼主的开发板上的通信受到了干扰。

    BRKDT的前提是先丢失一位停止位后再发生10位的拉低,应该是丢失停止位先产生Framing error,FE位置位后再十位拉低产生BRKDT。

    具体的最好把SCI模块单列出来测试一下,我这里最近不方便做实验,楼主自己测试一下吧。

  • 但我在实验中发现,FE位始终没有被置位,仅仅是BRKDT位被置位。如图,蓝色脉冲为接收中断添加的debug信号,实际测量mcu RX口的信号没有噪声!

  • 建议楼主测量一下到SCI引脚的波形。

    我特地确认了一下,不可能“FE位始终没有被置位,仅仅是BRKDT位被置位”。

    或者你那里置位了FE位--》中断--》程序中清零了FE位--》BRKDT位被置位

    我认为,肯定不是28027的缺陷,也应不是通信方式有问题,可能是楼主的开发板上的通信受到了干扰。

  • 这个图片是直接测量的RX引脚的波形。

     

    中断函数里面的结构是这样的

    isr

    {

    if(brkdt)

    {...} 

    else if(RXRDY)

    {...} 

     

    if(OE || FE)

    {...}

     

    }

  • 我在brkdt 和OE|| FE 两个条件下面添加了低电平的debug信号,上图所见的黄色脉冲,可见,还是只有brkdt被触发

  • 另外如果有用FIFO也请看一下,FIFO中读出的数据,是否有某个数据的SCIRXBUF[SCIFFFE]置位

    这个问题,我认为争议的焦点在 BRKDT位被置位 但SCIRXST[FE]没置位;我试了很多次,没能够让BRKDT位置位而SCIRXST[FE]不置位。

    那么有下面几种可能

    1、我搞错了,有其他方法导致BRKDT产生,但不需要missing stop bit,或者framing error不会产生

    2、您的测试方法有问题

    3、芯片有问题,不过SCI这个模块出来了十几年,这个可能可以排除。

    我找TI美国再去确认一下,明天回复您。

  • 十分感谢, 我刚才再次测试了一下,连续6个字节的数据,前三个字节正确,并触发RXRDY标志位,第四个字节结尾处触发BRKDT标志位。

  • SCIRXST[FE]置位没?

  • 没有! 第四个字节是0x00,FE置位也应该表示是第三个字节接收错误吧! 问题是前三个字节都正常,第四个字节直接出现的BRKDT, 过程中没有FE出现。

  • 如第一个帖子谈到,我这里最近实验做起来不方便,只能大致试一下,但我试下来FE都是置位的。

    对于这个问题,我得到的回复如下:

    As SCI user guide mention:"A break condition occurs when the SCI receiver data line (SCIRXD) remains continuously low for at least ten bits,beginning after a missing first stop bit“.

    So RX line should cause a frame error,set SCIRXST[FE] ,then after this missing stop bit which cause frame error, if ten more bit durations are low on RX, then a BRKDT occurs,SCIRXST[BRKDT] set.

    Is there anything I have misunderstood?Does any other way cause BRKDT set and SCIRXST[FE] didn't set?

    You are correct that FE occurs first and then if at least ten more bit durations are low on RX, a BRKDT will occur.  This is the only way for a BRKDT to occur.

    另外这个帖子,楼主参考一下:

    e2e.ti.com/.../671664.aspx

    楼主如果最后找出原因记得分享一下。

  • Forrest:

    当我在DSP触发BRKDT的时候,重新初始化SCI,通讯恢复正常

     

    我重新修改了ISR函数大体如下

    if (RXERROR)

    {

    if(BRKDT){}

    else{

    pin1_toggle();

    pin2_toggle();

    }

    但实际的波形得出,当进入RXERROR后,基本都是由BRKDT触发标志位,FE没有出现,并且当总线出现长时间低电平时,FE没有被置位,而BRKDT不停的出现。

    在这两个标志位被置起是,我是通过清SCICTL1.5(SW RESET)来清除改标志位的。

  • 这个问题如之前谈到的,我试下来FE都是置位然后BRKDT再置位。得到的结果是没办法让BRKDT置位而FE不置位。

    既然您谈到“基本都是由BRKDT触发标志位,FE没有出现”;您能否写一个最简程序,用28027上的GPIO口连接28027的SCI模块,然后用GPIO口向SCI模拟发送数据,尝试产生BRKDT置位而FE不置位的现象。

    以便我能在这边重复这个现象然后帮您找到原因。

    另外FE位是SCIRXST的第5位,您也请看看您的头文件定义的是否正确。