在前面的项目中、我在 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 中"正确"执行此操作。
谢谢
汉索尔