Collaboration diagram for Cypress CY2239x:
#include <dev/cy2239x.h>
The CY22393 chip is used in the Ethernut 3 reference design. It provides three unique frequencies on six outputs, with an additional divider at five outputs.
The following outputs are used on Ethernut 3:
Defines | |
#define | CY2239X_CLKA 0 |
Clock A output. | |
#define | CY2239X_CLKB 1 |
Clock B output. | |
#define | CY2239X_CLKC 2 |
Clock C output. | |
#define | CY2239X_CLKD 3 |
Clock D output. | |
#define | CY2239X_CLKE 4 |
Clock E output. | |
#define | CY2239X_REF 0 |
Reference clock identifier. | |
#define | CY2239X_PLL1 1 |
PLL1 identifier. | |
#define | CY2239X_PLL2 2 |
PLL2 identifier. | |
#define | CY2239X_PLL3 3 |
PLL3 identifier. | |
#define | I2C_SLA_PLL 0x69 |
I2C address. | |
#define | NUT_PLL_FREF 25000000UL |
Base frequency. | |
Functions | |
int | Cy2239xGetPll (int clk) |
Get the PLL connected to the specified output. | |
int | Cy2239xSetPll (int clk, int pll) |
Connect a specified PLL to a specified output. | |
int | Cy2239xGetDivider (int clk, int fctrl) |
Get the current divider value of the specified output. | |
int | Cy2239xSetDivider (int clk, int sel, int val) |
Set the divider value of the specified output. | |
int | Cy2239xPllEnable (int pll, int fctrl, int ena) |
Enable or disable a specified PLL. | |
u_long | Cy2239xPllGetFreq (int pll, int fctrl) |
Get the current frequency of a specified PLL. | |
int | Cy2239xPllSetFreq (int pll, int fctrl, u_int pval, u_int poff, u_int qval, u_int fval) |
Set the frequency of a specified PLL. | |
u_long | Cy2239xGetFreq (int clk, int fctrl) |
Get the frequency of a specified output. |
|
Clock A output. On Ethernut 3 this is output drives the Ethernet Controller, if R3 is mounted (default). |
|
Clock B output. On Ethernut 3 this is output drives the GCK1 input of the CPLD, if R6 is mounted (default). |
|
Clock C output. On Ethernut 3 this is output drives the CPU, if R5 is mounted (default). |
|
Clock D output. On Ethernut 3 this is output drives the GCK3 input of the CPLD, if R4 is mounted and R104 is not mounted (default). |
|
Clock E output. On Ethernut 3 this is output drives the GCK3 input of the CPLD, if R104 is mounted and R4 is not mounted. By default R104 is not mounted, but R4 is. |
|
PLL1 identifier. The output of PLL1 can be connected to any output divider. Clock E output is fixed to PLL1. |
|
PLL2 identifier. The output of PLL2 can be connected to the output divider of clock A, B, C or D. |
|
PLL3 identifier. The output of PLL3 can be connected to the output divider of clock A, B, C or D. |
|
Base frequency. Frequency of the attached crystal. On Ethernut 3 a 25 MHz crystal is used. |
|
Get the PLL connected to the specified output.
int pll; pll = Cy2239xGetPll(CY2239X_CLKC); |
|
Connect a specified PLL to a specified output.
if (Cy2239xSetPll(CY2239X_CLKB, CY2239X_PLL3)) { printf("Failed to select PLL3 for Clock B\n"); } |
|
Get the current divider value of the specified output.
|
|
Set the divider value of the specified output. Clock A through D provide a 7-bit output divider, while the Clock E divider is fixed to 0 (off), 2, 3 or 4. Changing the divider value of an active output may cause a glitch on the output.
|
|
Enable or disable a specified PLL.
if (Cy2239xSetDivider(CY2239X_CLKA, 1, 0)) { printf("Failed to disable ClkA Divider 1\n"); } if (Cy2239xPllEnable(CY2239X_PLL2, 7, 0)) { printf("Failed to disable PLL2\n"); } |
|
Get the current frequency of a specified PLL.
u_long fref; fref = Cy2239xPllGetFreq(CY2239X_REF, 7); |
|
Set the frequency of a specified PLL. If the PLL is enabled, it will be temporarily disabled. The resulting frequency can calculated by F = Fref * (2 * (Pval + 3) + Poff) / (Qval + 2) It is recommended to use Cypress' CyClocksRT utility for calculating the best parameter values.
|
|
Get the frequency of a specified output. On Ethernut 3 Clock A provides the Ethernet Controller clock and Clock C is used as the CPU clock. PLL1 provides two configurations, selectable by the external input S2, which might be controlled by the Ethernut 3 CPLD. However, NPL version 2 doesn't allow to modify the S2 line, but holds it at a fixed high level.
u_long fcpu; fcpu = Cy2239xGetFreq(CY2239X_CLKC, 7); |