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:我可以在 Rx 缓冲器中看到数据、但 SCIFFRX 说它不存在、而是#39。

Guru**** 2519150 points
Other Parts Discussed in Thread: C2000WARE, MOTORWARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1177721/tms320f28069m-i-can-see-data-in-rx-buffer-but-sciffrx-says-it-s-not-there

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

我正在为电机控制板(MCB)进行串行通信。 我将 InstaSpin 实验05b 用作模型。 我将 C2000Ware 中的示例作为起点、使串行通信作为独立应用程序完美地工作。 但是、当我尝试将 InstaSpin 实验05b 的 MotorWare 代码与该代码集成时、一切都会停止。 一位同事建议使用 MotorWare 原生的串行通信代码-这样一来、头文件中包含的任何定义的风险等... 彼此相邻的危险较小。 此板必须能够与 LCD 模块通信并从 LCD 模块获取方向。 LCD 模块使用转差协议每500ms 发送一次数据请求。 每当用户通过 LCD 更改参数时、它也会发送命令。 MCB 必须能够从 LCD 收集整个消息、响应数据请求(使用转差协议)、并执行任何更改(速度、扭矩限制等)。 LCD 模块请求的。

我可以在 SCIRXBUF 寄存器中看到数据、SCIFFRx 寄存器的 RXFFST 位指示 FIFO 中有数据。

我希望能够检查 SCIFFRx 寄存器的 FIFO 状态位、如果它们的值与 RXFFIL 的值匹配、我可以认为 FIFO 的内容是很好的数据、并且可以从 SCIRXBUF 中获取与 FIFO 深度(RXFFIL)相对应的多次数据。 我一开始只需将 FIFO 深度设置为1、就可以查看是否可以一次抓取一个字节。 运气差。 我将失败归因于我设置的 FIFO 深度与 FIFO 状态位中的数字不匹配。 这方面我可能错了。 我仍然不知道在这些情况下为什么我无法抓取缓冲区内容。 无论如何、我尝试了一种稍微不同的方法。

 

在主循环中使用“SCI_getDataNonBlocking”(MotorWare 本机的通信函数),该循环调用“SCI_rxDataReady”,如下所示:

 

static inline bool SCI_rxDataReady(SCI_Handle sciHandle)
{
  SCI_Obj *sci = (SCI_Obj *)sciHandle;
  bool status;

 // status = (sci->SCIRXST & SCI_SCIRXST_RXRDY_BITS) >> 6;
  status = (sci->SCIFFRX & SCI_SCIFFRX_FIFO_ST4_BIT) >> 10;
  

  return((bool)status);
} // end of SCI_rxDataReady() function

 

我在 sci.h 中按如下方式定义了 SCI_SCIFFRX_FIFO_ST4_BIT (其中发生了很多类似的定义):

#define SCI_SCIFFRX_FIFO_ST4_BIT     (1 << 10)

 

RXRDY 已注释掉,无法使用,因为我使用的是 FIFO。 我选择了深度4、因为这是 RXFFST 位看起来总是接地的地方。 我不确定原因,但 FIFO 状态位列出的 FIFO 深度始终为4。 任何… 我想我可以解决这个问题。 ‘s,“状态”始终为零,这是有原因的。 缓冲区中有数据、当我查看寄存器时、相关位(SCIFFRX 寄存器的位11)被置位、因此我看不到这是如何实现的。

 

我的理解是(或者可能是误解)当 FIFO 状态位的值超过 RXFFIL 位指定的值时、中断标志(RXFFINT)就会被置位。 因此,我想我可以使用此标志来确定 FIFO 中是否有必要的字节数,即使我没有显式使用中断。 因此、SCI_rxDataReady 重写为:

 

 

//! \return    The receive data status
static inline bool SCI_rxDataReady(SCI_Handle sciHandle)
{
  SCI_Obj *sci = (SCI_Obj *)sciHandle;
  bool status;

 // status = (sci->SCIRXST & SCI_SCIRXST_RXRDY_BITS) >> 6;
 // status = (sci->SCIFFRX & SCI_SCIFFRX_FIFO_ST4_BIT) >> 10;
  status = (sci->SCIFFRX & SCI_SCIFFRX_INT_BITS) >> 7;

  return((bool)status);
} // end of SCI_rxDataReady() function

 

其中 SCI_SCIFFRX_INT_BITS (在 sci.h 中)定义为:

#define SCI_SCIFFRX_INT_BITS         (1 << 7)

 

即使我可以看到寄存器中的 RXFFINT 位为1、状态仍然为零。

 

我只能想到的是,我仍然必须在设置中缺少一些特定于 FIFO 的东西,但我无法确定什么。

 

下面是设置 FIFO 以及串行通信的相关子例程。

void SCI_enableRxFifo(SCI_Handle sciHandle)
{
  SCI_Obj *sci = (SCI_Obj *)sciHandle;

  // Clear the appropriate RXFFIL bits.
  sci->SCIFFRX &= SCI_SCIFFRX_FIFO_RXFFIL_CLR_BITS;
  // Set the RXFFIL LSB to indicate a reset should be generated when there is 1 byte in FIFO.
  sci->SCIFFRX |= SCI_SCIFFRX_FIFO_RXFFIL_SET_BITS;

  // Set the FIFO Reset bit.
  sci->SCIFFRX |= SCI_SCIFFRX_FIFO_RESET_BITS;

  return;
} // end of SCI_enableRxFifo() function
 

 

其中、上面列出的清除和设置常量定义如下:

#define SCI_SCIFFRX_FIFO_RXFFIL_CLR_BITS0xe4  

#define SCI_SCIFFRX_FIFO_RXFFIL_SET_BITS 0x0004

 

与上述代码相关的注释最初是在我尝试检测一个字节时编写的。 但是,FIFO 状态位似乎总是指示已经收集了4个字节,因此我想我只会使用它进行滚动。 (在我确定了实际的 FIFO 级别之前,认为不值得更改注释。)

 

void HAL_setupSciB(HAL_Handle handle)
{
  HAL_Obj   *obj = (HAL_Obj *)handle;

  SCI_reset(obj->sciBHandle); // *
  SCI_enableTx(obj->sciBHandle); // *
  SCI_enableTxFifoEnh(obj->sciBHandle); //*
  SCI_enableTxFifo(obj->sciBHandle); // *
  SCI_clearTxFifoInt(obj->sciBHandle); // *
  //SCI_setTxDelay(obj->sciBHandle,0x0018);
  SCI_enableRx(obj->sciBHandle); // *
  SCI_resetRxFifo(obj->sciBHandle); // Empty Rx FIFO
  SCI_enableRxFifo(obj->sciBHandle); // *
  SCI_clearRxFifoInt(obj->sciBHandle); // *

  SCI_setBaudRate(obj->sciBHandle,SCI_BaudRate_115_2_kBaud); // *
  SCI_setCharLength(obj->sciBHandle,SCI_CharLength_8_Bits); // *
  SCI_enable(obj->sciBHandle); // *
/* All of these were echoed in scib_loop_init & scib_fifo_init, though not in the same order.
   There are additional setup routines in scib_loop_init & scib_fifo_init:
   SCI_resetTxFifo(sci_Reg_Handle); // Empty Tx FIFO
   SCI_resetRxFifo(sci_Reg_Handle); // Empty Rx FIFO
   SCI_clearAutoBaudDetect(sci_Reg_Handle);
   SCI_disableAutoBaudAlign(sci_Reg_Handle);
   SCI_enableTxInt(sci_Reg_Handle);// Enable RXRDY/BRKDT & Enable TXRDY interrupts.
   SCI_enableRxInt(sci_Reg_Handle);
   SCI_disableTxInt(sci_Reg_Handle);
   SCI_disableRxBreakInt(sci_Reg_Handle);//Disable  Receiver-buffer break
   SCI_disableLoopBack(sci_Reg_Handle);

*/


  return;
}  // end of HAL_setupSciB() function

 

scib_loop_init 和 scib_fifo_init (在上面的注释中提到)是我使用 C2000Ware 示例进行通信时使用的子例程。 我有串行通信、但当我尝试将 C2000Ware 代码与 MotorWare 代码集成时、会出现某种干扰。 在“HAL_setupSciB”末尾的注释中列出了几个子例程。 也许我应该使用其中一个或多个? 我已经尝试过其中的几个,但我不确定这里的操作顺序是否正确。

谢谢、

Dave

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

    您好、Dave、

    因此、即使有数据及其正确的数据、您也无法看到 RXRDY 位是否置位? 如果忽略状态位并读取数据(这只是用于调试)会发生什么情况? 结果是否符合预期?

    此致、

    Marlyn

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

    您好、Marlyn、

    使用 FIFO 时、RXRDY 位不能使用。 我正在检查  SCIFFRX 寄存器的 RXFFST 位(或 SCIFFRX 的 RXINT 位)。 当我查看 SCIFFRX 寄存器(只需在 CCS 中使用查看器)时、RXFFST 位指示 FIFO 中有4个"字节"。 但是、当我尝试检索 该信息并将其存储在变量中时、它始终返回零。 同样、 对于 RXINT 位。

    我不确定数据是否是正确的数据、但我现在发现这不是主要问题。 现在、如果缓冲区中有数据、我希望能够检索数据、无论数据是否正确。 我已经尝试删除了读取 RXBUF 时的所有条件。

    尽管 CCS 的寄存器查看器告诉我那里有数据、但当我尝试在代码中读取数据时、数据始终为零。

    我在主循环中有以下代码:

    //      if(SCI_getRxFifoStatus(sci_Reg_Handle) != SCI_FifoStatus_Empty)
    //       {
             //
             rx_in = (unsigned char)(SCI_getDataNonBlocking(sci_Reg_Handle, &success) & 0xFF); // collect rx buffer contents
    //       }

    这里是"SCI_getDataNonBlocking":

    uint16_t SCI_getDataNonBlocking(SCI_Handle sciHandle, uint16_t * success)
    {
      SCI_Obj *sci = (SCI_Obj *)sciHandle;
    
      //if(SCI_rxDataReady(sciHandle))
    //    {
          *success = true;
          return(sci->SCIRXBUF); 
    //    }
    
    //  *success = false;
    //  return(NULL);
    } // end of SCI_getDataNonBlocking() function

    在两个示例中都注释了一组代码、希望如果没有获取数据的条件、我可以得到 RXBUF 中的任何内容。 这种方法不起作用。

    谢谢、

    Dave

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

    Dave、

    我建议查看 MotorWare 中的 HAL 用户指南、如下所示、并参阅"6.7章。 使用 Motorware 中的 InstaSPIN 将 SCI/UART 功能添加到项目”。

    指南:motorware_hal_tutorial.pdf、位于"\ti\motorware\motorware_version\docs\Tutorial\motorware_hal_tutorial.pdf "

    此致、

    Marlyn

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

    谢谢 Marlyn! 我甚至不知道这是存在的。

    此致、

    Dave