主题中讨论的其他器件:C2000WARE、 MOTORWARE
我正在为电机控制板(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