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.

[参考译文] TMS320F280025C:TMS320F280025C -在 Fram Header 之后、SCI 模式下的 Tx 被阻断约900µs μ s

Guru**** 2457760 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/994443/tms320f280025c-tms320f280025c---tx-in-sci-mode-is-blocked-approx-900-s-after-fram-header

器件型号:TMS320F280025C

您好、支持团队、

我们正在测试 SCI/LIN 模块中的 SCI 模式并发现以下行为

我们不能在帧头后发送有关900µs 的任何内容。 尽管 TXRDY 位为高电平、但 SCITD 中的数据不会发出。

为了进行简单说明、我每1ms 发送一个带有定时器0中断的字节0x55:

图例:蓝色:LIN、红色:TX、黄色:RX 绿色:测试引脚 while (! LinaRegs.SCIFLR.bit.TXRDY);

  • 数据的情况下运行。 一切都好。 字节0x55每1ms 发送一次。 好的
  • Rx 上的数据:
    • 在帧头中、TXRDY 为高电平、Tx 数据未发送(仍然正常)
    • 在帧头之后(2个光标/标尺之间、大约950µs μ s)、Tx 数据也不会发送、尽管 TXRDY 位已经为高电平(在第1个标尺上)????

 

代码初始化

EALLOW;

   /* Reset LIN/SCI module */
   LinaRegs.SCIPIO0.bit.RXFUNC = 0u;
   LinaRegs.SCIPIO0.bit.TXFUNC = 0u;
   LinaRegs.SCIGCR0.bit.RESET = 0u;
   LinaRegs.SCIGCR0.bit.RESET = 1u;

   LinaRegs.SCIGCR1.bit.SWnRST = 0u;    /* Enter Software Reset State */

   /* Enable SCI communications mode */
   LinaRegs.SCIGCR1.bit.TIMINGMODE = 1u;
   LinaRegs.SCIGCR1.bit.LINMODE  = 0u;

   LinaRegs.SCIGCR1.bit.COMMMODE  = 0u; /* Idle-line mode is used. */
   LinaRegs.SCIGCR1.bit.STOP  = 0u;     /* 1 Stop bit */
   LinaRegs.SCIGCR1.bit.PARITYENA = 0u; /* Disable parity check */
   LinaRegs.SCIGCR1.bit.MBUFMODE = 0u;  /* Disable multi-buffer mode */
   LinaRegs.SCIGCR1.bit.CONT = 1u;      /* Module set to complete operations when halted by debugger */
   LinaRegs.SCIGCR1.bit.LOOPBACK = 0u;  /* Disable Internal loopback for external communication */

   LinaRegs.SCIFORMAT.bit.CHAR = 7u;    /* Set character length as 8-bits */
   LinaRegs.SCIFORMAT.bit.LENGTH = 0u;   /* Set response field to 1 byte */

   /* Enable TX and RX pin control functionality */
   LinaRegs.SCIPIO0.bit.RXFUNC = 1u;
   LinaRegs.SCIPIO0.bit.TXFUNC = 1u;

   LinaRegs.BRSR.all = (BRSR_P | (BRSR_M << 24uL)); /* Set Baud Rate */

   LinaRegs.SCIGCR1.bit.CLK_MASTER = 1u;  /* Select the internal clock */

   LinaRegs.SCICLEARINT.all = 0xFF0023D2U; /* !< Diasble all interrupts */
   LinaRegs.SCISETINT.bit.SETRXINT = 1u;  /* Enable Rx Int */
   LinaRegs.SCISETINT.bit.SETFEINT = 1u;  /* Set framing-error interrupt */
   LinaRegs.SCISETINT.bit.SETOEINT = 1u;  /* Set overrun-error interrupt */
   LinaRegs.SCISETINT.bit.SETPEINT = 1u;  /* Set parity interrupt */
   LinaRegs.SCISETINT.bit.SETBRKDTINT = 1u;  /* Set break-detect interrupt */

   /* Enable transmit and receive */
   LinaRegs.SCIGCR1.bit.TXENA = 1u;
   LinaRegs.SCIGCR1.bit.RXENA = 1u;

   /* Finally exit SW reset and enter LIN ready state */
   LinaRegs.SCIGCR1.bit.SWnRST = 1u;

   IER |= M_INT8;                        /* Enable CPU which is connected to CPU */
   PieCtrlRegs.PIEIER8.bit.INTx9 = 1u;  /* Enable PIE  Group 8 interrupt 9 */

   PieVectTable.LINA_0_INT = &lin_ISR;  /* Map ISR functions */
   /* Enable global interrupt lines and clear status to known value */
   LinaRegs.LIN_GLB_INT_EN.bit.GLBINT0_EN = 1u;
   LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1u;

   EDIS;

代码 Lin 中断

  volatile u32 statusReg;
  volatile u16 dummy_data;

  statusReg = LinaRegs.SCIFLR.all;

  dummy_data = (l_u8)LinaRegs.SCIRD.bit.RD;

  // Clear module interrupt flag and global interrupt flag for line 0
  LinaRegs.SCIFLR.all = 0xFFFFFFFFuL;
  LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1u;

  /* Acknowledge this interrupt to receive more interrupts from same group */
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP8;

代码计时器中断

  while(!LinaRegs.SCIFLR.bit.TXRDY);
  GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
  LinaRegs.SCITD.bit.TD = 0x55;

  /* Acknowledge this interrupt to receive more interrupts from group 1 */
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在第一张没有延迟的图片上、为什么 RX 上没有数据? 第1张和第2张图片之间有何变化?

    此外、是否设置了任何错误标志? 是否可以转储 SCIFLR 寄存器?

    LINTX 和 LINRX 是否还连接到 LIN 总线?

    此致、

    Nirav

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nirav、您好!

    TX 未连接到 LIN 收发器(仅示波器)

    在第一张图片中、我使用 LIN 收发器的 Rx 断开电路板上的 RX。 => Rx 上没有数据=>没有 LIN 中断=>发送 Tx 没有任何问题

    在第二幅图中、我将电路板上的 RX 连接到 LIN 收发器的 Rx。 => Rx 上的数据(LIN 报头)=>帧着色器期间的 LIN 中断=>在帧着色器之后、Tx 被阻断大约900µs μ s

    当 Rx 连接到收发器时,我可以获得数据和中断,我检测到一个标头,PID,... 这里的一切都正常、但在标头之后、我无法在 Tx 上发送响应数据。 这就是我构建一个1ms 计时器的简单示例的原因、该示例显示在 LIN 帧头之后大约900µs μ s 的 Tx 数据被阻止。

    此致、

    问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Quy、

    感谢您的跟进! 需要注意的一点是:图像中的第二个光标稍微偏小。 TX 的启动实际上恰好在下一个1ms Timer0周期开始。

    这很重要、因为它显示了问题的原因实际上是中断!

    下面是这种情况发生的原因说明。

    LIN RX 数据正在被接收、并由一个中断 ISR 处理。

    TIMER0 ISR 将会触发、但 LIN RX ISR 仍在运行。 由于 LIN RX 仍在处理中、TIMER0会被跳过、直到它再次中断。

    请参阅以下图片以了解直观说明:

    LIN RX ISR 仍在处理:

    TIMER0 ISR 在下一个周期运行、因为没有其他中断在运行:

    因此、要解决此问题、您可以增加 TIMER0时间、或加快 LIN 传输速度。

    此致、

    Vince

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vince:

    您忽略了我的第一个帖子中的第三个屏幕截图:

    定时器中断与 LIN 报头不同步、我在这里发布的截屏是2种典型情况:

    -我的第一个帖子中的第二个屏幕截图:定时器中断恰好在标头(0 Tbit delay9、响应应该在那里发送=> LIN 响应空间= 0

    -我的第一个帖子中的第三个屏幕截图:计时器中断在 Header 之后的1ms 内发生、响应也应发送到那里。

    LIN 响应空间最大值= 0.8 Tbyte = 400µs μ s、20kBaud 和1ms 延迟不符合 LIN 标准

    此致、

    问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Quy、

    很抱歉、我看到您现在描述的内容、感谢您的澄清。

    我想尝试两种方法来帮助缩小可能的原因:

    1.您能否尝试将轮询 while 环路更改为轮询"TXEMPTY"? 因此、请使用类似于以下内容的内容:"while (!LinaRegs.SCIFLR.bit.TXEMPTY);"。 我这样做的理由是、查看 SCITXSHF 寄存器是否仍然被阻止、无法阻止之前被 RX ISR 中断的传输(具有剩余位)。 我们的典型轮询示例使用 TXEMPTY 而不是 TXRDY 进行检查。 如果这最终解决了问题、我们可以进一步调试此路由。

    2.您能否读取 SCIFLR 寄存器位并向我们提供此信息? 我想在三个位置看到这些标志:

    LIN 中断(1个读取):

      volatile u32 statusReg;
      volatile u16 dummy_data;
    
      statusReg = LinaRegs.SCIFLR.all;
    
      dummy_data = (l_u8)LinaRegs.SCIRD.bit.RD;
    
      // Clear module interrupt flag and global interrupt flag for line 0
      
      //***********************************
      // READ SCIFLR HERE (BEFORE CLEARING)
      //***********************************
      LinaRegs.SCIFLR.all = 0xFFFFFFFFuL;
      LinaRegs.LIN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1u;
    
      /* Acknowledge this interrupt to receive more interrupts from same group */
      PieCtrlRegs.PIEACK.all = PIEACK_GROUP8;

    TIMER0中断(2次读取):

      while(!LinaRegs.SCIFLR.bit.TXRDY);
      
      GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
      //******************************************
      // READ SCIFLR HERE (before transmit)
      //******************************************
      LinaRegs.SCITD.bit.TD = 0x55;
      //******************************************
      // READ SCIFLR HERE (after transmit)
      //******************************************
    
      /* Acknowledge this interrupt to receive more interrupts from group 1 */
      PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

    我想让这些地点的船旗地位来了解这架船是否发生了一些不同寻常的事情。

    再次感谢您的澄清。

    此致、

    Vince

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Vince:

    很抱歉耽误你的回答。

    由于该项目的紧迫性,我们现在不得不切换到 LIN 模式。 在 LIN 模式下、目前没有开放点。

    有时间时、我将回到 SCI 中的这个开放点。

    此致、

    问题