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.

[参考译文] F28377D SCI FIFO 中断问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/568554/f28377d-sci-fifo-interrupt-problem

Thread 中讨论的其他器件:controlSUITE

您好!

我使用 F28377D 演示 controlSUITE 代码2837xDSci_FFDLB。

有一个问题打扰了我、它是关于发送 FIFO 中断实现的。

在我阅读 SCI 技术文档时、TXFFIL 位的描述

TXFFIL4-0发送 FIFO 中断级别位。 当 FIFO 状态位(TXFFST4-0)和 FIFO 深度位(TXFFIL4-0)匹配(小于或等于)时、发送 FIFO 将产生中断。

 在我看来、如果 FFST 小于或等于 FFIL、它将执行 TX 中断来执行某些操作(在示例代码中发送数据)。

 如果我设置 TXFFIL = 0x2、并且我没有任何需要发送的数据。

在这种情况下、TXFFST  无疑将为零、但它将触发 TX 中断。(TXFFST = 0小于 TXFFIL = 2)

这意味着即使我没有任何要发送的数据、它也将连续执行中断。

是否有任何方法可以避免这种情况?  

谢谢!

 

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

    此帖子已于2017年2月2日编辑

    (二 原稿稿稿稿*****

    Shuen、

    我看到你的困惑。 该校验为"TXFFIL<=TXFFST"。 它不执行以下操作" TXFFST<=TXFFIL"。 若要将其转换为字、当 TXFFST 大于或等于 TXFFIL 时会触发中断。

    此致、
    Cody

    (二 结束原始帖子********

    上述信息不正确、更正后的信息可在  2017年1月26日 下午5:38的 Cody Watkins 的以下文章中找到。

    此致、
    Cody

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

    感谢您的回复

    如您所述、在这种情况下、当 TXFFST >= TXFFIL 时、应将其触发。

    我在 sciaTxFifoIsr 中命令发送数据代码、并在其中添加一个计数器、以便检查是否触发了 TX 中断。

    TXFFIL 被 2置位、在这种情况下、TXFFST 将为零(无数据发送)、并且它不能执行 TX 中断。 (TXFFIL>= TXFFST)

    但是、我的计数器目前仍在计数。

    下面随附了我的代码。

    void main (void)
    {
    uint16 I;
    
    //
    //步骤1。 初始化系统控制:
    // PLL、看门狗、启用外设时钟
    //此示例函数位于 F2837xD_sysctrl.c 文件中。
    //
    InitSysCtrl();
    
    //
    步骤2。 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    //
    InitGpio();
    
    //
    对于本示例,只初始化 SCI-A 端口的引脚。
    // GPIO_SetupPinMux ()-设置 GPxMUX1/2和 GPyMUX1/2寄存器位
    // GPIO_SetupPinOptions ()-设置 GPIO 的方向和配置
    //这些函数可在 F2837xD_GPIO_c 文件中找到。
    //
    GPIO_SetupPinMux (28、GPIO_MUX_CPU1、1);
    GPIO_SetupPinOptions (28、GPIO_input、 GPIO_PushPull);
    GPIO_SetupPinMux (29、GPIO_MUX_CPU1、1);
    GPIO_SetupPinOptions (29、 GPIO_OUTPUT、GPIO_异 步);
    
    //
    //步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    DINT;
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();
    
    //
    禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    使用指向 shell 中断
    //服务例程(ISR)的指针初始化 PIE 矢量表。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable ();
    
    //
    //本示例中使用的中断被重新映射到
    该文件中的// ISR 函数。
    //
    EALLOW;//需要这来写入 EALLOW 受保护寄存
    器 PieVectTable.SCIA_RX_INT =&sciaRxFifoIsr;
    PieVectTable.SCIA_TX_INT =&sciaTxFifoIsr;
    EDIS;//这是禁用写入 EALLOW 受保护的寄存
    
    
    
    
    
    
    
    器所必需的;GPALLOW = GPADRxFifoR1.GPIO4/ GPIOL.GPIORT.4/ GPIO4/ GPIORT.GPIO4/ GPIO4/ GPIO4/ GPIO1.GPIO4/ GPIO4/ GPIO1.GPIO4/ GPIO1.GPIO1.GPIORT.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1. 初始化设备外设:
    //
    scia_fifo_init ();//初始化 SCI-A
    
    //
    步骤5。 用户特定代码、启用中断:
    //
    // Init 发送数据。 每次传输后、此数据
    //将更新为下一次传输
    //
    
    //////* for (i = 0;i<2;i++)
    {
    sdataA[i]= i;
    }
    
    RDATA_pointA = sdataA[0];
    */
    
    //
    启用此示例所需的中断
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
    PieCtrlRegs.PIEIER9.bit.PIE
    =
    1;// INTIE9 = 1;PIE = 0x2 = 1;PIE 组= INIER9;PIE = 1 //启用 CPU INT
    ;
    
    
    //
    /步骤6。 空闲循环。 只需坐下来循环(可选):
    //
    for (;;);
    }
    
    
    
    中断 void sciaTxFifoIsr (void)
    {
    count++;
    
    /*
    for (i=0;i< 2;i++)
    {
    SciaRegs.SCITXBUF.all=sdataA[i];//发送数据
    }
    */
    *
    for (i=0;i< 2;i++) //递增发送下一个周期的数据
    {
    sdataA[i]=(sdataA[i]+1)和0x00FF;
    }
    *
    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
    PieCtrlRegs.PIEACK.All|=0x100; //发出 PIE ACK
    }
    
    中断空 sciaRxFifoIsr (void)
    {
    
    //* for (i=0;i<2;i++)
    {
    rdataA[i]=SciaRegs.SCIRXBUF.all;//读取数据
    }
    (
    i=0;i<2;i++)的*///* //检查接收到的数据
    {
    if (rdataA[i]!=(RDATA_pointA+I)& 0x00FF)
    {
    error();
    }
    }
    
    RDATA_pointA =(RDATA_pointA+1)和0x00FF;
    *
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志
    
    PieCtrlRegs.PIEACK.All|=0x100; //发出 PIE ack
    }
    
    void scia_fifo_init ()
    {
    SciaRegs.SCICCR.all = 0x0007; // 1停止位,无环回
    //无奇偶校验,8个字符位,
    //异步模式,空闲线协议
    SciaRegs.SCICTL1.all = 0x0003; //启用 TX、RX、内部 SCICLK、
    //禁用 RX ERR、SLEEP、TXWAKE
    //SciaRegs.SCICT2.bit.TXINTENA=1;
    //SciaRegs.SCICT2.bit.RXBINTENA=1;
    SciaRegs.SCIHBAUD.ALL = 0x00;
    SciaRegs.SCILBAUD.ALL = 0x6b;
    / SciaRegs.SCICLA.0X.US.CLK
    
    = 0x00.CLUS.CLUS=0x00.SCICK=0X.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.US.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.US.0.CLA = 0x00.SCRIS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.0.CLUS.US.CLUS.CLUS
    
    
    //从复位
    SciaRegs.SCIFFTX.bit.TXFIFORESET 中放弃 SCI = 1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
    } 

    当 TXFFST 大于或等于 TXFFIL 时、是否触发 TX 中断毫无意义。

    在这种情况下不应计数器。

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

    Shuen、

    很抱歉、我错误地向您描述了 TXFFIL 寄存器。 我向您介绍的是 RXFFIL 寄存器的工作方式。

    澄清:

    TXFFIL:在以下条件 TXFFIL<= TXFFST 期间产生中断。 当 SCI 正在运行而没有消息要发送时、您会收到此中断。 此时、CPU 需要向 SCI 模块提供更多消息。

    RXFFIL:在以下条件 RXFFIL >= RXFFST 时产生中断。 当 SCI RX FIFO 空间不足时、您会收到此中断。  此时、CPU 需要读取 从 SCI 模块接收到的消息。

    在您不发送数据的长时间内、您可以禁用中断。 或者、如果您的 SCI 不是很活跃、则更有意义的是不使用 FIFO 增强功能。

    此致、
    Cody

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Cody
    对我来说、一个好消息是、我不会误解 TXFFIL 的定义。
    然后、我尝试您关于启用和禁用中断的建议。
    它的工作非常完美!
    总之、感谢您的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Shuen、
    我很高兴听到您的解决方案正在发挥作用! 如果您有任何问题、请随时开始发布新帖子。

    此致、
    Cody