Chip_SCU_PinMuxSet(1, 12, SCU_MODE_FUNC6); //Slice A, SGPIO8
Chip_SCU_PinMuxSet(0, 1, SCU_MODE_FUNC3); //Slice D, SGPIO1
Chip_SCU_PinMuxSet(2, 1, SCU_MODE_FUNC0); //Slice F, SGPIO5
Chip_Clock_SetBaseClock(CLK_BASE_PERIPH, CLKIN_IDIVC, TRUE, FALSE); //For SGPIOs
/* Setup Slice A, SGPIO8 for CLKOUT */
LPC_SGPIO->PRESET[SGPIO_SLICE_A]= 0; //Set COUNT (PRESET) to count-1
LPC_SGPIO->COUNT[SGPIO_SLICE_A] = 0; //Initialize counter as well
LPC_SGPIO->OUT_MUX_CFG[8] = //SGPIO8
SGPIO_OUT_MUXCFG_OUTCFG_CLKOUT
| SGPIO_OUT_MUXCFG_OECFG_GPIOOE;
LPC_SGPIO->SLICE_MUX_CFG[SGPIO_SLICE_A]= (1 << 3); //Slice A Invert clock output
LPC_SGPIO->SGPIO_MUX_CFG[SGPIO_SLICE_A]= 0; //Defaults
LPC_SGPIO->GPIO_OENREG |= (1 << 8); //Output Enable SGPIO8
/* Setup Slice D, CLKOUT */
LPC_SGPIO->PRESET[SGPIO_SLICE_D]= 0; //Set COUNT (PRESET) to count-1
LPC_SGPIO->COUNT[SGPIO_SLICE_D] = 0; //Initialize counter as well
LPC_SGPIO->OUT_MUX_CFG[1] = //SGPIO1
SGPIO_OUT_MUXCFG_OUTCFG_CLKOUT
| SGPIO_OUT_MUXCFG_OECFG_GPIOOE;
LPC_SGPIO->SLICE_MUX_CFG[SGPIO_SLICE_D]= 0; //Default
LPC_SGPIO->SGPIO_MUX_CFG[SGPIO_SLICE_D]= 0; //Default
LPC_SGPIO->GPIO_OENREG |= (1 << 1); //Output Enable SGPIO1
/* Setup Slice F, SGPIO5 as CLKOUT using External Clock for input */
LPC_SGPIO->PRESET[SGPIO_SLICE_F]= 3; //Divide PERIPH rate by 4 so we can
LPC_SGPIO->COUNT[SGPIO_SLICE_F] = 3; //see the difference from ExtClocks
LPC_SGPIO->OUT_MUX_CFG[5] = //SGPIO5
SGPIO_OUT_MUXCFG_OUTCFG_CLKOUT //Clock out to measure
| SGPIO_OUT_MUXCFG_OECFG_GPIOOE;
LPC_SGPIO->SLICE_MUX_CFG[SGPIO_SLICE_F]= //Slice F
SGPIO_SLICE_MUXCFG_CLKGEN; //External Clock
LPC_SGPIO->SGPIO_MUX_CFG[SGPIO_SLICE_F]= //Slice F
SGPIO_MUXCFG_EXTCLK_ENABLE //Enable external clock (1 for SPGIO8, possibly 0 for Slice D?)
| SGPIO_MUXCFG_CS_PMODE_SGPIO8 //External clock SGPIO8
| SGPIO_MUXCFG_CS_SMODE_SLICED //External clock on Slice D
| SGPIO_MUXCFG_QUAL_MODE_ENABLE; //Qualifier input always enabled
LPC_SGPIO->GPIO_OENREG |= (1 << 5); //Output Enable SGPIO5
/* Go */
LPC_SGPIO->CTRL_DISABLED = ~((1 << SGPIO_SLICE_A) | (1 << SGPIO_SLICE_D) | (1 << SGPIO_SLICE_F)); //Slice A, D, F
LPC_SGPIO->CTRL_ENABLED = (1 << SGPIO_SLICE_A) | (1 << SGPIO_SLICE_D) | (1 << SGPIO_SLICE_F); //Slice A, D, F
I have tried many variations on this test, but the results are always the same,
fully repeatable. The lack of external clock input is contrary to the documentation
but is demonstrated by this test to not work. When the external clock source is selected
the no clock is provided at all.
I realize that I must have missed something in the setup, but I have been over this
literally dozens of times, I have read every article online about SGPIO and
external clocks. The proof is in the simplified example. I cannot figure out a solution
to get an external clock to drive any SGPIO input.
Please look over the example in detail and tell me how to get an external
clock as an external clock input to and SGPIO slice.
Thank you,