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.

[参考译文] TMS570LC4357:SCI1、SCI2接收和发送丢失字节

Guru**** 2482105 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/904656/tms570lc4357-sci1-sci2-receive-and-transmit-lost-bytes

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

您好!  

我们将 SCI1和 SCI2用于不同长度的帧接收/传输应用。 在接收或传输数据时、存在字节丢失的问题。 我们在中断模式下使用 sci 模块。 我们已经验证了发送到 CPU RX 引脚的字节确实到达它们、 而从 CPU TX 引脚发出的字节到达我们的接收器。 但是、CPU 中的字节数与接收缓冲区中的字节数不一致。 同样、我们发送到发送缓冲区的字节数和来自 CPU 引脚的字节数也不一致。 我们实际上会在芯片中"丢失字节。 挑战在于、这不是一个持续的问题、它可能每5到20帧发生一次。

似乎有东西干扰接收/发送过程。

为了解决这一问题、我们通过 DMA 实现了该过程。 它在一定程度上解决了接收问题、因为它显著减少了我们丢失传入字节的次数、但由于 CPU 中仍然经常出现不完整的帧、因此不能进行传输。

此外,我们在没有 DMA 的 SCI4端口(通常用于另一个应用)上测试了该应用程序,它可以无缝工作。

我们的问题是:

与 SCI3/SCI4端口相比、SCI/Lin 端口的工作方式或配置方式有很大差异、这可能导致字节丢失问题。  也就是说、是否存在任何可能影响 SCI1/SCI2而不影响 sci3/sci4的进程。  

最棒的  

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

    您好、Ugo、

    SCI1/SCI2和 SCI3/SCI4之间的区别在于:

    SCI1/SCI2可用于 SCI 和 LIN

    SCI1/SCI2支持多缓冲模式

    您是否对 SCI1/2和 SCI3/4使用相同的测试代码? 您是否使用 HALCoGen 生成的 SCI 驱动程序?

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

    您好!  

    我们在执行测试时确保了 sci 配置是相同的、代码是通过 halcogen 生成的。  

    使用的代码也是相同的、我们只切换用于通信的 SCI 端口。

    正如我提到过的、这是一个间歇性问题、并且会不时发生。

    最棒的  

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

    您好!

    如果使用相同长度、是否会丢失任何字节?

    当您更改发送器侧的传输长度时、接收器如何知道该长度?  

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

    如果发送同一帧、似乎没有丢失字节、但是如果有不同大小的帧、则会丢失字节。  

    实际上、发送器似乎停止传输。 也就是说、它将发送前 X 个字节、但不发送帧的其余部分。

    我们验证了所有中断都在有效上升。 我们还关闭了用于发送的中断例程、没有任何更改。 我们还再次确认、这不是我们一方的硬件问题、因为我们在使用 TMS570LC43开发套件时遇到了同样的问题。  

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

    您好、Ugo、

    是的、这是与软件相关的问题。  

    在发送端、如果只有第一个 X 字节(之前的长度)被发送、帧长度的改变将不会生效。

    您可以定义自己的传输协议、以便在发送帧数据之前发送帧长度。 否则、接收器将忽略帧中的额外字节、挂起等待或新数据(新长度较小)。

    您能与我们分享您的代码吗?

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

    您好 QJ、  

    我将尝试找到一种方法来共享一些代码、因为它是高度集成的。  

    关于发送帧长度、由于它是 Modbus 服务器、因此不能遵循协议。  

    但是、仍然困扰我的一件事是、如果将 SCI1、SCI2端口作为软件、为什么我会遇到 SCI1、SCI2端口问题、而不是 sci4问题? 软件方面唯一改变的是应用端口的分配。  

    谢谢

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

    您好、Ugo、

    如果不使用多缓冲器、SCI1/2的作用与 SCI4相同。 我想知道根本原因。

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

    您好 QJ、  

    我们不使用多缓冲模式、

    我们确实运行了一些额外的测试、问题似乎出在 SCI1上更高的波特率(57200、115200)、而不管停止位/奇偶校验的数量如何。  

    这是 Halcogen 生成的初始化代码。 sci4也是如此

    /**-使 SCI1退出复位*/
    sciREG1->GCR0 = 0U;
    sciREG1->GCR0 = 1U;
    
    /**-禁用所有中断*/
    sciREG1->CLEARINT = 0xFFFFFFU;
    sciREG1->CLEARINTLVL = 0xFFFFFFU;
    
    /**-全局控制1 */
    sciREG1->GCR1 =(uint32)((uint32) 1U <<25U)//启用传输*/
    |(uint32)((uint32) 1U << 24U)/*启用接收*/
    |(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/
    |(uint32)((uint32)(2U-1U)<< 4U)/*停止位数*/
    |(uint32)((uint32) 0U << 3U)/*偶校验、否则为奇数*/
    |(uint32)((uint32) 0U << 2U)/*启用奇偶校验*/
    |(uint32)((uint32) 1U << 1U);/*异步计时模式*/
    
    /**-设置波特率*/
    sciREG1->BRS = 40U;/*波特率*/
    
    /**-传输长度*/
    sciREG1->format = 8U - 1U;/* length */
    
    /**-设置 SCI1引脚功能模式*/
    sciREG1->PIO0 =(uint32)((uint32) 1U << 2U)/* TX 引脚*
    |(uint32)((uint32) 1U << 1U);/* Rx 引脚*
    
    /**-设置 SCI1引脚默认输出值*/
    sciREG1->PIO3 =(uint32)((uint32) 0U << 2U)/* TX 引脚*
    |(uint32)((uint32) 0U << 1U);/* Rx 引脚*
    
    /**-设置 SCI1引脚输出方向*/
    sciREG1->PIO1 =(uint32)((uint32) 0U << 2U)/* TX 引脚*
    |(uint32)((uint32) 0U << 1U);/* Rx 引脚*
    
    /**-设置 SCI1引脚开漏使能*/
    sciREG1->PIO6 =(uint32)((uint32) 0U << 2U)/* TX 引脚*
    |(uint32)((uint32) 0U << 1U);/* Rx 引脚*
    
    /**-设置 SCI1引脚上拉/下拉使能*/
    sciREG1->PIO7=(uint32)((uint32) 0U << 2U)/* TX 引脚*
    |(uint32)((uint32) 0U << 1U);/* Rx 引脚*
    
    /**-设置 SCI1引脚上拉/下拉选择*/
    sciREG1->PIO8 =(uint32)((uint32) 1U << 2U)/* TX 引脚*
    |(uint32)((uint32) 1U << 1U);/* Rx 引脚*
    
    /**-设置中断级别*/
    sciREG1->SETINTLVL =(uint32)((uint32) 0U <<26U)//帧错误
    |(uint32)((uint32) 0U << 25U)/*溢出错误*/
    |(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
    |(uint32)((uint32) 0U << 9U)//接收*/
    |(uint32)((uint32) 0U << 8U)/*发送*/
    |(uint32)((uint32) 0U << 1U)/*唤醒*/
    |(uint32)((uint32) 0U << 0U);/*中断检测*
    
    /**-设置中断使能*/
    sciREG1->SETINT =(uint32)((uint32) 0U <<26U)//帧错误
    |(uint32)((uint32) 0U << 25U)/*溢出错误*/
    |(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
    |(uint32)((uint32) 1U <<9U)/*接收*/
    |(uint32)((uint32) 0U << 1U)/*唤醒*/
    |(uint32)((uint32) 0U << 0U);/*中断检测*
    
    /**-初始化全局传输变量*/
    G_sciTransfer_t[0U].mode =(uint32) 1U << 8U;
    G_sciTransfer_t[0U].TX_length = 0U;
    g_sciTransfer_t[0U].Rx_length = 0U;
    
    /**-最终启动 SCI1 */
    sciREG1->GCR1 |= 0x80U; 

     我们还想知道根本原因。  

    谢谢

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

    您好!

    TX 和 RX 都使用中断。 HALCoGen 生成的代码中没有问题。

    对于接收,您需要在发送器更改帧长度之前调用 sciReceive()来更新长度。