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.

[参考译文] C2000WARE-MOTORCONTROL-SDK:F28379D MotorControl SDK 接口 FCL_f2837x_tmdxiddk 中的 SPI

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1264057/c2000ware-motorcontrol-sdk-f28379d-motorcontrol-sdk-interfacing-spi-in-fcl_f2837x_tmdxiddk

器件型号:C2000WARE-MOTORCONTROL-SDK

在前面的项目中、我在 FCL 代码中使用了 SPI 编码器、并实现了以下方法

  1. 注释掉所有 T-format 相关行
  2. 初始化 SPI_A
  3. 实现从 SPIA 写入和读取的函数
  4. 将 SPI 函数放置在 motorcontrol ISR 中

以下是代码的一些片段(出于安全考虑删除了一些内容)

注意:编码器 只能使用 SPI 单独工作在单独项目中。 因此不存在编码器信号问题。 如果我尝试将 SPI 外设集成到 FCL 代码中、它就会卡住

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

    //
    // SPI configuration. Use a 500kHz SPICLK and 16-bit word size.
    //
    SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
                      SPI_MODE_MASTER, 8333333, 8);
    SPI_disableLoopback(SPIA_BASE);
    SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);

    //
    // Configuration complete. Enable the module.
    //
    SPI_enableModule(SPIA_BASE);
}

在 configureADC 之后、可以立即调用这项

//
// PWM Configuration
//
    configurePWM();

//
// SDFM configuration
//
    configureSDFM();

//
// ADC Configuration
//
    configureADC();
    initSPIAMaster();
然后我编写了读取编码器的函数(不使用 FIFO 中断)

void SPIEncoderRead(int32_t *encoder_readout, int32_t *encoder_revolution)
{
    ////Declare variables

    GPIO_writePin(19,0);
    for(i = 0; i < 4; i++)
    {
        // Set the the master TX buffer. This triggers the data trasnmission
        SPI_writeDataBlockingNonFIFO(SPIA_BASE, TX_Data);
        RxData_SPIA[i] = SPI_readDataBlockingNonFIFO(SPIA_BASE);
    }
    GPIO_writePin(19,1);

    /////bitwise operation to reconstruct the databuffer////

}

///T-format function modified for the SPI encoder purpose
void readSPIPosition(int32_t position, int16_t isr_cntr)
{
    tFormat.RawTheta = position * tFormat.MechScaler;
    if (lsw == ENC_ALIGNMENT && isr_cntr ==0 )
    {
		tFormat.InitTheta = tFormat.InitTheta * 0.90 +  tFormat.RawTheta  * 0.10;
        
    }
    isr_cntr = 1;

    tFormat.MechTheta = tFormat.RawTheta - tFormat.InitTheta;

    if(tFormat.MechTheta < 0.0)
        tFormat.MechTheta += 1.0;

    tFormat.ElecTheta = tFormat.MechTheta * tFormat.PolePairs;
    tFormat.ElecTheta -= ((float32_t)((int32_t)(tFormat.ElecTheta)));

    // link the feedback speed to FCL
    speedWe = SPD_OBSERVER_run(&spdObs, tFormat.ElecTheta, 0.0, T, angMax);


    // angle estimator
    pangle = angleEstimator_Tformat();  // link the angle to FCL
    return;
}

然后、在 motorcontrolISR 中调用这些函数

__interrupt void motorControlISR(void)
{


    SPIEncoderRead(&encoder_readout, &encoder_revolution);
    readSPIPosition(encoder_readout, init_cntr);
    init_cntr =1;

#if(BUILDLEVEL == FCL_LEVEL1)
    buildLevel1();

#elif(BUILDLEVEL == FCL_LEVEL2)
    buildLevel2();

#elif(BUILDLEVEL == FCL_LEVEL3)
    buildLevel3();

#elif(BUILDLEVEL == FCL_LEVEL4)
    buildLevel468();

#elif(BUILDLEVEL == FCL_LEVEL5)
    buildLevel58();

#elif(BUILDLEVEL == FCL_LEVEL6)
    buildLevel468();

#elif(BUILDLEVEL == FCL_LEVEL7)
    buildLevel7();

#elif(BUILDLEVEL == FCL_LEVEL8)
    buildLevel8();

一年前、我使用的这种完全相同的方法处理的是 f2838x 版本的代码的 SDK vs 4.0。 但在 F2837x 版本 SDK 5.0上它似乎不起作用

当我进入调试模式并暂停代码时、代码会卡在 SPI_readDataBlockingNonFIFO 函数中

欢迎提出任何建议。

另请聆听如何使用中断寄存器在 FCL 中"正确"执行此操作。

谢谢

汉索尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我进入调试模式并暂停代码时,代码会卡在 SPI_readDataBlockingNonFIFO 函数中

    不是很清楚为什么会发生这种情况。 以下是一些需要检查的东西、以便了解问题:

    SPIEncoderRead ()中 for 循环的哪种迭代 会卡住?

       在调用 SPIEncoderRead ()之前,是否已检查 SPI_STS_INT_FLAG 和 SPI_STS_BUFFULL_FLAG 的状态?

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

    嗨、Gus、感谢您关注此问题。
    这有点奇怪、我再次测试该代码以检查您建议的内容、SPI 突然间开始更新。  
    我会在接下来的几天内继续关注这个问题、并进行观察和回复。

    汉索尔