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.

[参考译文] TMS320F28388D:在使用 SPI FIFO 方面存在疑问

Guru**** 2578945 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1232113/tms320f28388d-doubt-regarding-the-usage-of-spi-fifo

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

您好、TI 团队、

我正在尝试 在 F2838D 控制器中使用 SPI FIFO 中断方法从主器件接收20个字节的数据(Ten16位值)。  

主配置(非 TI 控制器):时钟:500kHz、模式:0 (极性和相位均为零)、数据宽度:16

从器件配置(TI 的 F28388D): 500kHz、 模式:0 (极性和相位均为零)、 数据宽度:16、FIFO 中断级别:4、中断激活:接收中断。 下图具有从器件配置。

在下面的 Rx ISR 实现中、我尝试通过监控 FIFO 状态直至其变为零来读取完整的数据。  

 __interrupt void spiaRxFIFOISR(void)
{
    volatile uint16_t flags, chr, words, fifoStatus;
    uint16_t i = 0;
    printf("Entered InterruptServiceRoutine...: %d\n", i++);

    do
    {
        fifoStatus = SPI_getRxFIFOStatus(SPIA_slave_BASE);
        flags =  SPI_getInterruptStatus(SPIA_slave_BASE);

        if(SPI_getRxFIFOStatus(SPIA_slave_BASE))
        {
            chr = SPI_readDataBlockingFIFO(SPIA_slave_BASE);
            printf("The data is: %d\n",chr);
            ReceiveBuffer[NumCharsReceived++] = chr;
        }
    }while(SPI_getRxFIFOStatus(SPIA_slave_BASE) );

    SPI_resetRxFIFO(SPIA_slave_BASE);
    SPI_clearInterruptStatus(SPIA_slave_BASE, SPI_INT_RXFF);
    SPI_clearInterruptStatus(SPIA_slave_BASE, SPI_INT_RX_OVERRUN );
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP6);

}

下图显示了主从导线之间 SPI 探测的4个信号的捕捉。

Question:

1.这是从 SPI 主站读取数据的正确方式吗?如果没有、您能否提供任何可以读取所有数据的资源? (我已经使用 FIFO 检查了 SPI 示例、在示例中、我们不监控任何位、而是使用 for 循环)。

2.如果我将 FIFO 中断级别设置为4、我能够正确读取5个字的数据(预期包括第0个字的 FIFO)、但中断永远不会再次到达该 ISR 来读取更多的数据。 在 ISR 实现中、我是否遗漏了与清除中断相关的任何内容?

3、使用带中断的 SPI FIFO 的工作/使用过程/流程是什么?

从主器件发送的数据:0x0000 、0x0001、 0x0002、 0x0003、0x0004、   0x0005、 0x0006、 0x0007、 0x0008、0x0009 、  0x000A、 0x000B、 0x000C、 0x000D、0x000E 、  0x000F、 0x0010、 0x0011、 0x0012、0x0013 。

从机中 FIFO 中断级别为4的数据接收: 0x0000、 0x0001、0x0002 、0x0003 、0x0004 。  

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

    以下是几项观察结果:

    1) 1)您无需使用 SPI_resetRxFIFO 中的此语句复位 RX FIFO (SPIA_SLAVE_BASE);

    2) 2)在 SysConfig 中、将仿真设置为自由运行模式、而不是您在下面配置的模式。

    在您提到的第1个 SPU RX FIFO 中断之后、您看不到任何其他输入。 SPIRX FIFO 状态寄存器的状态是什么? 是否大于4? 您是否检查了是否设置了相应的标志位 PIEIFR 寄存器? 是您的 SPIFFRx。 RXFFINT 标志位是否置位?

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

    感谢您的回复、Manoj。 我通过删除 ISR 中的 printf 语句解决了此问题。 我在 ISR 实现中使用的软件 printf 语句会在 ISR 中造成很多延迟。 我探测了 SPI 信号、可以在删除 printf 语句后看到 ISR 执行时间有很大的改进。