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.

[参考译文] MSPM0L1105:SPI0 控制器接收中断速度

Guru**** 2523680 points
Other Parts Discussed in Thread: MSPM0L1105, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1553165/mspm0l1105-spi0-controller-receive-interrupt-speed

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

工具/软件:

你好

我们将 MSPM0L1105 用作 SPI 外设、并使用 CCS 和 SysConfig 配置了引脚多路复用器。

SPI 的配置如下:

我们已设置 IRQ 处理程序以执行一些非常基本的基准测试来测试响应时间:

void PER_SPI_INST_IRQHandler(void)
{
    uint32_t count = 0;
    uint16_t buffer[256] = {0}};

    switch (DL_SPI_getPendingInterrupt(PER_SPI_INST)) { 
        case DL_SPI_IIDX_RX_TIMEOUT:
            loopCount++;
            count =  DL_SPI_drainRXFIFO16(PER_SPI_INST, buffer, 256);
            DL_SPI_transmitDataBlocking16(PER_SPI_INST, loopCount);
            break;

        case DL_SPI_IIDX_RX:
            loopCount++;
            count =  DL_SPI_drainRXFIFO16(PER_SPI_INST, buffer, 256);
            gADCResult = convertAnalogInput(0);
            gADCResult &= 0x0FFF;
            DL_SPI_transmitDataBlocking16(PER_SPI_INST, loopCount);
            break;
        default:
            break;
    }
}

发送的数据为每个消息 16 位长度、总共 3 条消息用于表示 SPI ADC 外设的实际消息。

命令、虚拟周期、响应:

接收所有数据和时钟周期没有问题:

问题是我需要在第一条消息和第二条消息之间发生 RX 中断、以便填充发送缓冲区来响应主器件。

我已经尝试将 RX 超时设置为 125ns、希望它会在芯片选择转换阶段触发 IRQ(我们基本上有 12.5us)。

是否有办法使 SPI IRQ 更快、以便控制器收到 1 条消息时收到通知?

感谢您的帮助。

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

    从表面上看、我希望 (a) 使用 Rx FIFO 阈值=1 时、中断应该在每个接收到的数据之后触发、(b) 使用 32MHz CPU 时钟时、这个代码应该很容易地运行在 12.5 usec 内(除非 convertAnalogInput () 非常昂贵)、所以看到 count=3 是一个惊喜。

    我要指出:

    > uint16_t Buffer[256]={0};

    1) 每次调用时、该变量都必须初始化为 0。 一个假设是它不会加最多 3200 个 CPU 时钟、但它可能仍然使您的结果变得模糊不清。

    2) 在 512 字节时、这个变量是默认栈 (256B) 大小的两倍、因此您肯定会使栈溢出(每次调用时)。  

    我建议您将此变量移出 ISR 函数(全局)、或者至少将其设置为“静态“。

    您可以考虑留出一个在每次 ISR 调用时提升/降低的 GPIO、以便查看它实际被调用的位置(在事务中)。