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.

[参考译文] LAUNCHXL2-RM46:SPI 环回测试有效、但 SPI1 (主器件)至 SPI3 (从器件)测试无效

Guru**** 1788580 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/1398933/launchxl2-rm46-spi-loopback-test-works-but-spi1-master-to-spi3-slave-test-does-not

器件型号:LAUNCHXL2-RM46
主题中讨论的其他器件:HALCOGEN

工具与软件:

您好、专家

我正在尝试使用 SPI 使 SD 卡在 XL2-RM46 LaunchPad 上工作、到目前为止、我已经能够同时使用 SPI1和 SPI3运行 SPI 环回测试示例。 我能够使用 SPITransmitAndReceive 函数调用在同一 SPI 上发送的字节。 然而、当我在 HALCoGen 中将 SPI1配置为主器件、将 SPI3配置为从器件、在 SPI1上发送、然后在 SPI3上接收时、我只能读取0xFF。 我不知道我在这里遗漏了什么。 我已经尝试通过在 HALCoGen 中适当配置 SPI1和 SPI3作为主器件、将另一个用作从器件。 我认为 SPI1 CS 连接到 SPI3上的正确 CS 引脚。 我将随此帖子附加 HCG 文件。

奇怪的部分是、我能够探测和观察 SPI1 MOSI 和 SPI3 SIMO 引脚(在示波器上)上发送和接收的数据、但使用 spiReceiveData 读取 SPI3上的数据仍会向我提供0xFF。 我是否缺少其他一些配置?

HCG 文件链接: https://drive.google.com/file/d/1DBFMI_IWdv25ezCjZ4Xps28AMqoKYDnf/view?usp=drive_link

感谢你能抽出时间

此致
Karan

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

    尊敬的 Karan:

    以下常见问题解答中有几个正在工作并经过测试的 SPI 和 MibSPI 示例:

    (+)[常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    因此、首先我建议您参考它们并将您的配置与它们进行比较、然后尝试自行解决问题。 如果在提到上述例子后遇到困难、我会尝试解决。

    ——
    谢谢、此致、
    Jagadish。

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

    你好、Jagadish

    感谢您的答复。
    我已经研究了介绍性视频,并已开始工作的1830年。 SPI_4.1046 Master_Test_示例项目列表中的示例项目、因为这是我所拥有的处理器的唯一示例。 不过、该项目会使用 SPI 环回功能在同一 SPI (本项目中为 SPI3)上测试发送和接收功能-这适用于我的 LaunchPad。

    但是、我想让 SPI1作为主器件、SPI3作为从器件。 对于主器件、我将 SPI1与示例项目中的 SPI3配置相同、并将 SPI3作为从器件(SPI 全局配置中未检查的主器件模式)、我还将主器件和从器件的数据格式相同(8位 Charlen、波特率为300kHz)、并将芯片选择引脚配置为 GIO。

    从示例代码初始化模块后、我会执行以下操作:

    spiTransmitData(SPI_MASTER, &dataconfig3_t, 6, initiate); // SPI_MASTER is spiREG1
    spiReceiveData(SPI_SLAVE, &s_dataconfig3_t, 6, response); // SPI_SLAVE is spiREG3

    不过、SPI3上接收到的数据始终为0xFF、并不是 μ`启动 μ`数组中的数据。 您能否告诉我、如果我缺少对示例项目进行的任何配置更改、这样做是否可行?
    我能找到的唯一从设备示例是适用于 RM46以外的处理器。

    感谢你能抽出时间

    此致
    Karan

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

    尊敬的 Karan:

    我为您的要求创建了一个示例项目。 我将在这里附上我的示例项目、但在此之前、我想澄清几件事:

    如果您在同一器件上使用主器件和从器件、则轮询模式不可能、我的意思是您不能使用 spiReceiveData 和 spiTransmitData 函数。

    这是因为单核无法同时轮询两个功能。

    例如:

    如果我希望将数据从主器件(SPI1)发送到从器件(SPI3)、这意味着我应该轮询  SPI3上的函数 spiReceiveData 和  SPI1上的 spiTransmitData、

    从器件应该恰好在以下条件下进行轮询;它不能再继续、直到它从主器件接收到数据、对吧?

    如果内核在此处进行轮询、它如何使用 spiTransmitData  函数通过主设备发送数据、因为该函数也只需要在轮询模式下工作。

    解决此问题的方法是、应使用中断模式。 我的意思是我们应该启用中断并使用 spiGetData 和 spiSendData 函数。

    我的项目如下:

    e2e.ti.com/.../SPI1_5F00_MASTER_5F00_SPI3_5F00_SLAVE_5F00_RM46.zip

    在本例中、首先我要测试主器件发送和从器件接收:

    为此、我将 为从器件调用 spiGetData 函数、这将初始化 SPI3_RX_DATA 缓冲区以进行接收。 一旦我们在接收侧初始化缓冲区后、现在我们可以使用 spiSendData 函数从主站发送数据。 您现在可以看到、从器件侧正确接收了我的数据。

    在我们的下一部分、我将测试从器件传输和主器件接收:

    我首先 为主器件调用 spiGetData 函数、这将初始化 SPI1_RX_DATA 缓冲区以进行接收。 现在我将 使用 SPI3_TX_DATA 缓冲区调用 spiSendData 函数、以将数据发送到主设备。 但请记住、从器件无法自行启动任何传输、因此我们应从主器件发送一些虚拟字节以从器件接收数据、这就是我调用  主器件上具有 dummy_data 的 spiSendData 函数的原因。

    执行此操作后可以看到、我们在主器件接收缓冲区中正确接收了从器件数据。

    我在 RM46x Launchpad 上测试了该项目、因为您使用的是同一个板、所以您可以直接在您的板上执行它。

    但请记住、要测试该项目、您需要用电线将主从器件的以下几行外部短接:

    ——
    谢谢、此致、
    Jagadish。

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

    您好 Jagadish

    非常感谢您的回复和示例项目! 这在我的 launchpad 上效果完美。
    现在、我将您的项目用作基础、并尝试与我连接到 SPI3模块的外部 SD 读卡器进行交互。 我使 SPI3主站和 SPI1从站成为主站、并确认该示例正常工作。 我更改了`sys_main`文件、所做更改位于以下位置: https://drive.google.com/file/d/16aLUUO0fiJKmlO96kPUZVXG1o--lbhv2/view?usp=drive_link

    我遵循 SPI SD 标准、在3个不同的 SD 卡上尝试了此代码、都支持 SPI 和2个不同的卡座、但当我实际查找 R1响应(0x01)时、我只能在主器件上读取0xFF。 我同时使用[CPOL = 0、CPHA = 0]和[CPOL = 1、CPHA = 1]进行了尝试。 在本例中、与读卡器等外部从器件交互时、LaunchPad 上的 SPI 模块是否需要任何额外的硬件配置更改?

    我尝试了基于中断的 send 和 get 函数以及阻止发送和接收函数。 不过、根据我的理解、在我们处理外部从设备时、这两个端口应该都可以正常工作。

    以下是我建立的导线连接(我使用 SPI3作为主器件):

    J11-38 -- CLK
    J11-30 -- CS
    J11-36 --一般
    J11-37 -- SI

    J5-20 -- GND
    J2-1 -- 3V3.

    使用示波器、我能够在 MOSI 和 CLK 线路上读取正确的信号、但 MISO 线路保持高电平。
    非常感谢您的帮助。 再次感谢你能抽出时间。

    此致
    Karan Pratap

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

    大家好、Karan Pratap、

    我们确实有几个适用于 Hercules 控制器的经过测试的 SD 卡示例项目、

    因此、首先我建议您参考它们、因为它们对于代码实现可能非常有用:

    (+) TMS570LS3137:找不到相应 MCU 的 SD 卡库。 -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    tms570LC43x_HDK_SDCard_mibspiDMA«应用- Hercules_examples/Hercules_examples - Hercules 处理器软件示例

    ——
    谢谢、此致、
    Jagadish。

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

    感谢你的帮助。 我能够让 SD 卡运行、只需对 SPI 接收逻辑进行一些更改。 我使用阻塞函数(spiTransmitData 和 spiReceiveData)、并继续从主器件发送虚拟输出、并在发送每个字节之后对从器件输入进行采样、直到它成为有效响应(小于0x80)。 在10个额外的虚拟时钟内、主器件能够对正确响应进行采样。

    再次感谢你的帮助 Jagadish。

    此致
    Karan Pratap