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.

[参考译文] msp430fr2311:加速eUSCI SPI

Guru**** 2609285 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656047/msp430fr2311-speeding-up-eusci-spi

部件号:MSP430FR2311

我需要发送一个快速的16位SPI数据包。

我从示例代码开始,一直在调整它,但我看到8位传输之间有很大的差距,奇怪的是,8位传输后有很大的差距。

除了尽量精简我的中断例程之外,我还应该做什么来尽量减少寄存器配置中的这段时间?

我在中断中控制软件中的SSN,因为它是16位传输。  

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

    从您的描述中,我想说,从排除中断开始。 具有快速SPI时钟(4MHz?) 中断会减慢您的速度,不会给您带来任何好处。

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

    正如Bruce所建议的那样,您可以通过在某个点消除中断来稍微加快SPI传输,但这也取决于MCLK速度与SMCLK的速度。 我也认为这也许是这里的问题。 MSP430的运行速度与SPI (我假设的SMCLK)的运行速度如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Bruce! 完全合理... 我甚至没有考虑过切断中断,但在我的应用程序中,它们没有增加任何价值,但它们确实增加了大量开销。 这将使我能够以更少的延迟进行更好的控制。 非常感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Jace:

    SMCLK以16MHz运行... 我在0和4之间也玩过UCA0BR0 ...似乎都很好用。 我的配置是否有任何问题?


    //------------------
    // SPI设置例程
    //------------------
    UCA0CTLW0 |= UCSWRST; //**将状态机置于复位**
    // 4引脚,8位SPI主控

    UCA0CTLW0 |= UCMST|UCSYNC|UCCKPL|UCMSB|UCMODE_1|UCSTEM;//时钟极性高,MSB
    UCA0CTLW0 |= UCSSEL__SMCLK;
    UCA0BR0 = 0x4;
    UCA0BR1 = 0; //
    UCA0MCTLW = 0; //无调制
    UCA0CTLW0 &=~UCSWRST; //**初始化USCI状态机**
    UCA0IE |= UCRXIE; //启用USI_A0 RX中断
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Blake,

    MCLK位于什么位置? 如果在这种情况下CPU未达到最大值,我会看到CPU延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以下是我正在对时钟配置执行的操作...此操作是否也将我的SCLK设置为16MHz,或者我是否需要执行其他操作来配置它...

    //----------------
    //将时钟设置为16MHz
    //----------------

    //根据MCLK设备数据表的要求配置一个FRAM等待状态
    //在配置时钟系统之前运行超过8MHz。

    FRCTL0 = FRCTLPW | NWITS_1;

    __bis_sr_register (SCG0); //禁用FLL
    CSCTL3 |= SELREF_REFCLK; //将REFO设置为FLL参考源
    CSCTL0 = 0; //清除DCO和MOD寄存器
    CSCTL1 &=~(DCORSEL_7); //首先清除DCO频率选择位
    CSCTL1 |= DCORSEL_5; //设置DCO = 16MHz
    CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz
    __DELAY周期(3);
    __BIC_SR_REGISTER (SCG0); //启用FLL
    While (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1)); // FLL已锁定

    CSCTL4 = SELMS__DCOCLKDIV |拉美经济体系__REFOCLK; //将默认的REFO(~3.2768万Hz)设置为ACLK源,ACLK =3.2768万Hz
    //默认DCOCLKDIV为MCLK和SMCLK源
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我从你的示波器轨迹中得到4MHz,所以结合BR=4,表明SMCLK的频率真的是16MHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Balke,

    是的,您的MCLK和SMCLK似乎都是16 MHz。 这是正常的,但它似乎表明中断以这些速度进入了道路。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    酷... 我在从达拉斯回来的时候写了一些新的代码。  我很想尝试一下。  如果一切都如预期的那样,就会有巨大的加速潜力。

    感谢大家的帮助。

    Blake