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.

[参考译文] MSP430F5438A:SPI 字节被移出后的长延迟

Guru**** 2589245 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/780524/msp430f5438a-long-delay-after-spi-byte-was-shifted-out

器件型号:MSP430F5438A

您好!

我运行 MSP@1MHz。 SPI 处于主模式。 出于某种原因,我在字节移出后测量大约50us 的延迟,直到 SPI_TX_BYTE ()函数中 CS 设置回1。

这是函数和 IRQ 代码。

您是否知道导致延迟的原因?

Peter

//通过 SPI 发送一个字节
内联 void SPI_TX_BYTE (uint8_t 数据){

   _txLen=0;

   while (!(UCA0IFG&UCTXIFG));              // USCI_A0 TX 缓冲器准备就绪?
   爪形离合器_SET_cs (0);
   UCA0TXBUF = DATA;                        //发送一个字符
   _bis_SR_register (LPM0_Bits + GIE); //进入低功耗模式一次
   __no_operation();
   爪形离合器_SET_cs (1);


#pragma vector=USCI_A0_Vector
_interrupt void USCI_A0_ISR (void)

 switch (__evo_in_range (UCA0IV、4))
 {
   情况0:中断;                         //向量0 -无中断
   情况2:{                                //向量2 - RXIFG
       while (!(UCA0IFG&UCTXIFG));            // USCI_A0 TX 缓冲器准备就绪?
       if (_txLen!=0){
           _PTX++;
           UCA0TXBUF =*;
           _txLen--;
       }否则{
           //唤醒主循环
           _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);
       }
     中断;
   }
   情况4:                                //向量4 - TXIFG
   中断;


   默认值:break;
 }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的 ISR 中大概有50us。 在字节移出后、RXIFG 才会触发、也就是 ISR 启动时。

    1MHz 时50us 为50个时钟。 图20个时钟进入/退出 ISR、加上开关和测试、我猜可能会接近30-40uS、但50uS 不会让我感到意外。

    未经请求:使用快速 SPI、ISR 是一种净损失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    此外、从 LPM0出来也需要一些时间、大约3us。
    2.我建议您删除 LPM0功能并提高 MCLK 的频率。 然后测试延迟时间。

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

    您是否使用与 CPU 不同的时钟源运行 SPI、这意味着 UCxCLK 与 MCLK 异步?
    此外、发布时钟 SOMI 和 SIMO 的屏幕截图有助于更好地了解延迟来自哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我删除了 LPM 并只是循环发送。 这样做时、我认识到最大的延迟是在更大的循环中调用 sender 函数。
    因此、在我再次调用 TX 之前、大多数时间不在 TX 函数中、而是在所有代码中丢失。 这意味着我必须优化我的整个函数。

    感谢所有回复!

    Peter