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.

[参考译文] SCI/LIN 多次缓冲模式

Guru**** 2531950 points
Other Parts Discussed in Thread: RM44L920, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1245741/sci-lin-multi-buffered-mode

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

大家好、我使用的是 RM44L920  Hercules 微控制器。

我使用 SCI/LIN 模块作为串行接口与外部 CPU 通信。 SCI/LIN 模块通过以下设置进行配置:

  • 波特率:460800
  • 8个数据位、无奇偶校验位和一个停止位
  • 长度=0的多缓冲模式(响应字段有1个字节/字符)
  • 为组帧/溢出/奇偶校验错误、接收和中断检测启用中断

遗憾的是、在上电后、外部 CPU 以1.8MHz 的波特率向 RM44L920微控制器发送了大约200字节的数据。 因此、RM44L920 微控制器受阻于 LIN ISR (linLowLevelInterrupt)。 当外部 CPU 以 1.8MHz 波特率将数据发送至 Hercules 微控制器后、接收标志(INTVECT1 = 11/接收)会一直有效。 然而、SCI 标志寄存器中的位 FE (帧错误)从未设置为1、而 INTVECT1从未设置为6 (帧错误)、这是预期行为。

我想知道为什么不会生成错误中断(spnu608a、2018年3月、表26-4 (SCI/LIN 中断))。 相反、接收标志一直有效。

当我按如下方式更改 SCI/LIN 模块的设置时:

  • 波特率:460800
  • 8个数据位、无奇偶校验位和一个停止位
  • 长度=0的多缓冲模式(响应字段有1个字节/字符)
  • 仅为接收启用中断

 在外部 CPU 以1.8MHz 的波特率将数据发送到 Hercules 微控制器后、RM44L920微控制器仍停留在 LIN ISR (线性低级别中断)。 接收标志(INTVECT1 = 11/接收)始终有效。 然而、正如预期的那样、SCI 标志寄存器中的位 FE (帧错误)和 OE (溢出错误)被设定为1。

顺便说一下、当我将  SCI/LIN 模块设置为非多次缓冲模式时、一切都运行良好。 微控制器 不会卡在 ISR 上。 在使用 多缓冲模式时、是否遗漏了任何内容?

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

    尊敬的 Chunyan:

    我们已开始处理您的问题、并将尽快提供更新。

    --

    谢谢。此致、
    Jagadish。

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

     Jagadish、您好!

    您对此问题有任何更新吗?  

    此致、

    春岩市

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

    尊敬的 Chunyan:

    我过去从未见过与此行为相关的任何问题。

    在多次缓冲模式下、可能没有人经过测试出现错误行为。

    如果可能、请分享您的项目、否则、我将创建另一个项目并进行此测试。 此过程可能会有延迟。

    --

    谢谢。此致、
    Jagadish。

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

     Jagadish、您好!

    很遗憾、我无法与您分享我们的项目、因为它 涉及安全项目。 但是、我可以上传一些您可能需要重现问题的重要文件(uartQr (* scilinREG) sci/lin、地址为0xFFF7E400U)。  如果您有任何其他需要、请告诉我。  

    提前感谢您!

    此致、

    春岩市

    e2e.ti.com/.../uart.cppe2e.ti.com/.../uart.he2e.ti.com/.../fixed_5F00_size_5F00_fifo.he2e.ti.com/.../reg_5F00_sci.he2e.ti.com/.../3377.sys_5F00_vim.ce2e.ti.com/.../7271.sys_5F00_startup.c

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

    尊敬的 Chunyan:

    感谢您分享详细信息、我将在最后重现问题并查看行为。 请预计会有一些延迟。

    --

    谢谢。此致、
    Jagadish。

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

    尊敬的 Chunyan:

    我测试了您在 RM46中提到的问题、因为我没有 RM44板。 因为两个电路板几乎具有相同的硬件。

    在 RM46中、我不觉得您提到的问题、我的意思是、使用多缓冲和不使用多缓冲模式都可以获得 FE 错误。

    我创建了一个简单示例来测试此行为。 我将提供我遵循的代码和测试过程、因此请在您结束时对 RM44执行相同的操作、并让我知道结果。

    1.首先我使用9600波特率创建了一个 SCI 示例。

    此外、我还启用了您在上一张幻灯片中

    2.现在我用下面的函数在代码中启用了多次缓冲模式

    3、现在我只在调试模式下运行代码。

    4.现在、为了产生帧错误、我在端子侧给出了波特率不匹配。

    下面是终端侧应用中的

    5.在此之后、我通过 UART 从终端向板发送一个字符

    6.这达到了我在函数"linHighLevelInterrupt"的开头设置的断点

    7、现在您可以看到已设置的标志  

    您可以看到他们的第26位已设置、这是帧错误。

    因此、我向您提出的请求是请在您身边创建类似的示例、并查看基于此我们可以确认 FE 位是否在 RM44中运行的行为。

    下面是我测试的代码:

    e2e.ti.com/.../SCI_5F00_LIN_5F00_MulitBuffer_5F00_Mode_5F00_test_5F00_with_5F00_FE_5F00_RM46.zip

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!
    感谢您的答复。
    我会将我的代码与您的代码进行比较、并在必要时进行调整。 当我完成新代码的测试后、我会与您联系。 感谢您的帮助、并很快与您交谈!
    此致、
    春岩市

     

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

    Jagadish、您好!

    我已经发现了为什么微控制器卡在 LIN ISR (linLowLevelInterrupt)上、带有接收标志(INTVECT1 = 11/接收):
    我已经在多缓冲模式下从 RX 寄存器读取接收字节、这不会复位 RXRDY 标志。
    相反、应读取 LINRD0 / LINRD1寄存器、因为 根据长度设置、只能在多缓冲模式下通过从 LINRD0 / LINRD1寄存器读取来清除 RXRDY 标志。

    有趣的是、 与标准 UART 16550A 不同、SCIFORMAT->length 寄存器不仅设置接收触发电平、还确定缓冲区的大小。
    在我们的项目中、帧大小很灵活、因此 需要将长度设置为1字节。 此外、我们需要一种方法来防止高速率接收到的数据丢失。
    不幸的是、多缓冲模式(其中的长度 等于缓冲器的大小)的设计无法满足我们的要求。 在这种情况下、我们不会在多缓冲模式下运行 LIN/SCI。

    此外、HalCoGen 生成的结构对于小端字节序微控制器来说有点令人困惑:
    typedef 易失性结构体 linBase
    {
    UINT32 GCR0;/**< 0x0000:全局控制寄存器0 */
    UINT32 GCR1;/**< 0x0004:全局控制寄存器1 */
    UINT32 GCR2;/**< 0x0008:全局控制寄存器2 */
    UINT32 SETINT;/**< 0x000C:设置中断使能寄存器*/
    UINT32 CLEARINT;/**< 0x0010:清除中断使能寄存器*/
    UINT32 SETINTLVL;/**< 0x0014:设置中断级别寄存器*/
    UINT32 CLEARINTLVL;/**< 0x0018:设置中断级别寄存器*/
    UINT32 FLR;/**< 0x001C:中断标志寄存器*/
    UINT32 INTVECT0;/**< 0x0020:中断向量偏移量0 */
    UINT32 INTVECT1;/**< 0x0024:中断向量偏移量1 */
    UINT32格式;/**< 0x0028:格式控制寄存器*/
    UINT32 BRS;/**< 0x002C:波特率选择寄存器*/
    UINT32 ED;/**< 0x0030:仿真寄存器*/
    UINT32 RD;/**< 0x0034:接收数据寄存器*/
    UINT32 TD;/**< 0x0038:发送数据寄存器*/
    UINT32 PIO0;/**< 0x003C:引脚功能寄存器*/
    UINT32 PIO1;/**< 0x0040:引脚方向寄存器*/
    UINT32 PIO2;/**< 0x0044:寄存器中的引脚数据*/
    UINT32 PIO3;/**< 0x0048:引脚数据输出寄存器*/
    UINT32 PIO4;/**< 0x004C:引脚数据设置寄存器*/
    UINT32 PIO5;/**< 0x0050:引脚数据 CLR 寄存器*/
    UINT32 PIO6;/**< 0x0054:引脚开漏输出使能寄存器*/
    UINT32 PIO7;/**< 0x0058:引脚上拉/下拉禁用寄存器*/
    UINT32 PIO8;/**< 0x005C:引脚上拉/下拉选择寄存器*/
    UINT32 COMP;/**< 0x0060:比较寄存器*/
    UINT8 RDX[8U];/**< 0x0064-0x0068:Rx 缓冲区寄存器*/
    UINT32 MASK;/**< 0x006C:屏蔽寄存器*/
    UINT32 ID;/**< 0x0070:标识寄存器*/
    UINT8 TDx[8U];/**< 0x0074-0x0078:TX 缓冲寄存器*/
    UINT32 MBRSR;/**< 0x007C:最大波特率选择寄存器*/
    uint32 rsvd1[4U];/**< 0x0080 - 0x8C:保留*/
    UINT32 IODFTCTRL;/**< 0x0090:IODFT 环回寄存器*/
    }linbase_t;

    对于微控制器 RM44L920:
    RDX[0]对应于接收缓冲器3
    RDX[1]对应于接收缓冲区2
    RDX[2]对应于接收缓冲区1
    RDX[3]对应于接收缓冲区0
    RDX[4]对应于接收缓冲区7
    RDX[5]对应于接收缓冲区6
    RDX[6]对应于接收缓冲区5
    RDX[7]对应于接收缓冲区4
    应从 RDX[3]中读取接收到的字节。

    非常感谢您的支持!

    此致、
    春岩市