configuring and using video PLL on T4.1

Jean-Marc

Well-known member
I would like to use the video PLL to drive my Flexio DMA copy.
I use 2 Flexios (01 and O2).

#define flexio_clk_sel 2 (to use VIDEO PLL)

/* Set clock for FlexIO1 and FlexIO2 */
CCM_CCGR5 &= ~CCM_CCGR5_FLEXIO1(CCM_CCGR_ON);
CCM_CDCDR = (CCM_CDCDR & ~(CCM_CDCDR_FLEXIO1_CLK_SEL(3) | CCM_CDCDR_FLEXIO1_CLK_PRED(7) | CCM_CDCDR_FLEXIO1_CLK_PODF(7)))
| CCM_CDCDR_FLEXIO1_CLK_SEL(flexio_clk_sel) | CCM_CDCDR_FLEXIO1_CLK_PRED(0) | CCM_CDCDR_FLEXIO1_CLK_PODF(0);
CCM_CCGR3 &= ~CCM_CCGR3_FLEXIO2(CCM_CCGR_ON);
CCM_CSCMR2 = (CCM_CSCMR2 & ~(CCM_CSCMR2_FLEXIO2_CLK_SEL(3))) | CCM_CSCMR2_FLEXIO2_CLK_SEL(flexio_clk_sel);
CCM_CS1CDR = (CCM_CS1CDR & ~(CCM_CS1CDR_FLEXIO2_CLK_PRED(7)|CCM_CS1CDR_FLEXIO2_CLK_PODF(7)) )
| CCM_CS1CDR_FLEXIO2_CLK_PRED(0) | CCM_CS1CDR_FLEXIO2_CLK_PODF(0);

I need to configure the VIDEO PLL and start it.
I use this code which does not work...
Also I am not sure are what Fref is. I assume 649520000Hz?

// PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM)
CCM_ANALOG_PLL_VIDEO_NUM = 0;
CCM_ANALOG_PLL_VIDEO_DENOM = 1;
CCM_ANALOG_PLL_VIDEO = 0;
CCM_ANALOG_PLL_VIDEO |= (CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(2) | CCM_ANALOG_PLL_VIDEO_ENABLE);

Anyone can help?
 
I'm not sure how much I can help, but I am very interested in this discussion. That pll is capable of generating a carrier clock for sdr applications and I'd really like to figure out how to use it myself. The manual has like 100 pages spread out over half a dozen sections on getting this thing to make a signal on a pin.
 
I reused the code of the AUDIO PLL.

I get something but it is not fully clear what I get.
Is the below formula correct?

F = (24MHz * (DIV_SELECT + NUM/DENOM) ) * POST_DIV_SELECT
Reading the spec
-DIV_SELECT is between 27 and 54.
-POST_DIV_SELECT is 1,1/2 or 1/4.


static void set_videoClock(int nfact, int32_t nmult, uint32_t ndiv, bool force) // sets PLL5
{
if (!force && (CCM_ANALOG_PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_ENABLE)) return;

CCM_ANALOG_PLL_VIDEO = CCM_ANALOG_PLL_VIDEO_BYPASS | CCM_ANALOG_PLL_VIDEO_ENABLE
| CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1) // 2: 1/1; 1: 1/2; 0: 1/4
| CCM_ANALOG_PLL_VIDEO_DIV_SELECT(nfact);
CCM_ANALOG_PLL_VIDEO_NUM = nmult /*& CCM_ANALOG_PLL_VIDEO_NUM_MASK*/;
CCM_ANALOG_PLL_VIDEO_DENOM = ndiv /*& CCM_ANALOG_PLL_VIDEO_DENOM_MASK*/;
CCM_ANALOG_PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_POWERDOWN;//Switch on PLL
while (!(CCM_ANALOG_PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK)) {}; //Wait for pll-lock

const int div_post_pll = 1; // other values: 2,4

if(div_post_pll>3) CCM_ANALOG_MISC2 |= CCM_ANALOG_MISC2_DIV_MSB;
CCM_ANALOG_PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_BYPASS;//Disable Bypass
}
 
I never closed this thread but it actually worked fine. See vgat4 library as example. Videopll is there optional for use and needed for the 640x480 mode.
 
Back
Top