主题中讨论的其他器件: 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;
}
感谢您的帮助!








