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.

[参考译文] CCS:为 SCI3启用 RX 中断

Guru**** 2618455 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/782349/ccs-enable-rx-interrupt-for-sci3

主题中讨论的其他器件:HALCOGEN

工具/软件:Code Composer Studio

我可以启用 TX 中断、这样就可以使用以下函数成功接收数据:

uint32_t thcp_hw_read_hercules (uint8_t*缓冲区、const uint32_t length)
{
uint32 bytes_read = 0;
uint32 bytes_TO_read =长度;

while (sciIsRxReady (thcp_hw_sci_BASE)&&(bytes_TO_Read > 0))
{
Buffer[bytes_read]= sciReceiveByte (thcp_hw_sci_BASE);
bytes_to 读取--;
bytes_read++;
}
返回 bytes_read
;} 
但启用 Rx 中断不起作用。 我在 HalCoGen 中启用了 SCI3 RX INT 并启用了相应的 VIM 通道。 
这种方法适用于 TX 中断、但不适用于 RX 中断。 我缺少什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    sciReceiveByte 函数用于在轮询模式下接收数据。

    要在启用中断时接收数据、您可以使用 sciReceive 函数。

    例如:

    sciInit();
    while ((scilinREG->FLR & 0x4)== 4);
    
    _enable_IRQ ();
    
    sciEnableNotification (scilinREG、SCI_RX_INT);
    
    sciReceive (scilinREG、TIZE1、(uint8 *)&RX_Text[0]);
    
    while (1); 

    void sciNotification (sciBASE-t * sci、uint32标志)
    {
    
    sciReceive (sci、TsIZE1、(uint8 *)&RX_Text[0]);
    
    返回;
    } 




    在 main 中、调用 sciReceive 来设置接收。 传输完成后、在 sciNotification SCI 中为下一次接收做好准备。
    您可以在函数声明或 HALCoGen 帮助->文件->源-> sci.c 中阅读有关 sciReceive 的更多信息

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的问题是、虽然在 sci->SETINT 内、SCI_RX_INT 被置位、但我在中不会获得任何 RX 中断
    void sciNotification (sciBASE-t * sci、uint32标志) (hL_notification.c)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    查看此主题 :e2e.ti.com/.../2788772
    您可以在附加的文件中找到 HALCoGen 和 CCS 项目。

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

    我发现从 SCI3接收时、我进入 ISR sci3HighLevelInterrupt。

    触发中断是预期的接收中断(VEC =11)。

    但 g_sciTransfer_t 结构内的 rx_lenight 为零。 这怎么会发生?

    空 sci3高 LEVELInterrupt (空)

    uint32 vec = sciREG3->intvecT0;
    uint8字节;
    /*用户代码开始(37)*/
    /*用户代码结束*/

    开关(VEC)

    案例1U:
    sciNotification (sciREG3、(uint32) SCI_WAKE_INT);
    中断;
    案例3U:
    sciNotification (sciREG3、(uint32) SCI_PE_INT);
    中断;
    案例6U:
    sciNotification (sciREG3、(uint32) SCI_FE_INT);
    中断;
    案例7U:
    sciNotification (sciREG3、(uint32) SCI_break_INT);
    中断;
    案例9U:
    sciNotification (sciREG3、(uint32) SCI_OE_INT);
    中断;

    案例11U:
    /*接收*/
    字节=(uint8)(sciREG3->RD & 0x000000FFU);

    如果(g_sciTransfer_t[2U].rx_length > 0U) // rx_length 为零!!??

    *g_sciTransfer_t[2U].rx_data =字节;
    G_sciTransfer_t[2U].rx_data++;
    g_sciTransfer_t[2U].rx_length--;
    if (g_sciTransfer_t[2U].rx_length == 0U)

    sciNotification (sciREG3、(uint32) SCI_RX_INT);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    sciReceive、当使用中断模式时、设置 Rx.length 和指向数据的指针、并立即返回。 传输完成后、需要为下一个接收设置长度。 通常这是在 sciNotification 中完成的。

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、Miro、
    我想在 sciNotification()中使用 sciReceeive()来读取数据,但我的问题是,sciNotification()没有被调用,因为 rx_length ==0
    从 hl_sci.c、sci3HighLevelInterrupt ():

    案例11U:
    /*接收*/
    字节=(uint8)(sciREG3->RD & 0x000000FFU);

    if (g_sciTransfer_t[2U].rx_length > 0U)

    /////////////////////////////////////////////////////////// 我们不在此输入////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    *g_sciTransfer_t[2U].rx_data =字节;
    G_sciTransfer_t[2U].rx_data++;
    g_sciTransfer_t[2U].rx_length--;
    if (g_sciTransfer_t[2U].rx_length == 0U)

    sciNotification (sciREG3、(uint32) SCI_RX_INT);

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

    Matthias、您好!
    在中断模式下、在接收数据之前必须调用 sciReceive。

    调用 void sciReceive (sciBASE-t * sci、uint32 length、uint8 * data)时、函数设置:
    G_sciTransfer_t[index].rx_length =长度;

    G_sciTransfer_t[index].rx_data =数据;
    然后立即返回。

    设置 g_sciTransfer_t[index].rx_length 和 g_sciTransfer_t[index].rx_data 后、sci 就可以在中断模式下接收数据了。
    当在 sci 缓冲区中接收到新数据时、将生成中断并
    如果(g_sciTransfer_t[2U].rx_length > 0U)为 true。 ISR 将数据从 sci 缓冲区移动到存储器(此处实际上是"接收"数据的位置):

    *g_sciTransfer_t[2U].rx_data =字节;
    G_sciTransfer_t[2U].rx_data++;
    g_sciTransfer_t[2U].rx_length--;

    接收到所有数据后、长度将为0、调用 sciNotification。

    if (g_sciTransfer_t[2U].rx_length == 0U)

    sciNotification (sciREG3、(uint32) SCI_RX_INT);


    然后、在 sciNotification 中、您应该再次调用 sciReceive 进行设置
    G_sciTransfer_t[index].rx_length =长度;

    G_sciTransfer_t[index].rx_data =数据;

    例程将再次立即返回、并且 SCI 将为中断模式下的下一次接收做好准备(长度指针被设定)

    此致、
    米罗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对吗、每个触发的中断只能读取一个字节(在 sci3HighLevelInterrupt 中减1)?
    在哪里可以找到有关 sciReceive 语义的文档?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    是的、你是对的。
    当 SCI 将新接收的数据从 SCIRXSHF 传输到 SCIRD 时、接收就绪(RXRDY)标志被置位。 因此、RXRDY 标志指示 SCI 有新的数据要读取。 当 SCI 置位 RXRDY 标志时、如果置位 RX INT、则会产生接收中断。 可以在中断服务程序中读取接收到的数据。
    sciReceive 的描述可在函数声明位置找到,也可在 HALCoGen 帮助->帮助主题->文件->文件列表->源-> sci.c 中找到

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

    现在我尝试使用轮询模式、而不是中断模式。

    我的读取函数看起来是什么样的

    uint32_t thcp_hw_read_hercules (uint8_t*缓冲器、const uint32_t max_length)

    uint32_t bytes_read = 0;
    uint32_t bytes_TO_read = max_length;

    while ((sciIsRxReady (thcp_hw_sci_BASE)!= 0)&&(bytes_TO_Read >0)//在此处, SCI_RX_INT 在 sci->FLR 中设置

    uint32_t my_Byte = sciReceiveByte (thcp_hw_sci_BASE);//在这里、不再设置 SCI_RX_INT、它会不停地循环!

    Buffer[bytes_read]=(uint8_t)(my_BYTE & 0xFF);
    bytes_read++;
    bytes_to 读取--;


    返回 bytes_read;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Matthias、您好!
    您也可以在轮询模式下使用 sciReceive 接收数据。
    这部分代码检查 SCI RX 中断是否被启用:
    if (((sci->SETINT &(UINT32) SCI_RX_INT)==(UINT32) SCI_RX_INT)

    如果 SCI RX 中断未启用、则使用轮询方法(后面的代码)。

    在轮询方法中、轮询 RX RDY 标志。 当数据从 SCIRXSHF 传输到 SCIRD RX RDY 标志被设置为1时。
    sciReceiveByte 在这里执行此操作:
    while (((sci->FLR &(uint32) SCI_RX_INT)== 0U)
    当 RX RDY 标志被置位(数据从 SCIRXSHF 传输到 SCIRD)时、sciReceibyte 返回接收到的数据。

    sciIsRxReady 检查 RX RDY 标志、并在 RX RDY 标志为1时返回 true。
    这也在 sciReceiveByte 中进行了检查。

    如果未接收到数据、则 sciReceiveByte 将循环。

    此致、
    米罗