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.

[参考译文] TMS320F28069M:SCIB 接收器错误

Guru**** 2387080 points
Other Parts Discussed in Thread: SN65HVD485E, TMS320F28069M
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024561/tms320f28069m-scib-receiver-error

器件型号:TMS320F28069M
主题中讨论的其他器件:SN65HVD485E

我使用28069M SCIB 模块根据 Modbus-RTU 协议实现与编码器的 RS485通信。 28069M 板是定制的。 485chip 为 SN65HVD485。

GPIO40被配置为 SCITXDB;

GPIO41被配置为 SCIRXDB;

GPIO43被配置为方向控制;

MCU 作为主器件、编码器作为从器件。

SCIB 发送器中断和接收器中断全部启用;

发送器缓冲器和接收器缓冲器电平= 2;

当前的情况是、MCU 发送器似乎正常、因为编码器返回脉冲输出(如果发送到编码器的脉冲不正确、则编码器不会返回脉冲输出)。

但接收器在 CCS 调试窗口中显示如下错误:

由于产生了错误、因此无法进入接收中断。  

如何解决这个问题? 如有任何意见,请提出。

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

    您好!

    感谢您的提问! 如果 BRKDT 标志被置位、我怀疑 RX 线被拉低的时间比预期的要长(由编码器)。

    您能否通过在错误条件之前和期间获取 SCI-RX/TX 线的示波器图来验证?

    如果编码器的默认 TX 输出为低电平、这会有点奇怪、但如果是这种情况(示波器图将显示此情况)、则这将是错误的来源。

    此致、

    Vince

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

    感谢您的回答。 今天、我得到的示波器如下:

    通道1 (黄色)是28069 GPIO40 TX 上的脉冲;通道2 (蓝色)是28069 (GPIO41) RX 上的脉冲。  

    当前的情况是发送中断正在工作、但接收中断不起作用、因为发生接收错误。

    波特率为9600bps。   

    下面是 SCIB 模块设置;

    void scib_fifo_init()

    //下面是使用 RS485编码器通信的 SCI 操作;
    ScibRegs.SCICCR.all =0x0007;   // 1停止位,无环回
                                //无奇偶校验,8个字符位,
                                //异步模式,空闲线协议

    ScibRegs.SCICTL1.all =0x0003;   //启用 TX、RX、内部 SCICLK、
                                 //禁用 RX ERR、睡眠、TXWAKE

    ScibRegs.SCICTL1.bit.RXERRINTENA=0;       //接收器错误中断被启用

    ScibRegs.SCICTL2.bit.TXINTENA=1;          //启用 TXRDY 中断;
    ScibRegs.SCICTL2.bit.RXBKINTENA=1;        //启用 RXRDY/BRKDT 中断;
    ScibRegs.SCIHBAUD = 0x0001;               // 9600波特@LSPCLK = 22.5MHz (90MHz SYSCLK)。 复位默认值:90MHz/4=22.5Mzh;
    ScibRegs.SCILBAUD = 0x0024;               //24.

    ScibRegs.SCICCR.bit.LOOPBKENA=0;        //禁用回路
    ScibRegs.SCIFFTX.All=0xC022;              // SCI 复位;发送 FIFO 使能;发送 FIFO 中断级别=2;
    ScibRegs.SCIFFRX.All=0x0022;              //接收 FIFO 中断级别=2;中断被禁用;
    ScibRegs.SCIFFCT.All=0x0;                 // FIFO 传输延迟=0;(一帧到下一帧之间的延迟)

    ScibRegs.SCIFFTX.bit.TXFFINTCLR =1;
    ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;    //发送 FIFO 复位;

    ScibRegs.SCIFFRX.bit.RXFIFORESET=1;     //接收 FIFO 复位;
    ScibRegs.SCIFFRX.bit.RXFFINTCLR =1;
    ScibRegs.SCIFFRX.bit.RXFFIENA=1;        //

    ScibRegs.SCIPRI.bit.Soft = 1;             //完成当前接收/发送
    //停止前的顺序
    ScibRegs.SCIPRI.bit.FREE = 0;
    ScibRegs.SCIFFRX.bit.RXFFIL =2;           //接收 FIFO 中断级别=2;
    ScibRegs.SCICTL1.all =0x0023;             //发送使能;接收使能;重新使能 SCI;

    下面是接收中断子例程:

    _interrupt void scibRxFifoIsr (void)

       if ((timer0_count = 0)&&(signal_receive = 0))  
       {
         if (count_receive <=3)
         {
           uint16 i;
           for (i=0;i<2;i++)
           {
             recBuf[2*count_receive+i]= ScibRegs.SCIRXBUF.all;//读取数据
           }

          COUNT_Receive++;
         }

       否则、如果(COUNT_Receive >=4)  
       {
          signal_receive = 1;       
           COUNT_Receive = 0;      //复位
       }
      }

    ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;        //清除溢出标志
    ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;         //清除中断标志
    PieCtrlRegs.PIEACX.ALL |=0x100;              //发出 PIE ACK

    下面是计时器中断子例程、通信周期为100ms。  

    _interrupt void timer0Isr (void)


     if (timer0_count = 0)                达到//90ms 周期、10ms 周期开始;
     {

         ConfigCpuTimer (&CpuTimer0、90、10000);         //config 10ms 开始
         GpioDataRegs.GPBSET.bit.GPIO43 =1;           //发送方向使能
         timer0_count=1;                             //发送时间段的符号
         signal_transmit = 0;                           //启用发送

    否则、如果(timer0_count = 1)            达到//10ms 周期、90ms 周期开始

      ConfigCpuTimer (&CpuTimer0、90、90000);         //config 90ms 以开始
      GpioDataRegs.GPBCLEAR.bit.GPIO43 =1;         //接收方向使能
      timer0_count=0;                               //接收时间段的符号
      signal_receive=0;                              //启用接收

     CpuTimer0Regs.TCR.ALL = 0x4000;

    //确认此中断以从组1接收更多中断
    PieCtrlRegs.PIEACX.ALL |= PIEACK_Group1;

    请帮助我找出可能的原因、谢谢。

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

    您好!

    看起来我最初担心的问题是正确的:项目中使用的编码器在传输期间将 F2806x RX 线路拉低。 请参阅下图中有关问题的红色框。

    这不是 UART 协议的标准、会导致系统中出现中断检测。 这是有问题的、因为它始终会导致这样的错误。

    遗憾的是、这不是 F2806x 特有的问题、但是任何接收中断检测的 UART 器件 RX 都会将其标记为错误或特殊状态。

    因此、请联系编码器器件的支持团队以确定产生此"低脉冲"的原因、因为这是问题的根源和原因。

    一旦从编码器的输出中移除低电平脉冲、所有操作都应该正常!

    一旦消除低脉冲、我很乐意提供帮助!

    此致、

    Vince

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

    谢谢、Vince:

    粘贴的波形位于 DSP Tx 和 Rx 引脚上;这两个引脚与 sn65hvd485的 DI 和 RO 引脚连接。 而 sn65hvd485 A、B 引脚与编码器输出相连。 我使用的硬件电路如下:

    之前粘贴的示波器来自485芯片的 RO 引脚和 DI 引脚。

    我已经向编码器供应商询问了您提到的问题、他们告诉我编码器输出是标准 RS485。  我得到的示波器位于485芯片之后、而不是编码器输出上的示波器、因此他们猜芯片可能有一些问题。 今天、我已经测试了编码器输出 viz、sn65hvd485 A、B 引脚上的示波器、示波器如下:

    上行是485芯片的一个引脚、下行是 485芯片的 B 引脚。

    因此、编码器输出脉冲似乎总是有差异的、但在485芯片之后、RO 引脚在 DI 引脚有效传输期间处于低电平(之前粘贴的示波器)。  那么发生了什么事? 电路在某处有问题?  

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

    此外、在电路中、有两个电阻 R37、R38、这用于将485芯片的输出电压分压至低于3.3V、因为此芯片是5V 电源芯片、但28069x 是3.3V 并且不能耐受5V 电压。 我取出 R38并与 DSP 引脚断开连接,直接测试引脚 RO,在 DI 处于活动传输状态期间它也是低电平。 因此、它可能会得出结论、低电平不是由连接到 GND 的 R37引起的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="446019" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024561/tms320f28069m-scib-receiver-error/3789753 #3789753"]、这样可以得出结论:低电平不是由连接到 GND 的 R37引起的。  [/报价]

     当 其 RE 输入为高电平时、即 当28069x 在 RS485半双工接口上传输时、SN65HVD485E RO 接收器输出为高阻抗。

      28069x 在 RS485半双工接口上传输时、作为接收器输出上分压器一部分的 R37将下拉信号。

    为了避免接收错误、   当28069x 在 RS485半双工接口上传输时、28069x 上的 GPIO41接收引脚需要上拉。

    鉴于分压器需要从5V SN65HVD485E 输出转换为3.3V 28069x、因此不确定实现 这一目标的最简单方法。

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

    感谢 Gillon、

    我将检查 GPIO41的初始化、它在28069x 内部设置中被上拉启用;但我甚至还记得我已经使用上拉设置启用了引脚或禁用了引脚、结果相同。 总之、我将进行检查并再次进行测试。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="446019" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1024561/tms320f28069m-scib-receiver-error/3789977 #3789977"]我将检查在28069x 内部设置中启用上拉的 GPIO41的初始化;[/quot]

     TMS320F28069M 数据表显示、启用内部上拉电阻 的 GPIO 的典型电流为–140μA μ A。

    R37为2.2k 时、典型的上拉电流将导致0.3V、这小于 0.8V 的 VIL (最大值)、因此仍将被视为低电平。

    也许用一个3.3V 齐纳二极管替代 R37会将输入电压限制在 28069x 上、并且当  SN65HVD485E 接收器被禁用时、允许内部上拉电阻器将接收信号保持在高电平。

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

    您好!

    感谢您的电路图、这极大地解决了这个问题。 正如切斯特正确提到的、F2806x 的 RX 引脚(应该直接连接到收发器的 RO)被所示的电阻分压器下拉。

    有两种最佳方法可以解决这一问题、遗憾的是、这两种方法都需要重新对电路板进行处理:

    1.使用支持5V 电压的收发器(应尽量减少工作量和增加最少成本)。 TI 应拥有多个可满足您需求的 RS-485。

    或-

    2.使用通信电压电平转换器将收发器的5V 逻辑(F2806x 的)更改为3V 逻辑。 这需要另一个芯片、因此不理想。

    我建议完全避免使用电阻分压器网络的原因是:

    在电阻分压器接地的情况下、电阻分压器本身会下拉电压。 这就是您看到问题的原因。

    2. RX 引脚上的内联电阻(不在 TX 引脚上)会导致电阻不匹配、这不是理想值。

    最后、对第二组波形进行一些澄清:RS-485是一种差分通信、因此+和-将始终彼此相反。 数据输入和数据输出始终在两条线路上输出。

    收发器只需获取 F2806x-RX 和 F2806x-TX UART 数据并将 UART 协议(单端和0至5V)转换为 RS-485协议(差分+/-电压)。 不幸的是、此处选择的收发器用于3V UART 逻辑、需要更改为支持5V 逻辑的收发器、以实现最佳的开箱即用性能。

    此致、

    Vince

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

    感谢您的所有评论和解释。 实际上、我曾提到"低电平不是由连接到 GND 的 R37引起的"; 今天、我对其进行了测试以阐明这一点。  

    我已从 sn65hvd495芯片的"RO"引脚和 DSP"GPIO41"引脚上断开 R38。 则电路如下所示:

    然后、我在其中运行 CCS 程序并测试 SN65HVD485 "RO"和"DI"引脚上的波形、结果如下:

    在上图中、通道1 (黄色)是 SN65HVD485芯片的"DI"引脚上的波形、这是 DSP 向编码器传输的信号;通道2 (蓝色)是 SN65HVD485芯片的"RO"引脚的波形、这是编码器向 DSP 传输的信号。

    从示波器可以看出、Sn65HVD485芯片的"RO"引脚上仍然存在低电平、而不在该引脚上连接任何电阻器、该引脚现在处于悬空状态。  

    因此、"低电平"的主要原因并不是与 sn65hvd485芯片的"RO"引脚连接的电阻器引起的。

    下面是 sn65hvd485芯片的"A、B"引脚的示波器结果、该引脚从编码器传输到 sn65hvd485。  

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

    您好!

    RO 引脚仍需要一个自身的上拉电阻(通常它使用 F2806x-RX 引脚附近的上拉电阻、但是现在 F2806x-RX 有一个下拉电阻、并且收发器 RO 引脚悬空)。

    RX 引脚(在本例中为收发器的 RO 引脚)需要某种上拉电阻。 请通过前面提到的建议之一解决此问题、您将看到问题已解决。

    此致、

    Vince

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

    您好!

    谢谢 Vince 和 Gillion、我在485芯片的输出上设计了一个简单的电压电平电路后、问题就得到了解决。 如下所示的电路、

    我使用 PNP 晶体管实现5V 至3.3V 电平转换。

    我在 SCIB 的 DSP 引脚上得到以下波形;

    SCI 接收器中断正常工作。 尽管电压电平位移电路并不完美、因为它几乎是从示波器中看到的 DSP 引脚的最大4V 脉冲输入。  我认为这是由电压转换电路引起的、该电路设计可能不是很好、但问题已经解决。  

    再次感谢大家 的宝贵意见和建议、逐步帮助我。

    谢谢你。