关于LM3S系列芯片SSI的时钟问题



芯片手册上说,当SSI从模式时,系统时钟至少是SSICLK的12倍。

我的问题是,这句话中,这个系统时钟与API函数SSIConfigSetExpClk()中的第二个参数是什么关系?

举例说,我的系统时钟设置为40MHz,SSIConfigSetExpClk()的第二个参数取40MHz/20=2MHz,

那么,我的SSICLK是不能大于40/12MHz呢 还是2/12MHz ?

  • 第二个参数,为系统时钟,即实际硬件供给SSI模块的时钟。具体见driverlib中的SSI.C源代码。

    举例说,如果系统时钟设置为40MHz,SSI为Master,SSICLK不能大于40/2MHz

                                                                       SSI为Slave  ,   SSICLK不能大于40/12MHz

  • 第二个参数必须选择系统时钟吗?

  • 是的,这个参数的作用是通过SSIConfigSetExpClk中的计算来确定SSICPSR和SSICR0[SCR]的值。具体可以看一下driverlib中的SSI.C源代码。

  • 我知道这个值的作用,我不确定的是,这个值除了选择等于系统时钟意外,能否选择等于系统时钟的分频值。

    比如,系统时钟为40MHz,而这个值,我选择20MHz。

    我想一般都会直接用系统时钟来定义的,我只是想了解一下这个概念性的东西。

  • 我没能很清楚的理解你的问题。

    在SSI.C中:

    ulMaxBitRate = ulSSIClk(第二个参数) / ulBitRate(第5个参数,也就是设定的SSIClk);

       ulPreDiv = 0;

       do

       {

           ulPreDiv += 2;

           ulSCR = (ulMaxBitRate / ulPreDiv) - 1;

       }

       while(ulSCR > 255);

    上面通过计算,得到合适的ulPreDiv 和ulSCR值,也就是之后赋给SSICPSR和SSICR0[SCR]的值。

    如果第二个参数给了一个不是系统时钟的值,那么得到的结果就没有意义。

    SSI的时钟计算公式:

    SSIClk = SysClk / (CPSDVSR * (1 + SCR))

  • SSIConfigSetExpClk()中第二个参数提供MCU中送到SSI模块的时钟的速度。有了SSI时钟速度,就可以计算出寄存器应该配置成多少才能获得你所需的波特率(ulBitRate参数)。之所以要提供这个参数是因为SSIConfigSetExpClk函数无法获得当前MCU系统时钟(即SSI模块时钟)的速度,所以需要用户提供。若系统时钟为40MHz该参数就应该为40,000,000;若系统时钟为80MHz,该参数就为80,000,000。也可以用SysCtlClockGet()函数获得系统的速度传入。

    “SSI从模式时,系统时钟至少是SSICLK的12倍”,也就是说从模式下,当系统时钟为40MHz时,SSI模块最高的速率只能配置为3.333333MHz (40MHz / 12)。即ulBitRate参数(SSIConfigSetExpClk中第五个参数)最多只能配置为3,333,333。

  • 谢谢Forrest 耐心的回答,其实,我看到Richard Ma说的一句话:“之所以要提供这个参数是因为SSIConfigSetExpClk函数无法获得当前MCU系统时钟(即SSI模块时钟)的速度,所以需要用户提供。”我顿悟