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:TMS570LC4357::MibSPI 主从通信

Guru**** 2392905 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1213532/tms570lc4357-tms570lc4357-mibspi-master-and-slave-communication

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

TI 团队、

我有一个关于两个 LaunchPad (LaunchXL2-TMS570LC4357)之间 MibSPI 通信的简单问题。 一个板配置为主板、另一个板配置为从板。 主器件的 HALCoGen 配置如下图所示:

从器件配置也相同、但有两个区别:

  • 主模式备忘框为 未校验
  • "内部时钟"复选框为 未校验  

这两个电路板均通过外部接头连接、如下图所示:

主器件和从器件的 HL_sys_main.c 文件如下:

e2e.ti.com/.../2313.Master.c

e2e.ti.com/.../0576.slave.c

问题说明:

  • 主程序似乎工作正常、因为我可以在示波器和 CCS 控制台上以及在 CCS 控制台上看到传输的数据/
  • 我无法在从设备中接收任何数据。

我认为从器件的 HALCoGen 配置中有一些小错误、而从器件的 HL_sys_main.c 文件中也有一些逻辑错误。 有人能帮忙吗?

此致、

特里韦迪

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

    尊敬的  Trivedi:

    如果未使用 SPI 使能信号、MibSPI 主器件应等待6个 VCLK 周期、然后再发送 SPI 时钟来开始事务。  

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

    感谢王的及时回应!

    如果未使用 SPI 使能信号、则 MibSPI 主器件应等待6个 VCLK 周期、然后再发送 SPI 时钟以开始事务。  [/报价]

    我曾提到 适用于 TMS570LC4357 器件的 TRM、并对此有过一定的了解。 我再次提到 TRM、并在继续我的问题时注意到以下几点:

    • 为了将器件配置为受控模式、只需清除 CLKMOD 和主控位。 这可以通过以下方式来实现:
      • HALCoGen --> MIBSPI1--> MIBSPI1 Global --> Master Mode and Internal Clock 复选框。  
      • 问题1: 这种理解是否正确,或者还有其他需要考虑的事项吗?
    • 问题2: 如果我想使用3引脚 MibSPI 模式(只适用于 MOSI、MISO 和 SCLK、没有 CS 和 ENA 引脚)、那么我之前分享的代码需要进行哪些修改?
    • 问题3: 如果我想使用4引脚 MibSPI 模式、即 MOSI、MISO、SCLK 和 ENA 引脚、那么我的 HALCoGen 配置应该是什么? 我是否应该在主器件和从器件配置中选中"Wait for Enable"复选框?

    此致、

    特里韦迪

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

    还有一个问题 Wang!

    由于我的实现基于中断、该6 VCLK 真的很重要吗? 是否应该在接收到数据后立即生成中断、是在6 VLCK 或60 VCLK 之后?

    此外、由于 VCLK 为75MHz 且 SCLK 约为1MHz、因此在 SCLK 启动之前、将完成许多 VCLK。  

    此致、

    特里韦迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题1: 这种理解是否正确,或者还有其他需要考虑的问题吗?

    您是对的。 SPI 时钟由 SPI 主器件提供。

    问题2: 如果我想使用3引脚 MibSPI 模式(仅 MOSI、MISO 和 SCLK、无 CS 和 ENA 引脚)、那么我之前分享的代码中需要进行哪些修改?

    在 Mispi 从模式下、只有 SPI nCS 引脚可以触发传输组(TG)。 在 3引脚模式下、只 可以触发 TG0。  TGxCTRL 的 PRST 字段应清零。

    问题3: 如果我想使用4引脚 MibSPI 模式、即 MOSI、MISO、SCLK 和 ENA 引脚、那么我的 HALCoGen 配置应该是什么? 我是否要选中主配置和从配置中的"等待启用"复选框?

    是的、应在主器件侧检查"Wait for enable"。 与#2相同,只有 TG0用于接收数据。

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

    如果没有额外的6个 vclk 周期延迟、从器件可能无法传输正确的数据。

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

    您好、Wang:

    在 Mispi 从模式下,只有 SPI nCS 引脚可触发传输组(TG)。 在 3引脚模式下、只 可以触发 TG0。  TGxCTRL 的 PRST 字段应清零。

    这仍然没有回答我的问题。 我了解到、在3引脚模式下、我只能将 TG0用于 MibSPI 通信。 如果您在初始查询中查看我的代码、我将仅使用 TG0。 但是、我仍然没有收到任何数据。 我已经为 TG0启用了针对 MibSPI 通信的组通知。 因此、如果在6 VCLK 主器件发送时钟和数据后、TMS570从器件应能够接收数据、并且应在接收到数据后立即生成中断。 不过,我无法这样做。

    我浏览过 TRM、觉得也一样。 但我仍不透彻的理解:

    • 如何清除 PRST?
    • 我需要多久清除一次 PRST 字段?

    您是否有在从配置下工作的 TMS570LC4357的示例项目? 您能否共享它?

    此致、

    特里韦迪

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

    另外、正如我的屏幕截图中突出显示的那样、"芯片选择"已突出显示为 CS_0、对于三引脚模式、是否为 CS_None?

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

    尊敬的  Trivedi:

    对于3引脚模式、请将 SPI 从器件的 CS0配置为 GIO 模式?

    mibspiREG1->PC0 =(UINT32)((UINT32) 0u << 0U)   /* SCS[0]*/
                    |(UINT32)((UINT32)0U<<1U)   /* SCS[1]*/
                    |(UINT32)((UINT32)0U<< 2U)/* SCS[2]*/
                    |(UINT32)((UINT32) 0U << 3U)/* SCS[3]*/
                    |(UINT32)((UINT32)0U << 4U )/* SCS[4]*/
                    |(UINT32)((UINT32) 0U<<5U)/* SCS[5]*/
                    |(UINT32)((UINT32) 0U<< 8U)/* ENA */
                    |(UINT32)((UINT32) 1U<<9U)/* CLK */
                    |(UINT32)((UINT32) 1U << 10U)/* SIMO */
                    |(UINT32)((UINT32) 1U <<11U);/* SOMI */

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

    您好、Wang:

    我仍然无法理解这一点。 根据我对 MibSPI 配置的理解、我准备了一个 PPT 和一个 Doc. 您能详细介绍一下并告诉我解决办法吗?  

    P.S.: PPT 和 DOC 将更有助于理解这个概念的系统方式,因此要求你建议一个基于它的回应。

    此致、

    特里韦迪

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

    尊敬的  Trivedi:

    我没有看到 ppt 和 doc 文件。  

    这是三引脚模式配置:

    您是否在图表中错过了 MISO 信号?

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

    对于失踪的附件王某表示歉意。 谨随函附上该说明。  

    e2e.ti.com/.../MibSPI-communication-for-TMS570.pptx

    e2e.ti.com/.../MibSPI-documentation.docx

    您是否在图表中错过了 MISO 信号?

    [/报价]

    没有王。 我没有错过 MISO 引脚。  

    谢谢。此致、

    特里韦迪  

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

    尊敬的  Trivedi:

    您的代码看起来没有问题。  由于未使用 CS、请按照您消息中所述选择 CS_None。

    此外,正如我的屏幕截图中突出显示的那样,芯片选择已突出显示为 CS_0,对于三针模式,是否为 CS_None?

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

    感谢王的回复。 它可以正常工作、我能够在从设备上看到数据。 在你们的答复和我的实施中,我仍有以下问题:

    1. 主程序和从程序不会自主运行。 也就是说、我必须同时对主器件和从器件进入调试模式、然后逐步执行以查看结果。 如果我按播放按钮看到代码执行、代码将在中间的某个位置停止。 此外、在这种情况下、从器件接收的数据不正确。  
    2. 代码中有效的16个字节作为 TG0。 如果我将 TG0配置为128字节、则从器件会显示一些随机值。 我需要对该代码进行缩放、以获得256字节的 TG0。

    请查看随附的 c 文件和错误的数据接收屏幕截图。

    TI E2E 论坛不允许我上传 HALCoGen 文件。  

    e2e.ti.com/.../7635.HL_5F00_sys_5F00_main.c

    e2e.ti.com/.../7635.HL_5F00_sys_5F00_main.c

    Br、

    特里韦迪

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

    尊敬的 Trivedi:

    当 TG0有128个缓冲器时、TX 完成中断不会在传输完成后产生。 请参阅器件勘误表:MIBSP#136

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

    MibSPI1支持256个缓冲器。 但 MibSPI 默认支持多达128个缓冲区。 请参阅有关使用扩展缓冲区的以下主题:

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103353/rm57l843-enabling-256-buffers-extended_buf_ena-feature-of-mibspi1/4089355?tisearch=e2e-sitesearch&keymatch=TG%20AND%20256#4089355

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

    您好、Wang:

    当 TG0有128个缓冲器时、TX 完成中断不会在传输完成后产生。 请参阅器件勘误表:MIBSP#136

    [/报价]

    我试图实现这一点,但是,它没有显示预期的结果。 请查看下面的屏幕截图。 初始值为0x7F UB LPEND 字段的 LTGPEND 寄存器现在更新为0x80。 为此、我在 HL_mibspi.c 中添加了以下代码段。

    添加此行后、我可以看到 LPEND 字段中的值为0x80。 我希望这就是您要求我实现的、以启用128字节 TG0 MIBSPI 传输。

    但是、接收到的数据仍然不正确。 请在下图中填入相同内容:

    此外、随附的还有屏幕录制内容、供您随时参考。  

    第1部分:

    e2e.ti.com/.../part2_5F00_1.mp4

    第2部分:

    e2e.ti.com/.../part2_5F00_2.mp4

    另外、如果您看到、对于从器件、寄存器  LTGPEND 的值 已更新为0x01008000。 之前的值为0x00008000。 这仍然正确吗?

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    另一方面、我必须使用匝数比才能使 MibSPI 正常工作。 持续传输和接收不工作。 请查看下面随附的视频以供参考。  

    第1部分:

    e2e.ti.com/.../part1_5F00_1.mp4

    第2部分:

    e2e.ti.com/.../part1_5F00_2.mp4

    希望大家都能理解这两个问题。 如果您希望我进一步阐述我的问题或要求我进一步提供意见,请告诉我。  

    Br、

    特里韦迪

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

    注:如果无法在浏览器上播放视频,请在下载视频后尝试通过 VLC 媒体播放器播放视频。

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

    为什么将 SPI 主器件配置为环回?  

    对于 SPI 从设备、不会将任何数据写入 SPI 传输组。  

     mibspiSetData (...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么要为回送配置 SPI 主设备?  [/报价]

    仅供我参考/验证。 它与我的终端应用无关。

    对于 SPI 从设备、不会将任何数据写入 SPI 传输组。  

     mibspiSetData (...)

    [/报价]

    是强制的吗? 我只想在从器件上接收数据。 它不起作用吗?

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

    还有一点:

    mibspiREG1->TGCTRL[1U]=(UINT32)((UINT32) 1U << 30U)              /*单触发*/
                            |(UINT32)((UINT32) 0U<<29U)              /*当前复位*/
                            |(uint32)((uint32) TRG_Always << 20U)   /*触发事件*/
                            |(UINT32)((UINT32) TRG_DISABLED << 16U)  /*触发源*/
                            |(UINT32)((UINT32) 128U<< 8U );        /*启动缓冲区*/

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

    您好、Wang:

    mibspiREG1->TGCTRL[1U]=(UINT32)((UINT32) 1U <<30U)              /*单触发*/
                            |(UINT32)((UINT32) 0U<<29U)              /*当前复位*/
                            |(uint32)((uint32) TRG_Always << 20U)   /*触发事件*/
                            |(UINT32)((UINT32) TRG_DISABLED << 16U)  /*触发源*/
                            |(UINT32)((UINT32) 128U<< 8U );        /*开始缓冲区*/

    我不明白你在这里建议什么。 它在 hl_mibspi.c 文件中与此完全相同(请参阅随附的图像)。 在实现128字节 MibSPI 传输时仍然面临问题。  

    您能否建议权变措施? 请告诉我、我是否需要在这方面提供任何信息。  

    Br、

    特里韦迪

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

    尊敬的  Trivedi:

    我只需在 LS12x Launchpad 上运行测试:MibSPI1配置为主器件、MibSPI3配置为从器件。 是 TG0、大小为128。

    e2e.ti.com/.../TMS570LS1224_5F00_MibSPI1_5F00_MibSPI3_5F00_noDMA.zip

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

    您好、Wang:

    您是否确定这不使用 DMA 进行其实现? 原因我可以看到很多与 DMA 相关的语句? 我刚刚扫描了一次代码,当我尝试理解它的时候,我得到了这个查询。

    Br

    特里韦迪

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

    本例中使用了 SYS_MAIN_NO_DMA.c。  

    SYS_MAIN_DMA.c 从编译中排除。

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

    您好、Wang:

    如前所述、请在下面找到我的要点:

    1. 在每次传输后添加一些延迟:
      1. 我的确介绍了一些延迟、发现这不是导致问题的延迟。 我尝试将 Tx (setData)和 Rx (Getdata)命令都添加到主器件和从器件、然后开始工作。=>成功完成了此查询。
    2. 我仍在努力处理128字节或更长的数据传输。 我在第1点中指定的任何内容、其长度仅对不超过127个字节有效。 您能在这里帮助我吗? 附上了我的 HALCoGen 文件(通过电子邮件发送)和主从文件的 sys_main.c 文件供您参考。
    3. 我尝试实施我们讨论过的基于 ENA 的代码。 仍然无法使其工作。 您能检查一下吗?

    附件:

    从代码:

    e2e.ti.com/.../0081.HL_5F00_sys_5F00_main.c

    主机代码:

    e2e.ti.com/.../HL_5F00_sys_5F00_main-_2800_1_2900_.c

    Br、

    特里韦迪

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

    您好、Wang:

    您有机会了解一下吗?

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

    您是否找到了主从 SPI 通信解决方案? 我没有使用两个 LC43x 板进行测试。

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

    没有王。 会议结束后、我尝试了我们讨论的所有内容、并在此处发布了更新内容。 我仍然面临这个问题。

    Br、

    特里韦迪

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

    尊敬的 Trivedi:

    我在测试中注意到"mibspiGetData"函数中的一个错误。 我的意思是、需要在以下突出显示行中从 mibSPI 缓冲器中读取每个元素之前

    while (ram->rx[start].flags &(1 << 15));

    我注意到、如果不存在这一行、则有时没有数据 元素正在读入目标缓冲区、并且我可以看到数据元素仅一个进行逐行调试。 有时我可以只看到部分数据。

    如果上面突出显示的行不存在、那么我们只是将整个 MIB SPI Rx 缓冲区数据移动到目标缓冲区、甚至不验证是否接收到新数据、因为这一点有时会有一些字节作为零移动到目标缓冲区。

    如果我们添加此行、则可以确保在移动到目标缓冲区之前接收到新数据。

     如上所示的那样、将这一行添加到"MibspiGetData"函数的主端和从端、然后查看结果。

    --

    谢谢。此致、
    Jagadish。