在前面的项目中、我在 FCL 代码中使用了 SPI 编码器、并实现了以下方法
- 注释掉所有 T-format 相关行
- 初始化 SPI_A
- 实现从 SPIA 写入和读取的函数
- 将 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 中"正确"执行此操作。
谢谢
汉索尔