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.

[参考译文] DRV8301-69M-KIT:在 Motorware labs SPI 实现中运行2个 SPI 从器件

Guru**** 2530830 points
Other Parts Discussed in Thread: MOTORWARE, C2000WARE, CONTROLSUITE, DRV8301, DRV8301-69M-KIT

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596683/drv8301-69m-kit-running-2-spi-slaves-in-motorware-labs-spi-implementation

器件型号:DRV8301-69M-KIT
主题中讨论的其他器件:MOTORWAREC2000WAREcontrolSUITEDRV8301ISO7241A

我使用 Motorware 实验在一条 SPI 总线上运行2个 Picollo SPI 从站(使用 Raspberry PI 主站)(使用2个地址)。

当它们中的每一个单独连接时、一切都正常。 当两者都连接时、从器件到主器件的通信将丢失(SOMI)。 通过数字示波器检查、我的印象是、两个 Picollo 都试图在不活动时(1)将数据线保持在高电平(SOMI 数据线从 Motorware 中实现了低电平有效)。我在数据线上看到许多尖峰、与时钟脉冲不一而不是。

在与知识渊博的人讨论时、他建议在 SOMI GPIO 未处于活动状态时将其切换为输入。

我的问题:

1.为什么在 Motorware 实验中这不是默认设置?

2.如果我想自行修改,最好在哪里进行修改,以实现干净的实施?

3.这是否可以是未来 Motorware 更新的功能请求?

BTW、再次感谢您提供这一出色的平台。 我喜欢为启动器的启动而提供的性能和努力、包括 TI 员工对该论坛的妥善维护。

此致、

Tomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下一个努力,但尚未取得成功。
    基于 www.ti.com/.../sprug71b.pdf 1.4.2.2从模式

    在 main 中、将从器件 OUT 端口设置为高阻抗:
    //设置硬件抽象层参数
    HAL_setParams (halHandle、&gUserParams);
    //禁用从器件输出
    SPI_disableTx (halHandle->spiAHandle);

    在主 ISR 中、从 SPI 读取/写入时:

    unsigned int register_count =(unsigned int)(halHandle->spiAHandle->SPIFFRX)& 0x1F00)>> 8;//屏蔽第9-13位+ 8位移位

    if (register_count >= 4){

    //启用和重新禁用从器件输出
    //使输入处于高阻抗状态
    //允许多个从器件
    SPI_enableTx (halHandle->spiAHandle);
    halHandle->spiAHandle->SPITXBUF = output1;
    halHandle->spiAHandle->SPITXBUF = output2;
    halHandle->spiAHandle->SPITXBUF = output3;
    halHandle->spiAHandle->SPITXBUF = output4;

    Input1 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input2 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input3 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input4 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    SPI_disableTx (halHandle->spiAHandle);
    (笑声)

    有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外一个修改是因为我之前的代码也没有针对单个从器件运行
    添加了"while (SPI_getTxFifoStatus (halHandle->spiAHandle)>0)}"。

    但是,问题没有得到解决。 我开始想知道 DRV8301-69M 套件是否存在电气问题、不允许将其中的2块板用作从板。 但我不能想象什么是根本原因。

    if (register_count >= 4){

    //启用和重新禁用从器件输出
    //使输入处于高阻抗状态
    //允许多个从器件
    SPI_enableTx (halHandle->spiAHandle);
    halHandle->spiAHandle->SPITXBUF = output1;
    halHandle->spiAHandle->SPITXBUF = output2;
    halHandle->spiAHandle->SPITXBUF = output3;
    halHandle->spiAHandle->SPITXBUF = output4;

    Input1 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input2 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input3 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    input4 =(unsigned int)(halHandle->spiAHandle->SPIRXBUF);
    while (SPI_getTxFifoStatus (halHandle->spiAHandle)>0){}//等待 TX 缓冲区为空
    SPI_disableTx (halHandle->spiAHandle);
    (笑声)

    像往常一样、我们非常感谢您的帮助。 我的回答会很慢、因为我将在下周休假。

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

    我需要进一步研究、但对于我们目前没有在 Motorware 中实施此方案的原因、我相信这是因为我们仅使用 SPI 进行 DRV 控制、 我们选择将 Motorware 专注于电机控制支持、并将外设设置/调试留给 controlSUITE、因此不演示任何其他功能。 显然、这不是一个完美的科学、因为 Motorware 使用 HAL 结构、而 controlSUITE 不使用、这使得移植变得困难。 我们希望使用我们正在开发的新电机控制 SDK 来缓解这种不匹配情况、该 SDK 应与 C2000Ware 平台良好网状。

    此外、我相信我们将来不会在 Motorware 中演示 SPI 总线上双寻址的任何功能、尤其是因为我们更喜欢为 DRV 器件配备一个专用模块、并且很可能会将第二个可用的 SPI 模块用于 IC 间通信。

    让我更深入地了解一下您当前的问题、并返回给您。

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

    查看粘贴的代码、您还没有尝试从 GPIO 寄存器更改 I/O 方向、对吧? 如果是、我建议这样做、看看它是如何为您工作的

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

    Sean、

    感谢您的回复!

    关于混合使用 C2000和 Motorware、我知道这不是一个理想的选择、但要了解优秀的文档和良好的注释示例、我已经知道了很多(我希望通过此主题也能帮助其他用户)。

    关于 DRV8301和其他外设的 SPI 混合、我使用 SPIA、而我了解 SPIB 用于 DRV8301通信。 但是、我想在 SPIA 上与来自 Raspberry PI 主器件的2个 F28069M 从器件进行通信。 因此、根据我的理解、这不应导致与 DRV8301通信发生任何冲突。

    "查看粘贴的代码、您还没有尝试从 GPIO 寄存器更改 I/O 方向、对吧? 如果是,我建议这样做,看看它是如何为您工作的”>您是指 SPIA 初始化吗? 我只是保持 hal.c 初始化、如果我只连接一个 SPI 从器件、它就可以正常工作。 SPI_enableTx/SPI_disableTx 命令是否还应包含其他内容?

    // SPI-SIMO
    GPIO_setMode (obj->gpioHandle、GPIO_Number_16、GPIO_16_Mode_SPISIMOA);
    // GPIO_setPullup (obj->gpioHandle、GPIO_Number_16、GPIO_Pullup_Enable);

    // SPI-SOMI
    GPIO_setMode (obj->gpioHandle、GPIO_Number_17、GPIO_17_Mode_SPISOMIA);
    // GPIO_setPullup (obj->gpioHandle、GPIO_Number_17、GPIO_Pullup_Enable);

    // SPI-CLK
    GPIO_setMode (obj->gpioHandle、GPIO_Number_18、GPIO_18_Mode_SPICLKA);
    // GPIO_setPullup (obj->gpioHandle、GPIO_Number_18、GPIO_Pullup_Enable);

    // SPI-STE
    GPIO_setMode (obj->gpioHandle、GPIO_Number_19、GPIO_19_Mode_SPISTEA_not);
    // GPIO_setPullup (obj->gpioHandle、GPIO_Number_19、GPIO_Pullup_Enable);

    感谢您的任何反馈。

    此致、
    Tomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正确的是、使用 SPI-A 不会影响另一个模块的运行。 至于将其用作公共总线、我不能完全确定您将如何执行该操作。 在将其添加到 Motorware 的"结构"方面、这应该是非常可行的。 如果您想了解有关编辑 hal.c/.h 和各种其他源文件以添加附加 SPIA 句柄的更多信息、可以参阅 Motorware 中的 motorware_hal_tutorial.pdf。 SCI 模块有一个示例、该示例应能很好地说明如何使用 SPI 执行相同的操作。

    我已经邀请了对 C2000 SPI 模块更了解的人来探讨这个主题。 很抱歉耽误你的时间。

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

    Sean、我认为我遇到的问题与下面的主题类似:

    e2e.ti.com/.../1738481

    我尝试以同步方式解决异步问题。
    当然、这将不是很高效、因为我将使我的 mainISR 忙等待。

    相反,我需要检测我的选择位:
    -降低电平以将 SOMI 设置为活动状态(我认为是使用'SPI_enableTx (halHandle->spiAHandle);')
    -升高以将我的 SOMI 设置为高阻抗(我认为是使用'SPI_disableTx (halHandle->spiAHandle);')

    我假设我需要为 SPI 选择 GPIO 的状态更改创建一个中断、并在其变为高电平或低电平时采取适当的措施。
    我将亲自尝试解决这个问题,但正如在另一个主题中所承诺的那样;-),任何帮助都是非常感激的。

    我知道 Motorware 不是为此而开发的、不久将集成 DIN controlSUITE。
    但在这两者之间、此论坛可以帮助其他用户解决他们的问题。
    您能否与 SPI 专家讨论如何轻松添加这些中断?

    当然、如果我发现自己、我将更新此主题、使他人也可以访问该信息。

    感谢您的支持!
    Tomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    传递团队中其他成员的一些意见/问题:

    "。。 我们已经看到多从器件 SPI 实现的工作方式。 禁用 TALK (禁用发送)的建议之一将数据输出线置于高阻抗状态。 它们是否为每个从器件使用两个独立的芯片选择?"

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

    感谢你的答复。

    我正在禁用 Talk (SPI_enableTx、SPI_disableTx)、但与我放置的参考线程一样、我在努力何时执行此操作(如上所示、我在 mainISR 中执行此操作、但我猜我会遇到计时问题、因为写入操作与 SPI 中的 FIFO 异步完成)
    2.我正在为每个 C2000从板使用独立的芯片选择。 当我断开每一个从器件的连接时、这是可以的、另一个从器件正在工作。

    我认为我需要一个额外的中断来检测芯片选择何时变为低电平并在此时启用通话(并在它再次变为高电平后复位)。 但是,这似乎是一个逻辑功能,我希望标准实施将涵盖它:
    只有当 SPISTEA 变为低电平时、才需要传输数据。 因此、我希望有一些功能可以自动将直接链接到 SPISTEA 的 TALK 位设置为低电平。 请原谅我、我完全无知、我是一名机械工程师。

    此外、GPIO 被设置为 SPI 选择位、我认为我无法向该位添加我自己的中断。 立即尝试。

    此外、在手册 sprug71b.pdf 中、没有关于在由多个从器件组成的网络中将 C2000作为从器件进行处理的详细信息。

    感谢您的持续支持。 请让我步入正轨以获得解决方案、我将记录我在 Motorware 中的解决方法、以帮助他人。

    BR、
    Tomas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我似乎在这条线程中自我跳变、但我希望其他人也能利用我的学习成果。

    问题1可能是硬件问题:即使在禁用传输 SOMI 时,我也会在每次时钟状态改变时保持 SOMI 线上的尖峰。 我想得到确认的一个想法是:
    我使用的是 DRV8301-69M 套件、它使用的是 ISO7241A 数字隔离器。 由于每个引脚具有固定的方向、我想知道 IND-OUTD 通道是否可以切换为高阻抗输入...

    问题2是软件问题、但需要先解决硬件问题... 尽管如此、我仍需要了解我们何时开发具有集成所有处理器的自己的电路板(我们可能会跳过数字隔离器)。

    感谢您确认第一件商品。

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

    Tomas、

    ISO7241A 确实有一个 EN 引脚、该引脚可被驱动为低电平以强制输出为高阻抗、但没有用于此目的的输入通道开关。 您能否共享由 SPICLK 开关引起的噪声脉冲的图像? 最好在同一个图上同时看到 SOMI 和 SPICLK。

    我建议您在上一个帖子中详细了解您的想法。 TALK 位将不会被芯片选择禁用、将需要一些额外的 CPU 逻辑来控制这个位。 您可以配置具有外部中断功能的 GPIO、并根据状态转换触发中断。 当芯片选择引脚被切换为低电平或激活时、CPU 将启用通话、直到芯片选择信号返回高电平。 这应能满足您的需求。

    -Mark

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

    Mark、

    感谢你的答复。 这正是我所做的,但由于我从未对中断进行过编程,所以它是将 controlSUITE Example_2806xExternalInterrupt.c 和 Motorware 框架完美结合的一个难题;-)。 一旦我有更详细的问题(或者、想象、结果)、我就会发布这些问题。

    对于数字隔离器、我将我的注释发布到另一个主题中:
    e2e.ti.com/.../602564
    DRV8301-69M-KIT:在 Motorware labs SPI 实现中运行2个 SPI 从器件

    我认为这是两个不同的问题、我希望将它们分开。
    你能不能在这里看看(5分钟内)。

    BR、
    Tomas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我回复了您的另一篇帖子。 请尝试软件建议并告知我们。

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

    当 SPISTEA 线为低电平时、这是中断的未完成执行来禁用 SOMI。 我将为我修改的每个文件分散多个回复。
    我在文本中提出了一些问题(红色字体)。 我将尽快尝试进一步开发(最近的周六)、并使用此主题中的工作代码进行更新。

    直到那时、任何愚蠢的错误纠正或提示/修改、都非常感激!

    一些基于 controlSUITE 中的 example_2806xExternalInterrupt.c 的项目

    使用 XINT1作为 SPISTEA 下降沿=开始与该从器件通信
    对 SPISTEA 上升沿使用 XINT2 =停止与该从器件的通信

    在本例中为 proj_lab05e.c 中的实现。

    我删除了下一条消息、并在末尾替换为更新的代码、以避免此线程过载。

    感谢您的理解

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

    请参见线程末尾

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

    请参见线程末尾

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

    请参见线程末尾

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

    请参见线程末尾

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

    我设法使中断正常工作。
    我将在下一个线程中发布我的工作代码。

    但是、有时我仍然会遇到时序问题...

    我想给外部中断一个比主 ISR 更高的优先级。
    如何执行此操作? (我可以在数据选择通道和时钟之间产生更长的延迟、但我不希望这样做)

    看起来、当 mainISR 正在执行时、 Interrupt_SPI_enableTx/Interrupt_SPI_disableTx 必须等待直到 mainISR 完成。

    是否有办法为 Interrupt_SPI_enableTx/Interrupt_SPI_disableTx 提供高于主 ISR 的优先级?
    我是说,我是否可以使 Interrupt_SPI_enableTx/Interrupt_SPI_disableTx 的 mainISR 执行停止 ?

    在下图中、您可以看到 Interrupt_SPI_enableTx 的 OK 和太晚中断响应会发生什么情况:

    时间中断执行

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

    太晚的中断执行

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

    替换为下一个帖子

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

    允许在 motorware 中选择 SPI 从设备的代码

    基于 controlSUITE 中的 Example_2806xExternalInterrupt.c

    使用 XINT1作为 SPISTEA 下降沿=开始与该从器件通信
    对 SPISTEA 上升沿使用 XINT2 =停止与该从器件的通信

    基于https://e2e.ti.com/support/microcontrollers/c2000/f/902/t/462460 和 processors.wiki.ti.com/.../Interrupt_Nesting_on_C28x 的中断优先级 (TI 的下一篇文章)

    所有附加代码均通过以下方式指示:
    -开始:
     
    //为2个 SPI 从器件添加了代码-开始
    -结束: //为2个 SPI 从器件添加了代码-结束

    对于数字隔离器(DRV8301-69M 套件的硬件问题)、我将我的评论发布在另一个主题中:
    e2e.ti.com/.../602564
    DRV8301-69M-KIT: DRV8301-69M-KIT:运行2个 SPI 从站硬件问题

    附加文件中的代码

    e2e.ti.com/.../CCS_5F00_2SPISlavesCode.docx

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

    C2000上的中断优先级无法更改、因为它基于硬件。 但是、您可以在 SW 中实现某种级别的优先级。 如需更多信息、请参阅链接的 Wiki。 processors.wiki.ti.com/.../Interrupt_Nesting_on_C28x

    侧注:请勿在帖子正文中发布完整的代码文件。 它使读取线程变得特别困难。 使用"使用丰富的格式"选项并通过其中的工具附加文件。 谢谢!

    谢谢、
    标记
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Mark! 我移动了附件中的代码。

    我上一篇文章中的代码包含您发送到 MotorWare 环境的链接的翻译。
    除了我在直接通信中询问的 DRV8301-69M-KIT 上的光学隔离器外、它的工作正常。
    我将在开始使用 DRV8301-69M-KIT 时立即更新我的另一个帖子。

    BR、
    Tomas