For a SSI peripheral we need precisely 16,0MHz clock. It fit's nicely when having a clock for the processor of 96MHz / 6. (SSInClk = SysClk / (CPSDVSR * (1 + SCR)) ). fxtal = 25MHz. Now using the latest Tivaware this frequency is not possible any more. This is due to the errata SYSCTL#22. As we still need the 96MHz clock we need a work around.
The description in the errata does not fully explain the behaviour as it just states:
“When generating system clock from the PLL, the user programs the system control register bits RSCLKCFG.PSYSDIV to divide the PLL output. This register value may not be loaded into the physical divider causing the system clock to be divided by 2. This condition will cause the system clock to be out of specification.”
The clock is calculated :
fIN = fXTAL/(Q+1)(N+1) , 5MHZ>fIN<30MHz
MDIV = MINT + (MFRAC / 1024)
fVCO =(fIN * MDIV)
SysClk = fVCO/(PSYSDIV + 1)
As we have been programming the PSYSDIV successfully for years, there might be some conditions for faulty behaviour. So some questions arise:
1. Is it possible to check for correct programming of PSYSDIV and reprogram if not correct ?
And if yes
2. If the real issue is the SysClk becoming higher than 120MHz, the programming of the PSYSDIV could take place at a lower fVCO initially ?
If we are forced to find the 96MHz as close as possible by forcing/keeping PSYSDIV to the value 1, we will need different values of fVCO. The data sheet does not give the min/max values for fVCO, but it seems that tha max value is 240MHz due to SYSCTL#22.
3. Is the max value for fVCO still 480MHz ?
4. Any min value for fVCO ?
PS. Playing with the numbers and adjusting the crystal by 8 PPM to 24.9998063 MHz, I can get a sysclk of 112MHz precisely to divide by 7 to get the 16MHz needed. Then PSYSDIV = 2, Q=2, N=0.