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.

[参考译文] TMS320F28379D:使用 SPI 向传感器传输数据时的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1618458/tms320f28379d-issues-while-using-spi-to-rad-data-from-sensors

部件号: TMS320F28379D

我们使用 TMS302F28379D 来读取 ADXRS290 陀螺仪数据。 根据数据表、SPI 模式为 POL1 和 PHA 1、但如果我们设置 POL1 和 PHA0、则我们只能从 ADXRS290 读取和写入正确的数据。
我们还检查了 IMU、该器件具有类似的 SPI 模式要求、并观察到类似的行为、表明仅在将 SPI 配置设置为 POL1 和 PHA0 时才会接收到正确的数据。 下面是适用于我们的配置。

GPIO_setPinConfig(GPIO_58_SPISIMOA);
	   GPIO_setPadConfig(58, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(58, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_59_SPISOMIA);
	   GPIO_setPadConfig(59, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(59, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_60_SPICLKA);
	   GPIO_setPadConfig(60, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(60, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_61_SPISTEA);
	   GPIO_setPadConfig(61, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(61, GPIO_QUAL_ASYNC);

	   SPI_disableModule(SPIA_BASE);

	// SETTING CLOCK FREQUENCY 1MHz
	   SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL1PHA0, 
	   SPI_MODE_CONTROLLER, 1000000, 16); // 
	   SPI_setPTESignalPolarity(SPIA_BASE, SPI_PTE_ACTIVE_LOW);

	   SPI_disableFIFO(SPIA_BASE);                          
	   SPI_disableLoopback(SPIA_BASE);
	   SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
	   SPI_enableModule(SPIA_BASE);

1.这可能是什么原因?

2.我们使用下面的函数从陀螺仪读取数据,并正确地传输数据

   SPI_writeDataNonBlocking(SPIA_BASE, 0x1002); //0x1002 to enable measurement | 0x1000 to disable measurement
   PWR_CTL=SPI_readDataBlockingNonFIFO(SPIA_BASE);
   DELAY_US(100);
//      Read PWR_CTRL Register
   SPI_writeDataNonBlocking(SPIA_BASE, 0x9000);
   PWR_CTL=SPI_readDataBlockingNonFIFO(SPIA_BASE);

 
  配置设置如下所示:

GPIO_setPinConfig(GPIO_58_SPISIMOA);
	   GPIO_setPadConfig(58, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(58, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_59_SPISOMIA);
	   GPIO_setPadConfig(59, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(59, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_60_SPICLKA);
	   GPIO_setPadConfig(60, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(60, GPIO_QUAL_ASYNC);
	   
	   GPIO_setPinConfig(GPIO_61_SPISTEA);
	   GPIO_setPadConfig(61, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(61, GPIO_QUAL_ASYNC);
     

   SPI_writeDataNonBlocking(SPIA_BASE, 0x8000);
   Gyro_ID=SPI_readDataBlockingNonFIFO(SPIA_BASE);
   SPI_writeDataNonBlocking(SPIA_BASE, 0x8900);
   MEMS_ID=SPI_readDataBlockingNonFIFO(SPIA_BASE);



// other codes

    for(;;)
    {
           SPI_writeDataNonBlocking(SPIA_BASE, 0x8800);
           xoutlow=SPI_readDataBlockingNonFIFO(SPIA_BASE);
//         Read Higher bit ox X Gyro
           SPI_writeDataNonBlocking(SPIA_BASE, 0x8900);
           xouthigh=SPI_readDataBlockingNonFIFO(SPIA_BASE)
}

在这种情况下、正在读取的数据是正确的。

 

我们还尝试了多字节读取操作、当在 main 函数中执行读取和写入操作时、但在“for"循环“循环外部执行了读取和写入操作时、发现数据正确、但当在 for 循环内部执行多字节读取操作时、传入数据错误。

我们在此模式下使用时将 CS 配置为 GPIO。

 

   	   GPIO_setPinConfig(GPIO_58_SPISIMOA);
	   GPIO_setPadConfig(58, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(58, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_59_SPISOMIA);
	   GPIO_setPadConfig(59, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(59, GPIO_QUAL_ASYNC);

	   GPIO_setPinConfig(GPIO_60_SPICLKA);
	   GPIO_setPadConfig(60, GPIO_PIN_TYPE_STD);
	   GPIO_setQualificationMode(60, GPIO_QUAL_ASYNC);
	   
     GPIO_setPinConfig(GPIO_61_GPIO61);                      
     GPIO_setDirectionMode(61, GPIO_DIR_MODE_OUT);
     
      GPIO_writePin(61,1);
   SPI_writeDataNonBlocking(SPIA_BASE, 0x8000);
   Gyro_ID=SPI_readDataBlockingNonFIFO(SPIA_BASE);
   SPI_writeDataNonBlocking(SPIA_BASE, 0x0000);
   MEMS_ID=SPI_readDataBlockingNonFIFO(SPIA_BASE);
         GPIO_writePin(61,0);
//We get correct data here

// other codes

    for(;;)
    {
           SPI_writeDataNonBlocking(SPIA_BASE, 0x8800);
           xoutlow=SPI_readDataBlockingNonFIFO(SPIA_BASE);
           SPI_writeDataNonBlocking(SPIA_BASE, 0x0000);
           xouthigh=SPI_readDataBlockingNonFIFO(SPIA_BASE)
// The data read from sensor comes errorneous.
}

 

3.我们也运行 100us 计时器 0。 如果在循环内部执行此读取操作、则无论是单字节读取操作还是多字节、接收到的数据都是错误的。


请您帮助我们确定问题。

 

 

 

 

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

    尊敬的 Gautham:

    在执行初始化后->在 CCS 中的“Continuous Refresh“打开后、您是否可以尝试运行代码并暂停、设置的 SPIICTL.CLK_PHASE 和 SPICCR.CLKPOLARITY 的值是多少? 这是验证设置以确保初始化按预期工作的最佳方法。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    我可以确认是否按照 SPI_setConfig 中的定义设置了 SPICTL.CLK_PHASE 和 SCICCR.CLKPOLARITY。

    当它们设置为 SPI_PORT_POL1PHA0 时、我可以获得正确的数据、并且当设置为 SPI_PORT_POL1PHA1 时、从传感器读取的数据不正确。

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

    尊敬的 Gautham:

    我将在本周结束时再次回复您。

    此致、

    Delaney

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

    尊敬的 Gautham:

    另一个要检查的问题是:是否可以对 SPI SCLK 和 MOSI 信号进行范围设置? 设置极性=1 和相位=1 时、SCLK 应在每个 MOSI 位的中间有一个下降沿(而不是在位的开头)、这是您在示波器上看到的吗?

    此致、

    Delaney