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.

[参考译文] DRV8434S:用于 SPI 控制驱动器的 F28379D 代码

Guru**** 2468460 points
Other Parts Discussed in Thread: DRV8434S, C2000WARE

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

https://e2e.ti.com/support/motor-drivers-group/motor-drivers/f/motor-drivers-forum/1272734/drv8434s-f28379d-code-for-spi-control-driver

器件型号:DRV8434S
主题中讨论的其他器件: C2000WARE

您好!
我想使用 F28379D 开发套件和 DRV8434S 通过 SPI 进行通信、我想使用具有以下 F28379和 DRV8434S 连接的载板:
SPIA SOMI -> SDO
SPIA SIMO -> SDI
SPIA CLK -> SCLK
SPIA CS -> SCS

例如、读取同时包含发送和接收的寄存器参数之一。
看看库和文档、我认为这是接近解决方案的东西、但不幸的是它不起作用。

首先、我初始化 SPI GPIO:

void configGPIOs(void)
{
    //
    // GPIO59 is the SPISOMIA.
    //
    GPIO_setMasterCore(59, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_59_SPISOMIA);
    GPIO_setPadConfig(59, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(59, GPIO_QUAL_ASYNC);

    //
    // GPIO58 is the SPISIMOA clock pin.
    //
    GPIO_setMasterCore(58, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_58_SPISIMOA);
    GPIO_setPadConfig(58, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(58, GPIO_QUAL_ASYNC);

    //
    // GPIO61 is the SPISTEA.
    //
    GPIO_setMasterCore(61, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_61_SPISTEA);
    GPIO_setPadConfig(61, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(61, GPIO_QUAL_ASYNC);

    //
    // GPIO60 is the SPICLKA.
    //
    GPIO_setMasterCore(60, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_60_SPICLKA);
    GPIO_setPadConfig(60, GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode(60, GPIO_QUAL_ASYNC);
}

我将控制器的 SPI 配置为主器件:

void initSPIAMaster(void)
{
    //
    // Must put SPI into reset before configuring it
    //
    SPI_disableModule(SPIA_BASE);

    //
    // SPI configuration. Use a 500kHz SPICLK and 8-bit word size.
    //
    SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
                  SPI_MODE_MASTER, 500000, 8);
    SPI_disableLoopback(SPIA_BASE);
    SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
    SPI_setPTESignalPolarity(SPIA_BASE, SPI_PTE_ACTIVE_LOW);
    //
    // Configuration complete. Enable the module.
    //
    SPI_enableModule(SPIA_BASE);
}

我构建并发送数据包、检查接收到的值是否为预期值:

volatile uint8_t reg_value = 0;
reg_value |= 0x4000;                       // Set R/W bit
reg_value |= ((0X05 << 9) & 0x3F00); // Configure register address value (CTRL3)
reg_value = (uint8_t)((reg_value>>8) & 0xFF);
volatile uint8_t dataMSB   = 0;
volatile uint8_t dataLSB    = 0;

SPI_enableModule(SPIA_BASE);
// send first byte
SPI_writeDataNonBlocking(SPIA_BASE, reg_value<<8);
// wait transmission end
while(SPI_isBusy(SPIA_BASE));
// read first byte
dataMSB = (uint8_t)SPI_readDataNonBlocking(SPIA_BASE);
// send second byte
SPI_writeDataNonBlocking(SPIA_BASE, 0x00);
// wait transmission end
while(SPI_isBusy(SPIA_BASE));
// read second byte
dataLSB = (uint8_t)SPI_readDataNonBlocking(SPIA_BASE);
// reset SPI
SPI_disableModule(SPIA_BASE);
rData = ((((dataMSB<<8) | dataLSB) & 0x00FF)>>0x0); // complete data
// Check received data against expected data
if(rData != 0x06) // ctrl3 default value on power on
{
    // Something went wrong. rData doesn't contain expected data.
    ESTOP0;
}


即使更改 CTRL 地址、也始终为0。 它们似乎没有通信。 我做错了什么? 是否可以在两个器件之间建立一个有效的通信示例?

谢谢!

比亚吉奥

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

    您好!

    我假设您正在连接到 EVM 上听到的单行。  您是否也移除了板载 MSP430和接头之间 SPI 线路上的电阻器?  这些电容器需要被移除、以避免总线争用。  我用红色箭头突出显示了这些电阻器。  请检查原理图以删除正确的电阻...箭头只是指向一行电阻器、而不是确切的要删除的电阻器。

    此致、

    瑞安

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

    您好!

    不可以、我将使用带有 DRV8434S 的 Pololu 载板、通过 SPI 使用其他微控制器通信是可行的。 我遇到了 F28379D SPI 问题。

    等待建议,  

    谢谢。  

    比亚吉奥

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

    Biagio,

    由于这似乎是一个 C2000问题、我将转到该论坛提供支持。

    此致、

    瑞安

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

    好的、谢谢、
    我希望有一些建议。

    此致、
    比亚吉奥

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

    大家好、Biagio、

    看起来您在非 FIFO 模式下运行、但"spi_isBusy ()"函数仅在 FIFO 模式下运行时有效。

    如果需要其他参考代码源、也可以尝试使用 C2000Ware F2837xd "external_loopback_fifo_interrupts"示例、并根据您的应用进行调整、或者与您的程序更类似的是引用 F2838x"external_loopback"(nofo)代码。 如果您有进一步的问题或疑问、请告诉我。  

    此致、

    艾里森

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

    大家好、Biagio、

    我看到您选择了这不会解决您的问题-我只是想跟进并看看您是否已尝试删除该功能或切换到 FIFO 模式? 您是否发现了与之前相同的问题?

    此致、

    艾里森

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

    您好!
    按照  UNIVERSAL_MOTORCONTROL_LAB 示例 SPI 通信解决。 我需要控制多个 DRV8434S 驱动器、是否有菊花链配置的示例?

    谢谢!

    此致、

    比亚吉奥  

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

    大家好、Biagio、  

    很高兴听到上一个问题解决了。 C2000Ware 中没有适用于 F2837d 的特定菊花链示例。 菊花链配置具有几个不同的含义、您能否描述一下面向应用的更背景信息的设置类型? 还有一份 菊花链 SPI 指南 可能对您也有所帮助。

    此致、

    艾里森

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

    尊敬的 Allison:
    我看过该指南、 我想按照该指南中的说明控制3个器件、每个器件独立(读写)。 我在创建数据包时可能会做错什么事情。 目前、我将使用芯片选择仅使用3个器件开始开发。  我选择"Resolve my issue (解决我的问题)"、因为主要问题已解决。 如有必要、我将为菊花链创建另一个线程。


    谢谢!
    此致、
    比亚吉奥