主题中讨论的其他器件: PGA411-Q1
您好!
我的项目主要与 TMS320F280039C 配合使用、只有几个问题阻碍了我继续使用此微控制器进行测试。 我使用 MCU 来控制交流电机并让电机旋转。 项目的结构方式是、我有一个250us ADC 中断、用于触发和执行电机控制。 然后、此中断触发运行100us 的用户中断(请注意、添加的100us 必须小于250us 的总数)。 在250us 中断期间、我使用 SPI FIFO 中断读取旋转变压器两次。 这运行良好、但我似乎得到了一些不良数据、导致速度反馈中产生噪声、有时电机中会产生可闻噪声、因为我在错误的点点火电流。
下面的 Conv1Debug3显示了 SPI 链路上不良数据的计数-如在1.5秒内所示、我错过了来自旋转变压器的14次传输、您还可以注意到随附的速度毛刺脉冲:
我想知道这是否是嵌套中断问题?
我将启动类似这样的 SPI 传输-请注意、我必须添加 EINT、以便在 ADC ISR 期间允许2个 SPI 中断。
// Start sequence of SPI Master read/write register operations to Resolver chip - Blocking void SpiMaster_StartTransfer(GE_Primary_Container_t *pContainer, uint32_t command) { pContainer->mpSpiMaster->mDataRecv = 0; // Reset Rx and Tx Buffers SPIMaster_ResetBuffers(pContainer); // Set TxData buffer pContainer->mpSpiMaster->mTxData[0] = (command >> 24) & 0xFFU; pContainer->mpSpiMaster->mTxData[1] = (command >> 16) & 0xFFU; pContainer->mpSpiMaster->mTxData[2] = (command >> 8) & 0xFFU; pContainer->mpSpiMaster->mTxData[3] = (command & 0xFFU); pContainer->mpSpiMaster->mIsTransferCompleted = false; // Reset / Setup SPI SPIMaster_SetupResetSPI(pContainer); // Reset / Setup FIFO SPI_disableFIFO(REPC_RES_DSPI_MASTER_BASEADDR); SPI_clearInterruptStatus(REPC_RES_DSPI_MASTER_BASEADDR, SPI_INT_TXFF); SPI_clearInterruptStatus(REPC_RES_DSPI_MASTER_BASEADDR, SPI_INT_RXFF); SPI_enableFIFO(REPC_RES_DSPI_MASTER_BASEADDR); SPI_setFIFOInterruptLevel(REPC_RES_DSPI_MASTER_BASEADDR, SPI_FIFO_TXEMPTY, SPI_FIFO_RX4); // Enable RxFIFO Interrupt SPI_enableInterrupt(REPC_RES_DSPI_MASTER_BASEADDR, SPI_INT_RXFF); // Enable SPI SPI_enableModule(REPC_RES_DSPI_MASTER_BASEADDR); // Clear INTM so that we can trigger another interrupt inside of fast thread EINT; // Enable interrupts Interrupt_enable(INT_SPIB_TX); Interrupt_enable(INT_SPIB_RX); // Fill FIFO and send data - no interrupt required here int i = 0; for (i = 0; i < REPC_RES_MASTER_TRANSFER_SIZE; i++) { SPI_writeDataNonBlocking(REPC_RES_DSPI_MASTER_BASEADDR, ((pContainer->mpSpiMaster->mTxData[i] & 0x00FF) << 8)); } }
下面是我初始化 SPI 的方法:
// Setup / Reset SPI void SPIMaster_SetupResetSPI(GE_Primary_Container_t *pContainer) { // Must put SPI into reset before configuring it SPI_disableModule(REPC_RES_DSPI_MASTER_BASEADDR); // SPI configuration. Use a 12.5MHz SPICLK and 32-bit word size, 25MHz LSPCLK // Rising edge SPI SPI_setConfig(REPC_RES_DSPI_MASTER_BASEADDR, REPC_RES_DSPI_MASTER_CLK_SRC, SPI_PROT_POL0PHA0, SPI_MODE_MASTER, REPC_RES_TRANSFER_BAUDRATE, 8U); SPI_disableLoopback(REPC_RES_DSPI_MASTER_BASEADDR); SPI_setEmulationMode(REPC_RES_DSPI_MASTER_BASEADDR, SPI_EMULATION_FREE_RUN); } // Init SPI1 Interface to resolver void SPIMaster_Init(GE_Primary_Container_t *pContainer) { // Register interrupt ISRs Interrupt_register(INT_SPIB_TX, &spiBTxFIFOISR); Interrupt_register(INT_SPIB_RX, &spiBRxFIFOISR); // Setup / Reset SPI SPIMaster_SetupResetSPI(pContainer); // Configuration complete. Enable the module. SPI_enableModule(REPC_RES_DSPI_MASTER_BASEADDR); // Init Master Buffers to 0 SPIMaster_ResetBuffers(pContainer); // Init Control Variables pContainer->mpSpiMaster->mIsTransferCompleted = false; }
感谢您的帮助!