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.

[参考译文] TMS320F280049C:SPIDAT 缓冲区中的 SPI 日期未传输到 SPIRXBUF

Guru**** 2558250 points
Other Parts Discussed in Thread: DRV8305

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1086473/tms320f280049c-spi-date-in-spidat-buffer-not-being-transferred-to-spirxbuf

部件号:TMS320F280049C
“线程:DRV8305”中讨论的其它部件

您好,

使用用于 F280049C 的 DriverLIb 进行 F280049C 和之间的 SPI 通信
DRV8305N,我可以看到 SOMI 引脚上的电气信号(黄色为 CLK,绿色为 ISD SOMI)

数据到达 SPIDAT 寄存器,但在周期结束时未传输到 SPIRXBUF 寄存器:

GPIO 的设置如下:

    // GPIO16->SPIA-SDI DRV8305 -> M1_DRV_SDI
    GPIO_setPinConfig(GPIO_16_SPIA_SIMO);
    GPIO_setDirectionMode(16, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(16, GPIO_PIN_TYPE_PULLUP);

    // GPIO17->SPIA-SDO DRV8305 -> M1_DRV_SDO
    GPIO_setPinConfig(GPIO_17_SPIA_SOMI);
    GPIO_setDirectionMode(17, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(17, GPIO_PIN_TYPE_PULLUP);

    // SPIA->SPIA-CLK for DRV8305 -> M1_DRV_SCLK
    GPIO_setPinConfig(GPIO_3_SPIA_CLK);
    GPIO_setDirectionMode(3, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(3, GPIO_PIN_TYPE_PULLUP);

    // GPIO11->SPIA_STE - DRV8305 nSCS -> M1_DRV_SCS
    GPIO_setPinConfig(GPIO_11_SPIA_STE);
    GPIO_setDirectionMode(11, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(11, GPIO_PIN_TYPE_STD);

SPI ist 初始化如下:

	//mySPI0 initialization
    // Must put SPI into reset before configuring it
	SPI_disableModule(mySPI0_BASE);

    // SPI configuration. Use a 500kHz SPICLK and 16-bit word size, 25MHz LSPCLK
    SPI_setConfig(mySPI0_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, 400000, 16);

    SPI_disableLoopback(mySPI0_BASE);

    SPI_setEmulationMode(mySPI0_BASE, SPI_EMULATION_FREE_RUN);

    SPI_enableFIFO(mySPI0_BASE);
    SPI_setTxFifoTransmitDelay(mySPI0_BASE, 0x10);

    SPI_clearInterruptStatus(mySPI0_BASE, SPI_INT_TXFF);

    // Configuration complete. Enable the module.
    SPI_enableModule(mySPI0_BASE);

DRV8305寄存器的读数如下所示:

uint16_t DRV8305_readSpi(DRV8305_Handle handle,const DRV8305_Address_e regAddr)
{
  DRV8305_Obj *obj = (DRV8305_Obj *)handle;
  uint16_t ctrlWord;
  uint16_t n;
  const uint16_t data = 0;
  volatile uint16_t readWord;
  static volatile uint16_t WaitTimeOut = 0;
/*  volatile SPI_FifoStatus_e RxFifoCnt = SPI_FifoStatus_Empty;*/
  volatile SPI_RxFIFOLevel RxFifoCnt = SPI_FIFO_RXEMPTY;

  // build the control word
  ctrlWord = (uint16_t)DRV8305_buildCtrlWord(CtrlMode_Read,regAddr,data);

  // wait for registers to update
  for(n = 0; n < 0x08; n++)
  {
      __asm(" NOP");
  }

  // reset the Rx fifo pointer to zero
/*  SPI_resetRxFifo(obj->spiHandle);*/
/*  SPI_enableRxFifo(obj->spiHandle);*/
  SPI_resetRxFIFO(obj->spiHandle);
  SPI_enableFIFO(obj->spiHandle);

  // wait for registers to update
  for(n = 0; n < 0x20; n++)
  {
      __asm(" NOP");
  }

  // write the command
/*  SPI_write(obj->spiHandle,ctrlWord);*/
  SPI_writeDataBlockingNonFIFO(obj->spiHandle,ctrlWord);

  // wait for the response to populate the RX fifo, else a wait timeout will occur
/*  while((RxFifoCnt < SPI_FifoStatus_1_Word) && (WaitTimeOut < 0xffff))*/
  while((RxFifoCnt < SPI_FIFO_RX1) && (WaitTimeOut < 0xffff))
  {
/*    RxFifoCnt = SPI_getRxFifoStatus(obj->spiHandle);*/
    RxFifoCnt = SPI_getRxFIFOStatus(obj->spiHandle);
	if(++WaitTimeOut > 0xfffe)
	{
		obj->RxTimeOut = true;
	}
  }

  // wait for registers to update
  for(n = 0; n < 0x100; n++)
  {
      __asm(" NOP");
  }

  // Read the word
/*  readWord = SPI_readEmu(obj->spiHandle);*/
  SPI_readDataNonBlocking(obj->spiHandle);
//  SPI_readRxEmulationBuffer(obj->spiHandle);

  return(readWord & DRV8305_DATA_MASK);
} // end of DRV8305_readSpi() function

我已经多次了解 F280049C 的技术参考手册,但没有
看看我错过了什么。

感谢您的帮助。

谢谢,

约翰

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

    约翰,

    您是否检查了 RXFFST 状态? 查看您的 RXFFST 是否大于0。 如果是这样,接收到的单词将被推入 RX FIFO 中。 读取 SPIRXBUF 可用于从 FIFO 读取内容

    此致,

    马诺伊

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

    你好,Manoj,

    感谢您的建议。

    是的,RXFFST 被轮询,但超时仍被设置。

    与此同时,我发现了自己的错误。 将 SPI 读取从 SPIRXBUF 切换到 SPIRXEMU,数据突然开始显示在 SPIRXBUF 中。 呃? 然后我在技术参考手册中找到:

    读取 SPIRXEMU 不能清除 SPI INT 标志位,而是读取
    SPIRXBUF 清除此标志。 换句话说,SPIRXEMU 启用
    仿真器,以模拟 SPI 的真实操作
    准确。

    然后我找到了我的雾。 在更新实际 DriverLib 中函数名称的代码时,我没有将返回的信息传递给变量:

    /*  readWord = SPI_readEmu(obj->spiHandle);*/
      SPI_readDataNonBlocking(obj->spiHandle);
      //SPI_readRxEmulationBuffer(obj->spiHandle);
    

    在 readWord =中添加到如下代码后:

      // Read the word
    /*  readWord = SPI_readEmu(obj->spiHandle);*/
      readWord = SPI_readDataNonBlocking(obj->spiHandle);
      //readWord = SPI_readRxEmulationBuffer(obj->spiHandle);
    

    一切都很好

    那是难堪的

    好的,对我来说,我还没有死亡,但我永远不会忘记这一个。

    感谢 Santosh 和 Manoj 的建议

    此致,

    约翰