This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F28388D:当队列为空时、不断调用 SPI 中断

Guru**** 2545140 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/937535/ccs-tms320f28388d-when-the-queue-is-empty-spi-interrupts-are-constantly-called

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

你好!!!

我们购买了以下开发板集:
1. HSEC180 controlCARD 基板集线站
www.ti.com/.../TMDSHSECDOCK
2.F28388D controlCARD 评估模块
www.ti.com/.../TMDSCNCD28388D

现在、我已经根据此控制器的 C2000Ware_3_02_00_00附带的示例创建了一个测试项目、在该项目中、我要执行以下操作: 通过 SPI 发送数据、发现正在触发中断且发送数据包的计数器正在增加、在引脚上站起来观察振荡器、并查看时钟和数据

void Test_Dev_Init (void){
//SPI_A
引脚= 18;// CLK
GPIO_setMasterCore (引脚、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_18_SPIA_CLK);
GPIO_setPadConfig (引脚、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (引脚、GPIO_QUAL_异 步);
引脚= 16;//SIMO
GPIO_setMasterCore (引脚、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_16_SPIA_SIMO);
GPIO_setPadConfig (引脚、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (引脚、GPIO_QUAL_异 步);
引脚= 17;//SOMI
GPIO_setMasterCore (引脚、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_17_SPIA_SOMI);
GPIO_setPadConfig (引脚、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (引脚、GPIO_QUAL_异 步);
引脚= 19;// STE
GPIO_setMasterCore (引脚、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_19_SPIA_STEN);
GPIO_setPadConfig (引脚、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (引脚、GPIO_QUAL_异 步);
//配置
SPI_disableModule (SPIA_BASE);
// SPI 配置。 使用500kHz SPICLK 和16位字大小。
SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、SPI_MODE_MASTER、SPI_A_SPEED、 SPI_A_DATA_width);
SPI_disableLoopback (SPIA_BASE);
SPI_setEmulationMode (SPIA_BASE、SPI_emulation_free_run);
// FIFO 和中断配置
SPI_enableFIFO (SPIA_BASE);
SPI_resetTxFIFO (SPIA_BASE);
SPI_setFIFOInterruptLevel (SPIA_BASE、SPI_FIFO_TX8、SPI_FIFO_RX8);
SPI_clearInterruptStatus (SPIA_BASE、SPI_INT_TXFF);
SPI_enableInterrupt (SPIA_BASE、SPI_INT_TXFF);
SPI_enableModule (SPIA_BASE);

INTERRUPT_REGTER (INT_SPIA_TX、&SPI_A_FIFO_ISR);
INTERRUPT_ENABLE (INT_SPIA_TX);
}

//////////////////////////////// 测试 SPI /////////////////////////////////////////////////////
volatile uint16_t SPI_txMsgCount = 0;

__interrupt void SPI_A_FIFO_ISR (void){
uint32_t i、status;

状态= SPI_getInterruptStatus (SPIA_BASE);
I = SPI_getTxFIFOStatus (SPIA_BASE);
SCIprintf ("\r\nSPI_A_FIFO_ISR (int_STS = 0x%x、fifo_STS = 0x%x、)"、status、i);

SPI_txMsgCount++;

SPI_clearInterruptStatus (SPIA_BASE、SPI_INT_TXFF);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group6);

状态= SPI_getInterruptStatus (SPIA_BASE);
I = SPI_getTxFIFOStatus (SPIA_BASE);
SCIprintf ("\r\nSPI_A_FIFO_ISR_After (int_STS = 0x%x、fifo_STS = 0x%x、)"、status、I);

}

void Test_Dev_SPI (void){
uint32_t i;
uint16_t SPI_DATA[2]={0、0};

SCIprintf ("\r\nTest_Dev_SPI Start");
while (SPI_txMsgCount < 10){
对于(i = 0;i < 2;i++){
SPI_writeDataNonBlocking (SPIA_BASE、SPI_DATA[i]<<(16 - SPI_A_DATA_width));
SPI_DATA[I]++;
}
}

SCIprintf ("\r\nTest_Dev_SPI end");
}

void main (void)
{//初始化器件时钟和外设
device_init();

//启动 CM 内核
#ifdef _flash
DEVICE_BOOTCM (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
#else
DEVICE_BOOTCM (BOOTMODE_BOOT_TO_S0RAM);
#endif

//初始化 GPIO
DEVICE_initGPIO();

//禁用 CPU 中断
Dint;

//初始化中断控制器和矢量表。
interrupt_initModule();
interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;

//init 接口和外围设备
test_Dev_Init();


EINT;
ERTM;

SCIprintf ("\033C");
SCIprintf ("\r\n||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||) \n");


TEST_Dev_SPI();

} 



现在我看到以下内容:通过 SPI、只要我启用中断、就会立即调用 SPI 中断、尽管数据不是通过 SPI 传输的、而传输标志不会被清除、从调试打印中可以看出:

SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR_After (INT_STS = 0x8、FIFO_STS = 0x0、)
SPI_A_FIFO_ISR (INT_STS = 0x8、FIFO_STS = 0x0

很可能问题是设置中断本身、但我根据示例查看了所有内容、我做的很好、示例本身的行为也一样

我让大家看看初始化、也许您会有一些想法、我已经查看了 TI 的一组示例、在 GitHub 上、我看不到以这种方式通过 SPI 处理中断的原因是什么

我还想提请您注意、该模块通过外部电源+ 5V、1.2A 供电、即电流应该足够

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    DSD、

    根据您的代码、您已启用 SPI TX FIFO 中断(TXFFINT)。 只要 TXFFST <= TXFFIL、就会产生 SPI TX FIFO 中断。 根据您的配置、TXFFIL = 8且 TXFFST 将始终小于8 (因为您写入的字不超过2个)、这意味着 SPI TX FIFO 中断不断被触发、这是您反复进入 SPI_A_FIFO_ISR 中断服务例程的原因。

    在 SPI_A_FIFO_ISR 内部、您正在读取 SPISTS 寄存器内容并将其存储在 int_STS 中、并将 TXFFST 值存储在 fifo_STS 中。 这里有几个问题。

    1) 1)清除 TXFFINT 标志不会对 TXFFST 值产生任何影响。

    2) 2)当 TXFFINT 标志清零时、由于 TXFFST 仍然小于 TXFFIL、它会再次自行置位。 如果要正确清除 TXFFINT 标志、请确保填充 SPI TX FIFO、以便 TXFFST > TXFFIL (8)、然后清除 TXFFINT 标志。

    我还认为您应该在 ISR 中读取并存储 TXFFST、您应该读取 TXFFINT 标志位的状态并将其存储。

    此致、

    曼诺伊