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.

[参考译文] TMS320F280041C:MotorControl_SDK SPI 问题

Guru**** 2483085 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1444977/tms320f280041c-motorcontrol_sdk-spi-problem

器件型号:TMS320F280041C
Thread 中讨论的其他器件:C2000WARE

工具与软件:

您好! 我将 C2000 C2000_79SDK_5_03_00_00 Ware_Motor 与 F280041C 配合使用。 我正在尝试设置 SPIB 接口。 以下是我的设置:

       // SPI SIMO
       GPIO_setMasterCore(56, GPIO_CORE_CPU1);
       GPIO_setPinConfig(GPIO_56_SPIB_SIMO);
       GPIO_setDirectionMode(56, GPIO_DIR_MODE_IN);
       GPIO_setPadConfig(56, GPIO_PIN_TYPE_STD);

       // SPI SOMI
       GPIO_setMasterCore(57, GPIO_CORE_CPU1);
       GPIO_setPinConfig(GPIO_57_SPISOMIB);
       GPIO_setDirectionMode(57, GPIO_DIR_MODE_IN);
       GPIO_setPadConfig(57, GPIO_PIN_TYPE_STD);

       // SPI CLK
       GPIO_setMasterCore(58, GPIO_CORE_CPU1);
       GPIO_setPinConfig(GPIO_58_SPIB_CLK);
       GPIO_setDirectionMode(58, GPIO_DIR_MODE_IN);
       GPIO_setPadConfig(58, GPIO_PIN_TYPE_STD);
       
       
void HAL_setupSPIB(HAL_Handle handle)
{
    HAL_Obj   *obj = (HAL_Obj *)handle;

    // Must put SPI into reset before configuring it
    SPI_disableModule(obj->spiHandle[1]);

    // SPI configuration. Use a 1MHz SPICLK and 16-bit word size.
    SPI_setConfig(obj->spiHandle[1], DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA1,
                  SPI_MODE_MASTER, 500000, 8);

    SPI_disableLoopback(obj->spiHandle[1]);

    SPI_setEmulationMode(obj->spiHandle[1], SPI_EMULATION_FREE_RUN);

    //SPI_enableFIFO(obj->spiHandle[1]);
  //SPI_setTxDelay(obj->spiHandle[1], 0x0018);
    //HWREGH((obj->spiHandle[1])+SPI_O_FFCT) = 0x0018;

    SPI_enableTriWire(obj->spiHandle[1]);
    //SPI_enableLoopback(obj->spiHandle[1]);

    SPI_clearInterruptStatus(obj->spiHandle[1], SPI_INT_TXFF);
  //  SPI_setFIFOInterruptLevel(obj->spiHandle[1], SPI_FIFO_TX2, SPI_FIFO_RX2);
  //  SPI_enableInterrupt(obj->spiHandle[1], SPI_INT_TXFF);

    // Configuration complete. Enable the module.
    SPI_enableModule(obj->spiHandle[1]);

    while(SPI_getRxFIFOStatus(obj->spiHandle[1]))
    {
        char data=SPI_readDataBlockingFIFO(obj->spiHandle[1]);
    }

  return;
}  // end of HAL_setupSPIB() function

unsigned int spi_xfer(unsigned char data)
{
    //unsigned int value=data<<8;
    SPI_transmitByte(halHandle->spiHandle[1], data);
    while(SPI_getTxFIFOStatus(halHandle->spiHandle[1])!=SPI_FIFO_TXEMPTY);
    while(SPI_getRxFIFOStatus(halHandle->spiHandle[1])!=SPI_FIFO_RXEMPTY);
    unsigned char result=0;

    result = SPI_readRxEmulationBuffer(halHandle->spiHandle[1]);
    SPI_resetRxFIFO(halHandle->spiHandle[1]);
    Delay_us(20);
    return result;
}

回送位没有置位! 当 我在物理行调用 spi_xfer()时、一切都很好! 控制器正在发送正确的数据、 连接的器件正确响应命令、以此类推。 问题是、在 SPIRX 和 SPIRXEMU 缓冲区中、我已经传输了数据(值与 SPITXBUF 相同)。 它用作环回模式被启用、但我仔细检查了该位、它 没有被设置! 在n`t 上一切都是正确的、但微控制器仍会将发送缓冲区复制到接收缓冲区、并不读取输入引脚!

有什么建议吗?

谢谢!

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

    您好!

    如果未设置环回位、则没有 SPI 的 RX/TX 内部连接、因此不应进行环回。 您能否仔细检查 SPI 寄存器并单步执行 CCS 中的代码、同时观察 REGS 窗口以确保按所需反映寄存器的更改? 您使用的是3线 SPI 还是4线? 是否有任何其他外部连接? 我想当您启用环回模式时、RX/TX 匹配的行为是相同的?

    此致、

    Allison