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.

[参考译文] MSPM0G3519:传输之间的 SPI 时间

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1531757/mspm0g3519-spi-time-between-transfers

器件型号:MSPM0G3519

工具/软件:

嗨、我正在将 SPI 用于 TFT 显示器、我测量当我对 TX FIFO 已满进行轮询时、传输之间需要 1.5us 时间、如果我在没有轮询的情况下写入 TX FIFO 需要 100ns 时间、这是否正常? 我如何实现两次转账之间最少的时间?

for (;;) {
        vTaskDelay(pdMS_TO_TICKS(500));
        SPI_Write_9bits(0x15);
        SPI_Write_9bits(0x14);
        SPI_Write_9bits(0x13);
        SPI_Write_9bits(0x12);
        vTaskDelay(pdMS_TO_TICKS(500));
        DL_SPI_transmitData16(SPI_0_INST, 0x15);
        DL_SPI_transmitData16(SPI_0_INST, 0x15);
        DL_SPI_transmitData16(SPI_0_INST, 0x15);
        DL_SPI_transmitData16(SPI_0_INST, 0x15);*/
    }
    
    void SPI_Write_9bits(uint16_t writeData) {
    
    while(DL_SPI_isTXFIFOFull(SPI_0_INST)){};
    DL_SPI_transmitData16(SPI_0_INST, writeData);

    }

我还注意到、即使我设置 DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA1、在传输之间也不会阻止 CS 线路、这就是 SPI 配置:

static const DL_SPI_Config gSPI_0_config = {
    .mode = DL_SPI_MODE_CONTROLLER,
    .frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA1,
    .parity = DL_SPI_PARITY_NONE,
    .dataSize = DL_SPI_DATA_SIZE_9,
    .bitOrder = DL_SPI_BIT_ORDER_MSB_FIRST,
    .chipSelectPin = DL_SPI_CHIP_SELECT_0,
};

static const DL_SPI_ClockConfig gSPI_0_clockConfig = {.clockSel = DL_SPI_CLOCK_BUSCLK,
                                                      .divideRatio = DL_SPI_CLOCK_DIVIDE_RATIO_1};

SYSCONFIG_WEAK void SYSCFG_DL_SPI_0_init(void) {
    DL_SPI_setClockConfig(SPI_0_INST, (DL_SPI_ClockConfig *)&gSPI_0_clockConfig);

    DL_SPI_init(SPI_0_INST, (DL_SPI_Config *)&gSPI_0_config);

    DL_SPI_setBitRateSerialClockDivider(SPI_0_INST, 0);


    /* Enable module */
    DL_SPI_enable(SPI_0_INST);
}
时钟为 80MHz、SPI 为 40MHz、我还使用 FreeRTOS。

提前感谢您

Rafael

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

    对于问题 2:这将得到 TRM (SLAU846B) 中“连续背对背“的定义  19.2.3.1.从历史和上下文来看、我得出结论:“TX FIFO 永远不会变为空“。  当 SCK = CPUCLK/2 时、您有 18 个 CPU 时钟来将下一帧进入 FIFO。 这比看起来更少,并且似乎也不可能在你写下一个帧之前把帧移出,这会使你进入“单字传输“类别,因此/CS 被取消断言。 这是 我总是对 GPIO 执行/CS 的众多原因之一。

    对于问题 1:我认为 DL_SPI_isTXFIFOFull 可能会增加一些开销。 我想知道 100ns 来自哪里--我的计算器说、40MHz 的 9 位帧需要 225ns。 我记得这是一个内联函数、因此也许可以使用-os(或类似的)来改进。 我期望 DMA 也能提供帮助。

    [编辑:忘记提及 DMA。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于问题 1:我认为 DL_SPI_isTXFIFOFull 可能会增加一些开销。 我想知道 100ns 来自哪里--我的计算器说、40MHz 的 9 位帧需要 225ns。 我记得这是一个内联函数、因此也许可以使用-os(或类似的)来改进。 我希望 DMA 也能提供帮助。

    DL_SPI_isTXFIFOFULL 仅读取寄存器(返回 ((SPI->STAT 和 SPI_STAT_TNF_MASK)= SPI_STAT_TNF_FULL);)、但可能该寄存器未快速更新、我获得这个 1.5us 延迟。

    对于问题 2:这涉及 TRM (SLAU846B) 中“连续背对背“的定义  19.2.3.1.从历史和上下文来看、我得出结论:“TX FIFO 永远不会变为空“。  当 SCK = CPUCLK/2 时、您有 18 个 CPU 时钟来将下一帧进入 FIFO。 这比看起来更少,并且似乎也不可能在你写下一个帧之前把帧移出,这会使你进入“单字传输“类别,因此/CS 被取消断言。 这是 我总是对 GPIO 执行/CS 的众多原因之一。

    您是对的、我将时钟降低到 20MHz、现在我看到连续传输、没有传输之间的时间和 CS 保持低电平(仅在无轮询代码中)、我不知道为什么 当 SPI 处于 40MHz 时 DL_SPI_transmitData16 () 不够快、它会向 TXDATA 寄存器写入一个值、是否需要 18 个以上的 CPU 时钟? 如果可以在 40MHz 上实现连续的背对背传输、我将尝试实现 DMA。

    感谢你的帮助

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

    我的另一个“许多原因“是当我的大脑在加载 FIFO 的过程中插入一个(假设的)杂散计时器中断。 另一个通道正在设想在加载 FIFO 的过程中循环到另一个通道。 这些是将破坏我的 SPI 事务的正常可预见(但不可预测)事件。 我的结论是“连续背靠背“太脆弱、无法依赖、因此我自己控制/CS 以确保。

    也就是说:我希望(根据经验)DMA 将改进您的 TFT 更新。