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.

[参考译文] TMS320F28069:CSI Tx 中断问题

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/742131/tms320f28069-csi-tx-interrupt-question

器件型号:TMS320F28069

您好!

我在我的代码中设置一个 SCI 中断、如下 所示:

   EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
   PieVectTable.SCIRXINTA =&sciaRxFifoIsr;
   EDIS;  //这是禁止写入 EALLOW 受保护寄存器所必需的

   scia_fifo_init (); //初始化 SCI-A

void scia_fifo_init()

  SciaRegs.SCICCR.all =0x0007;  // 1停止位, 无回路
                                 //无奇偶校验,8个字符位,
                                 //异步模式,空闲线协议
  SciaRegs.SCICTL1.all =0x0003; //启用 TX、RX、内部 SCICLK、
                                 //禁用 RX ERR、睡眠、TXWAKE
  SciaRegs.SCICTL2.bit.TXINTENA=1;
  SciaRegs.SCICTL2.bit.RXBKINTENA=1;
  SciaRegs.SCIHBAUD = 0x0000;
  SciaRegs.SCILBAUD = 0xC4;//14400
  SciaRegs.SCIFFTX.All=0xC022;
  SciaRegs.SCIFFRX.All=0x0022;
  SciaRegs.SCIFFCT.All=0x00;
  SciaRegs.SCICTL1.all =0x0023;    //从复位中撤回 SCI
  SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
  SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

这是我的 ISR:

_interrupt void sciaRxFifoIsr (void)


   GpioDataRegs.GPBTOGGLE.bit.GPIO39=1;

   if (SciaRegs.SCIRXST.bit.RXERROR){
   SciaRegs.SCICTL1.bit.SWRESET=0;//将低电平有效复位。
   SciaRegs.SCICTL1.bit.SWRESET=1;
   }

   SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;  //清除溢出标志
   SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;  //清除中断标志

   PieCtrlRegs.PIEACX.All|=0x100;      //发出 PIE ACK


我注意到、当我使用 PC 键盘发送字符或数字(来自 Terra Term)时、我必须按两次所选键盘按钮才能获得中断。 我在调试器中检查了它、也使用了 LED。 仅当我发送两次字符时、LED 才会切换。

这个 SCI 接口是如何在这个芯片上工作的?

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

    检查 FIFO 中断级别位。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请提供更多详细信息:我需要在哪些寄存器中检查这些 FIFO 位?

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

    请参阅 F28069 TRM SCI 一章并查看 FIFO 寄存器:

    www.ti.com/lit/SPRUH18

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

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

    你好 Ken!

    感谢您的更新! 实际上、我尝试更改了 SCIFFRx 寄存器0-4位的电平位、但我没有看到前面所述的行为发生任何变化。 但是、当我注释掉这一行://SciaRegs.SCIFFTX.ALL=0xC022;在我的 SCI 设置函数(void scia_fifo_init ())中、即使我的 FIFO 级别设置为2:SciaRegs.SCIFFRX.ALL=0x0022、我也能够在我发送的每个字符之后获得中断; 实际上、我在 SCIFFRx 的0-4位中输入什么值无关紧要、始终一个字符会生成一个中断。 不确定为什么 SCIFFTX 影响 FIFO RX 的行为。

    谢谢、

    Farid

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

    要使用 SCI FIFO、必须使能- SCIFFTX 中的 SCIFFENA 位14。 当您包含"sciaRegs.SCIFFTX.All=0xC022;"行时、FIFO 被启用(对于2个字)。 通过注释掉该行、您禁用了 FIFO、因此收到了每个字符的中断。 在任何情况下、它看起来就像您现在在工作一样。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Ken 的回复。 我不再讨论 SCIFFTX。 我只有一个接收中断、其设置如下:

    SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
    SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCIHBAUD = 0x0000;
    SciaRegs.SCILBAUD = SCI_PRD;
    SciaRegs.SCICCR.bit.LOOPBKENA=1;//启用回路
    SciaRegs.SCIFFRX.All=0x0022;
    SciaRegs.SCIFFCT.All=0x00;

    SciaRegs.SCICTL1.all =0x0023; //从复位中撤回 SCI
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

    但我无法再更改 FIFO 级别。 我只能在每个发送的字的 RX 中断上接收。 为了在接收到2个字符后获得中断、我还需要更改什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Farid、

    是的、我意识到您在接收到两个字后需要一个中断。 从我之前的帖子中、您将需要启用- SCIFFTX 中的 SCIFFENA 位14。 这将启用发送和接收 FIFO。 在 F2806x TRM 中、见886页的图13-10、注意 SCIFFENA 控制 TX 和 RX FIFO:

    www.ti.com/lit/SPRUH18

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我更改了下面的代码、以便在发送4个字符后可以接收到中断、但在仅发送2个字符后我会收到中断>我在这里缺少什么? 谢谢!

    SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
    SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCIHBAUD = 0x0000;
    SciaRegs.SCILBAUD = 0xC4;//14400
    SciaRegs.SCIFFTX.All=0xC022;
    SciaRegs.SCIFFRX.All=0x0024;
    SciaRegs.SCIFFCT.All=0x00;

    SciaRegs.SCICTL1.all =0x0023; //从复位中撤回 SCI
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Farid、

    TX FIFO 设置为在发送2个字符(而不是4个字符)后产生中断、RX FIFO 设置为在接收4个字符后产生中断。 同样、请参阅 TRM。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有些事情仍然不对。 如上所述、我将 Rx FIFO 置1、以便在发送4个字符后生成 RX 中断、这是正确的。 我对 TX 中断不感兴趣。 但是、在发送2个字符而不是4个字符后、我会收到 RX 中断。 我在这里缺少任何其他位配置。

    即使采用如下设置、发送4个字符后也不会收到中断:

    void scia_fifo_init()

    SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
    SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
    SciaRegs.SCICTL2.bit.TXINTENA=1;
    SciaRegs.SCICTL2.bit.RXBKINTENA=1;
    SciaRegs.SCIHBAUD = 0x0000;
    SciaRegs.SCILBAUD = 0xC4;//14400
    SciaRegs.SCIFFTX.All=0xC024;
    SciaRegs.SCIFFRX.All=0x0024;
    SciaRegs.SCIFFCT.All=0x00;

    SciaRegs.SCICTL1.all =0x0023; //从复位中撤回 SCI
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;

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

    检查以确保波特率匹配。 此外、请尝试以较低的波特率进行通信、以隔离任何硬件问题。

    - Ken