部件号: 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。 如果在循环内部执行此读取操作、则无论是单字节读取操作还是多字节、接收到的数据都是错误的。
请您帮助我们确定问题。
