AN2491 Application note STW8110x hardware component layer API guide Introduction Purpose and scope This document describes the HCL elements of the STW8110x HCL API included in the STW8110x evaluation kit. This document is intended for people using the STW8110x digital bus interfaces. It proposes an abstraction of the hardware in order to allow a user to use all the facilities provided by the HW IP. The document provides: ■ A brief description of the hardware ■ An overview of concepts on which the STW8110x HCL API is based ■ A description and explanation of all API types and functions ■ A user scenario ■ The public header file HCL API version August 2007 ■ Version of the STW8110x HCL API: V1.0 ■ Applicable to the IC: STW8110x Rev 1 1/32 www.st.com Contents AN2491 Contents 1 STW8110x API package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1 1.2 2 3 4 5 6 Content . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.1 Digital bus interface header file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.2 STW8110x API header file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.3 STW8110x API source file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 How to use the STW8110x API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 API overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1 Global initialization functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2 Configuration functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Data extraction functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Debug management functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.5 Driver targets and compilation options . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Constants and enums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.1 Both modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2 I2C mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.1 Both modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4.2 I2C mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.1 Both modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.2 I2C mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 User scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.1 I2C mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.2 SPI mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 7 STW8110x public header file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 8 Digital_Bus_interface header file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 2/32 AN2491 Contents 9 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 10 Revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3/32 List of functions, constants, enums and structures AN2491 List of functions, constants, enums and structures Configure_STW8110x() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 I2C_Read_Status_Register() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 STW8110x_Check_config() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 STW8110x_Get_Fout_value() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 STW8110x_Init() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 STW8110x_ProcessError(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 t_CP_SEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 t_PD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 t_PLL_A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 t_PSC_SEL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 t_SERCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 t_stw8110x_Config . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 t_stw8110x_Device_Type. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 t_stw8110x_error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 t_stw8110x_I2C_RO_reg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 t_stw8110x_PLL_Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 t_stw8110x_Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4/32 AN2491 1 STW8110x API package STW8110x API package It is highly recommended to read the STW81101, STW81102 or STW81103 datasheet before continuing to read this document. This API is a simple abstraction of the principles presented in these datasheets. The STW8110x device has two embedded digital bus interfaces (I2C and SPI) which allow their internal registers to be programmed. Each of these interfaces has its own dedicated protocol which must be followed to program the device correctly. For details of the STW8110x register and SPI and I2C protocols, refer to the relevant datasheet. 1.1 Content Three files are available in this package. A fourth file must be created by the user with implementation of I2C and SPI functions according to the master interface. Figure 1. Files available with this package 1. Digital bus interface header file 2. STW8110x API header file 3. STW8110x API source file 1.1.1 Digital bus interface header file Contains declarations of functions to be implemented by the user (refer to Section 8 for a complete listing). This subsection describes the tasks that the functions must accomplish. For more details about the digital bus protocol flow and configuration to apply to your master interface (as frequency) please refer to the STW81101, STW81102 or STW81103 datasheet. I2C mode t_I2C_Ack I2C_Send_data(unsigned char *data, int nb_bytes) { // 1 - Send Start Bit // 2 - loop i=1 to i=nb_bytes // a - send data[i] // b - wait acknowledge of slave // 3 - Send Stop Bit // return ACK, or NO_ACK if acknowledge hasn’t been received } t_I2C_Ack I2C_Read_data(unsigned char Add, unsigned char *data) { // 1 - Send Start Bit // 2 - send Add // 3 - wait acknowledge of slave 5/32 STW8110x API package AN2491 // 4 - read received data and affect it to *data // 3 - Send Stop Bit // return ACK, or NO_ACK if acknowledge hasn’t been received } SPI mode void SPI_Send_data(unsigned int data) { // Send data (32bits) on SPI bus } 1.1.2 STW8110x API header file Contains declaration of functions, structures and defines necessary to the device driver. (Refer to Section 7 for a complete listing). 1.1.3 STW8110x API source file Contains the C code of device driver. 1.2 6/32 How to use the STW8110x API 1. Add the API in your project (STW8110x.c, STW8110x.h, Digital_Bus_interface.h). 2. Create a file (Digital_Bus_interface.c) with functions to implement according your master interface. 3. Include the STW8110x header file (#include “STW8110x.h”) in the file which uses the API functions. 4. Use dedicated functions to program the device (see examples in Section 6). AN2491 API overview 2 API overview Note: To ensure the correct usage of this HCL API, it is HIGHLY recommended to use this API in the debug mode first (by use of __DEBUG preprocessor as described in Section 2.5). Only after the application has executed successfully in debug mode should the STW8110x driver be run in release mode. The API contains 4 types of functions: 2.1 ● Functions related to the global initialization of STW8110x ● Functions related to the configuration of STW8110x ● Functions related to extraction of the STW8110x configuration information ● Functions related to STW8110x debug management Global initialization functions STW8110x_Init(); initializes the data structures of the STW8110x HCL. 2.2 Configuration functions Configure_STW8110x(); configures the STW8110x device. 2.3 2.4 Data extraction functions ● STW8110x_Check_config(); verifies selected configuration. ● STW8110x_Get_Fout_value(); gets output frequency according selected configuration. ● I2C_Read_Status_Register(); obtains information about read-only register (I2C mode). Debug management functions STW8110x_ProcessError (); manages possible errors of the STW8110x device driver. 7/32 API overview 2.5 AN2491 Driver targets and compilation options The driver source files can work in several environments. There are three possible targets for which the driver compilation options (#define) customize the code for the target. ● The platform - represents the IC (STW81101, STW81102, STW81103). ● The interface - represents digital interface used to program the device (I2C, SPI). ● The mode - identifies if the code is being compiled for debug or release mode. Table 1. Platform STW81101 STW81102 STW81103 #define __PLATFORM_STW81102 __PLATFORM_STW81103 Table 2. __PLATFORM_STW81101 Target interface compilation options Interface I2C SPI #define __INTERFACE_I2C __INTERFACE_SPI Table 3. 8/32 Target platform compilation options Target mode compilation options Mode Debug Release #define __DEBUG __NO_DEBUG AN2491 Constants and enums 3 Constants and enums 3.1 Both modes t_PD Defines the device functional mode. typedef enum { POWER_DOWN, VCO_A_FREQ_DIV_2, VCO_B_FREQ_DIV_2, VCO_EXT_FREQ_DIV_2, VCO_A_FREQ_DIV_4, VCO_B_FREQ_DIV_4, VCO_EXT_FREQ_DIV_4, VCO_A_DIRECT_OUTPUT, VCO_B_DIRECT_OUTPUT, VCO_EXT_DIRECT_OUTPUT } t_PD; t_SERCAL Defines the VCO auto-calibration status. typedef enum { VCO_CAL_DISABLED, VCO_CAL_ENABLED } t_SERCAL; t_CP_SEL Defines the charge pump current typedef enum { CURRENT_I_MIN, CURRENT_2_I_MIN, CURRENT_3_I_MIN, CURRENT_4_I_MIN, CURRENT_5_I_MIN, CURRENT_6_I_MIN, CURRENT_7_I_MIN, CURRENT_8_I_MIN } t_CP_SEL; 9/32 Constants and enums AN2491 t_PSC_SEL Defines the prescaler modulus. typedef enum { PRESCALER_16, PRESCALER_19 } t_PSC_SEL; t_PLL_A Defines the PLL amplitude voltage of VCO. typedef enum { AMPL_1V1, AMPL_1V3, AMPL_1V9, AMPL_2V1 } t_PLL_A; t_stw8110x_error Defines all errors that can be returned by the functions of the STW8110x HCL API. typedef enum { OK ERR_A_HIGHER_THAN_B ERR_A_OUTOF_RANGE ERR_B_OUTOF_RANGE ERR_N_OUTOF_RANGE ERR_VCOA_FREQ_OUTOF_RANGE ERR_VCOB_FREQ_OUTOF_RANGE ERR_FUNCT_MODE_UNKNOWN ERR_REF_CLK_DIVIDER ERR_PRESCALER ERR_VCO_CALIBRATION ERR_VCO_VOLTAGE #ifdef __INTERFACE_I2C ERR_I2C_ACK ERR_BAD_DEVICE ERR_I2C_READ #endif ERR_CHARGE_PUMP_CURRENT } t_stw8110x_error ; 10/32 = = ,// ,// ,// ,// ,// ,// ,// ,// ,// ,// 0, -113, = -112, = -111, = -110, = -109, = -108, = -107, = -106, = -105, = -104, = -103, ,// = -102, ,// = -101, ,// = -100, //__INTERFACE_I2C // = -99 or -102 AN2491 3.2 Constants and enums I2C mode t_stw8110x_Device_Type Defines the device name. typedef enum { DEV_STW81101, DEV_STW81102, DEV_STW81103 } t_stw8110x_Device_Type ; t_stw8110x_PLL_Status Defines the status of PLL. typedef enum { PLL_UNLOCKED, PLL_LOCKED } t_stw8110x_PLL_Status ; 11/32 Structures AN2491 4 Structures 4.1 Both modes t_stw8110x_Registers Defines the structure of STW8110x registers. typedef struct { #ifdef __INTERFACE_I2C t_uint8 REG0; // Functional modes t_uint8 REG1; // B counter t_uint8 REG2; // A counter t_uint8 REG3; // Reference divider t_uint8 REG4; // Control t_uint8 REG5; // Calibration t_uint8 REGRO; // Read only register: internal calibration of // VCO, PLL state (locked,unlocked), Device ID #endif //__INTERFACE_I2C #ifdef __INTERFACE_SPI // ST1: reference divider, VCO amplitude, VCO Calibration, // Charge Pump current, Prescaler Modulus t_uint32 ST1; // ST2: Functional modes, VCO dividers // __INTERFACE_SPI #endif t_uint32 ST2; } t_stw8110x_Registers ; t_stw8110x_Config Defines the structure that holds essential transfer parameters for device configuration. typedef struct { t_bool DEFAULT_CONFIG; t_SERCAL VCO_CALIBRATION_EN; t_PD DEVICE_FUNCTIONAL_MODE; t_uint32 MAIN_COUNTER; t_uint32 SWALLOW_COUNTER; t_uint32 REF_CLOCK_DIV_RATIO; t_PLL_A VCO_AMPLITUDE_VOLTAGE; t_CP_SEL CHARGE_PUMP_CURRENT; t_PSC_SEL PRESCALER_MODULUS; } t_stw8110x_Config ; Note: 12/32 If the field DEFAULT_CONFIG is marked as BOOL_TRUE then the remaining fields following it may not be used and may not be filled up. Instead the default configuration for the device (as programmed in STW8110x_Init) will be used. The default configuration is described in the STW81101, STW81102 and STW81103 datasheets. AN2491 4.2 Structures I2C mode t_stw8110x_I2C_RO_reg Defines the structure of STW8110x read-only register. typedef struct { t_stw8110x_Device_Type DEV_TYPE; // Device identifier bit t_stw8110x_PLL_Status LOCK_DET; // '1' when PLL is locked t_uint8 INT_CAL; //VCO ctrl word internal value } t_stw8110x_I2C_RO_reg ; 13/32 Functions 5 AN2491 Functions STW8110x has 3 bits which are programmable in I2C mode. This means that eight STW8110x devices should be connected to the same I2C master. The choice of device is performed via the 3 programmable address bits (A2, A1, A0 set to 0V (0) or 3.3V (1)). This is why, if I2C mode is selected, some functions require a supplementary parameter which specifies the address of the device to access I2C_ADD (0 to 7). 5.1 Both modes STW8110x_Init() 14/32 Description Initializes the STW8110x HCL. Definition t_stw8110x_error STW8110x_Init( t_stw8110x_Config *Device_config_init #ifdef __INTERFACE_I2C ,t_uint8 I2C_ADD #endif ); Arguments Both modes (out) I2C mode (in) Device_config_init: Structure containing default config of device I2C_ADD: Address of STW8110x device (only I2C mode) Return value t_stw8110x_error FunctionType Synchronous Comments Potential errors: – Both modes: OK, – I2C modes: ERR_BAD_DEVICE, ERR_I2C_ACK, ERR_I2C_READ The routine initializes the device configuration descriptor. If I2C mode is selected, a read of the read only register is performed to check if the selected target matches with the accessed device. AN2491 Functions Configure_STW8110x() Description Configures the STW8110x device. Definition t_stw8110x_error Configure_STW8110x( t_stw8110x_Config Device_config_init #ifdef __INTERFACE_I2C ,t_uint8 I2C_ADD #endif ); Arguments Both modes(out) I2C mode (in) Device_config_init: Structure containing configuration of device I2C_ADD: Address of STW8110x device (only I2C mode) Return value t_stw8110x_error FunctionType Synchronous Comments Potential errors: – Both modes: OK, ERR_VCO_CALIBRATION, ERR_FUNCT_MODE_UNKNOWN, ERR_VCO_VOLTAGE, ERR_CHARGE_PUMP_CURRENT, ERR_PRESCALER, ERR_A_HIGHER_THAN_B, ERR_A_OUTOF_RANGE, ERR_B_OUTOF_RANGE, ERR_REF_CLK_DIVIDER, ERR_N_OUTOF_RANGE, – I2C modes: ERR_I2C_ACK During this routine, a check of the device configuration (using the STW8110x_Check_config function) is performed before configuring the registers. 15/32 Functions AN2491 STW8110x_Check_config() 16/32 Description Checks the configuration selected with device specification. Definition t_stw8110x_error STW8110x_Check_config( t_stw8110x_Config Device_config ); Arguments (in) Device_config: Structure containing configuration of device Return value t_stw8110x_error FunctionType Synchronous Comments Potential errors: OK, ERR_VCO_CALIBRATION, ERR_FUNCT_MODE_UNKNOWN, ERR_VCO_VOLTAGE, ERR_CHARGE_PUMP_CURRENT, ERR_PRESCALER, ERR_A_HIGHER_THAN_B, ERR_A_OUTOF_RANGE, ERR_B_OUTOF_RANGE, ERR_REF_CLK_DIVIDER, ERR_N_OUTOF_RANGE AN2491 Functions STW8110x_Get_Fout_value() Description Returns output frequency according to the selected configuration and the input frequency. Definition t_stw8110x_error STW8110x_Get_Fout_value( t_stw8110x_Config Device_config_init, double Fref_clk, double *Fout_MHz ); Arguments (in) (in) (out) Device_config_init: Structure containing configuration of device Fref_clk: Input frequency in MHz Fout_MHz: Output frequency in MHz Return value t_stw8110x_error FunctionType Synchronous Comments Potential errors: OK, ERR_VCO_CALIBRATION, ERR_FUNCT_MODE_UNKNOWN, ERR_VCO_VOLTAGE, ERR_CHARGE_PUMP_CURRENT, ERR_PRESCALER, ERR_A_HIGHER_THAN_B, ERR_A_OUTOF_RANGE, ERR_B_OUTOF_RANGE, ERR_REF_CLK_DIVIDER, ERR_N_OUTOF_RANGE, ERR_VCOA_FREQ_OUTOF_RANGE, ERR_VCOB_FREQ_OUTOF_RANGE STW8110x_ProcessError() Description Manages the STW8110x device driver errors. Definition void STW8110x_ProcessError( t_stw8110x_error error ); Arguments (in) error: error returned by functions of API Return value none FunctionType Synchronous 17/32 Functions 5.2 AN2491 I2C mode I2C_Read_Status_Register() 18/32 Description Returns the value of the STW8110x read only register. Definition t_stw8110x_error I2C_Read_Status_Register( t_stw8110x_I2C_RO_reg *ReadOnlyReg, t_uint8 I2C_ADD ); Arguments (out) (in) ReadOnlyReg: Structure containing value of read only register I2C_ADD: Address of the STW8110x device Return value t_stw8110x_error FunctionType Synchronous Comments Potential errors: OK, ERR_I2C_ACK, ERR_I2C_READ AN2491 User scenarios 6 User scenarios 6.1 I2C mode // Device address define #define DEVICE_ADD 0x1 // A2=0, A1=0, A0=1 // STW8110x declaration t_stw8110x_Config Device_config; t_stw8110x_error st_error; double Fout; t_stw8110x_I2C_RO_reg ReadOnlyReg; // Device Driver Initilization st_error = STW8110x_Init(&Device_config, DEVICE_ADD); if(st_error != OK) { STW8110x_ProcessError(st_error); } //******* Configuration I ********** // Set configuration structure of device // Default config is selected Device_config.DEFAULT_CONFIG = BOOL_TRUE; // Configure the device st_error = Configure_STW8110x(Device_config, DEVICE_ADD); if(st_error != OK) { STW8110x_ProcessError(st_error); } //******* Configuration II ********** // Set configuration structure of device. // Config is set to ouput frequency 843.75MHz, reference clock 60MHz Device_config.DEFAULT_CONFIG = BOOL_FALSE; Device_config.DEVICE_FUNCTIONAL_MODE = VCO_A_FREQ_DIV_4; Device_config.VCO_CALIBRATION_EN = VCO_CAL_ENABLED; Device_config.SWALLOW_COUNTER = 8; Device_config.MAIN_COUNTER = 562; Device_config.REF_CLOCK_DIV_RATIO = 160; Device_config.VCO_AMPLITUDE_VOLTAGE = AMPL_2V1; Device_config.CHARGE_PUMP_CURRENT = CURRENT_8_I_MIN; Device_config.PRESCALER_MODULUS = PRESCALER_16; // Configure the device st_error = Configure_STW8110x(Device_config, DEVICE_ADD); if(st_error != OK) { STW8110x_ProcessError(st_error); } // Get output frequency(MHz) according config and reference clock st_error = STW8110x_Get_Fout_value(Device_config,60,&Fout); if(st_error != OK) { STW8110x_ProcessError(st_error); 19/32 User scenarios AN2491 } printf("With selected configuration and input freq=60MHz, output Freq = %fMHz\n",Fout); // Reading Read Only register of device st_error = I2C_Read_Status_Register(&ReadOnlyReg, DEVICE_ADD); if(st_error != OK) { STW8110x_ProcessError(st_error); } printf("Device Read Only Register Status:\n"); printf("Device ID : %d\n", ReadOnlyReg.DEV_TYPE); printf("PLL: %s\n", (ReadOnlyReg.LOCK_DET)?"Locked":"Unlocked"); printf("Internal VCO value: %d\n", ReadOnlyReg.INT_CAL); // Note: If you have selected the DEBUG mode, information is // automatically displayed, so no printf is needed 20/32 AN2491 6.2 User scenarios SPI mode // STW8110x declaration t_stw8110x_Config Device_config; t_stw8110x_error st_error; double Fout; // Device Driver Initilization STW8110x_Init(&Device_config); //******* Configuration I ********** // Set configuration structure of device // Config set to ouput frequency 4467.1875MHz reference clock 60MHz Device_config.DEFAULT_CONFIG = BOOL_FALSE; Device_config.DEVICE_FUNCTIONAL_MODE = VCO_B_DIRECT_OUTPUT; Device_config.VCO_CALIBRATION_EN = VCO_CAL_ENABLED; Device_config.SWALLOW_COUNTER = 11; Device_config.MAIN_COUNTER = 501; Device_config.REF_CLOCK_DIV_RATIO = 128; Device_config.VCO_AMPLITUDE_VOLTAGE = AMPL_2V1; Device_config.CHARGE_PUMP_CURRENT = CURRENT_8_I_MIN; Device_config.PRESCALER_MODULUS = PRESCALER_19; st_error = STW8110x_Get_Fout_value(Device_config,60,&Fout); if(st_error != OK) { STW8110x_ProcessError(st_error); } // Configure the device st_error = Configure_STW8110x(Device_config); if(st_error != OK) { STW8110x_ProcessError(st_error); } //******* Config II: Set in Power Down mode ********** // Set configuration structure of device Device_config.DEFAULT_CONFIG = BOOL_FALSE; Device_config.DEVICE_FUNCTIONAL_MODE = POWER_DOWN; // Configure the device st_error = Configure_STW8110x(Device_config); if(st_error != OK) { STW8110x_ProcessError(st_error); } 21/32 STW8110x public header file 7 AN2491 STW8110x public header file //***************************************************************** // Copyright (C) 2006 STMicroelectronics // File name:STW8110x.h // Description:Header file for SPI/I2C STW8110x Interface Driver // code. Provides function type and data structure definition // Creation:11/20/2006 //***************************************************************** #ifndef _STW8110x_H #define _STW8110x_H //***************************************************************** // -------Preprocessor Checking------//***************************************************************** #if !( defined(__PLATFORM_STW81101) | defined(__PLATFORM_STW81102) | defined(__PLATFORM_STW81103)) #error "__PLATFORM_STW81101, __PLATFORM_STW81102 or __PLATFORM_STW81103 must be defined" #endif #if !( defined(__INTERFACE_I2C) | defined(__INTERFACE_SPI)) #error "Either of __INTERFACE_I2C or __INTERFACE_SPI must be defined" #endif #if !( defined(__NO_DEBUG) | defined(__DEBUG)) #error "Either of __NO_DEBUG or __DEBUG must be defined" #endif //***************************************************************** // -------Allowing C++ to use these headers------//***************************************************************** #ifdef__cplusplus extern "C" { #endif // __cplusplus //***************************************************************** // -------miscellaneous------//***************************************************************** //----------------------------------------------------------------// Type definition //----------------------------------------------------------------typedef unsigned int t_uint32; typedef unsigned char t_uint8; //----------------------------------------------------------------// Type enumeration //----------------------------------------------------------------typedef enum {BOOL_FALSE, BOOL_TRUE} t_bool; //----------------------------------------------------------------// Constants //----------------------------------------------------------------#define REG_CLEAR0x00000000 #define ZERO0x0 22/32 AN2491 STW8110x public header file //----------------------------------------------------------------// Macros dedicated to build, set, get bits of registers //----------------------------------------------------------------#define mREG_SET(__datum, __val) ((__datum) = (t_uint32)(__val)) #define mBYTE_SET(__datum, __val) ((__datum) = (t_uint8)(__val)) #define mBIT_MASK(__bws) ((t_uint32)(((bw##__bws)==32)?0xFFFFFFFF:((1 << (bw##__bws)) - 1)) << (bs##__bws)) #define mBIT_BUILD(__bws, __val) ((t_uint32)(((t_uint32)(__val) << (t_uint32)(bs##__bws)) & ((t_uint32) mBIT_MASK(__bws)))) #define mBIT_GET(__datum, __bws) ((t_uint32)(((__datum) & ((t_uint32) mBIT_MASK(__bws))) >> (bs##__bws))) #define mBIT_SET(__datum, __bws, __val) ((__datum) = ((t_uint32) (__datum) & (t_uint32)~(mBIT_MASK(__bws))) | ((t_uint32) ((t_uint32)(__val) << (t_uint32)(bs##__bws)) & (mBIT_MASK(__bws)))) //----------------------------------------------------------------// Macros dedicated to print a string (depends of debug mode) //----------------------------------------------------------------#ifdef __DEBUG #include "stdio.h" #define DBGPRINT(str) printf(str) #define DBGPRINT1(str,a) printf(str,a) #define DBGPRINT2(str,a,b) printf(str,a,b) #define DBGPRINT3(str,a,b,c) printf(str,a,b,c) #else #ifdef __NO_DEBUG #define DBGPRINT(str) #define DBGPRINT1(str,a) #define DBGPRINT2(str,a,b) #define DBGPRINT3(str,a,b,c) #endif // __NO_DEBUG #endif //__DEBUG //***************************************************************** // -------STW8110x Frequency range------//***************************************************************** #ifdef __PLATFORM_STW81101 #define VCO_A_FREQ_MIN 3300 #define VCO_A_FREQ_MAX 3900 #define VCO_B_FREQ_MIN 3800 #define VCO_B_FREQ_MAX 4400 #elif __PLATFORM_STW81102 #define VCO_A_FREQ_MIN 3000 #define VCO_A_FREQ_MAX 3620 #define VCO_B_FREQ_MIN 4000 #define VCO_B_FREQ_MAX 4650 #elif __PLATFORM_STW81103 #define VCO_A_FREQ_MIN 2500 #define VCO_A_FREQ_MAX 3050 #define VCO_B_FREQ_MIN 4350 #define VCO_B_FREQ_MAX 5000 #endif 23/32 STW8110x public header file AN2491 //***************************************************************** // -------STW8110x Device Address / access mode------//***************************************************************** #ifdef __INTERFACE_I2C #define I2C_DEVICE_MSB_ADD 0xC0 #define I2C_READ 1 #define I2C_WRITE 0 #define REG0_ADD 0x00 #define REG1_ADD 0x01 #define REG2_ADD 0x02 #define REG3_ADD 0x03 #define REG4_ADD 0x04 #define REG5_ADD 0x05 #endif //__INTERFACE_I2C #ifdef __INTERFACE_SPI #define ST1_ADD 0x00 #define ST2_ADD 0x01 #define SHIFT_ADD 24 #endif //__INTERFACE_SPI //***************************************************************** // -------STW8110x Enumeration Types------//***************************************************************** // STW8110x errors typedef enum { OK = 0, ERR_A_HIGHER_THAN_B = -113, ERR_A_OUTOF_RANGE ,// = -112, ERR_B_OUTOF_RANGE ,// = -111, ERR_N_OUTOF_RANGE ,// = -110, ERR_VCOA_FREQ_OUTOF_RANGE ,// = -109, ERR_VCOB_FREQ_OUTOF_RANGE ,// = -108, ERR_FUNCT_MODE_UNKNOWN ,// = -107, ERR_REF_CLK_DIVIDER ,// = -106, ERR_PRESCALER ,// = -105, ERR_VCO_CALIBRATION ,// = -104, ERR_VCO_VOLTAGE ,// = -103, #ifdef __INTERFACE_I2C ERR_I2C_ACK ,// = -102, ERR_BAD_DEVICE ,// = -101, ERR_I2C_READ ,// = -100, #endif //__INTERFACE_I2C ERR_CHARGE_PUMP_CURRENT // = -99 or -102 } t_stw8110x_error ; // // Prescaler modulus definition // typedef enum { PRESCALER_16, PRESCALER_19 } t_PSC_SEL; 24/32 AN2491 STW8110x public header file // // VCO calibration enabling definition // typedef enum { VCO_CAL_DISABLED, VCO_CAL_ENABLED } t_SERCAL; // // Device Functional modes definition // typedef enum { CURRENT_I_MIN, CURRENT_2_I_MIN, CURRENT_3_I_MIN, CURRENT_4_I_MIN, CURRENT_5_I_MIN, CURRENT_6_I_MIN, CURRENT_7_I_MIN, CURRENT_8_I_MIN } t_CP_SEL; // //VCO Voltage Amplitude definition // typedef enum { AMPL_1V1, AMPL_1V3, AMPL_1V9, AMPL_2V1 } t_PLL_A; // // Device Functional modes definition // typedef enum { POWER_DOWN, VCO_A_FREQ_DIV_2, VCO_B_FREQ_DIV_2, VCO_EXT_FREQ_DIV_2, VCO_A_FREQ_DIV_4, VCO_B_FREQ_DIV_4, VCO_EXT_FREQ_DIV_4, VCO_A_DIRECT_OUTPUT, VCO_B_DIRECT_OUTPUT, VCO_EXT_DIRECT_OUTPUT } t_PD; #ifdef __INTERFACE_I2C // // Definition of the STW8110x Device Type // typedef enum { DEV_STW81101, DEV_STW81102, 25/32 STW8110x public header file AN2491 DEV_STW81103 } t_stw8110x_Device_Type ; // // Definition of the STW8110x PLL lock status // typedef enum { PLL_LOCKED, PLL_UNLOCKED } t_stw8110x_PLL_Status ; #endif //__INTERFACE_I2C //***************************************************************** // -------STW8110x Structure types------//***************************************************************** // // Definition of the STW8110x reg descriptor structure // typedef struct { #ifdef __INTERFACE_I2C t_uint8 REG0; // Functional modes t_uint8 REG1; // B counter t_uint8 REG2; // A counter t_uint8 REG3; // Reference divider t_uint8 REG4; // Control t_uint8 REG5; // Calibration t_uint8 REGRO; // Read only register: internal calibration of //VCO, PLL state (locked,unlocked), Device ID #endif //__INTERFACE_I2C #ifdef __INTERFACE_SPI // ST1: reference divider, VCO amplitude, VCO Calibration, Charge // Pump current, Prescaler Modulus t_uint32 ST1; // ST2: Functional modes, VCO dividers t_uint32 ST2; #endif // __INTERFACE_SPI } t_stw8110x_Registers ; // // Definition of the STW8110x configuration descriptor structure // typedef struct { t_bool DEFAULT_CONFIG; t_SERCAL VCO_CALIBRATION_EN; t_PD DEVICE_FUNCTIONAL_MODE; t_uint32 MAIN_COUNTER; t_uint32 SWALLOW_COUNTER; t_uint32 REF_CLOCK_DIV_RATIO; t_PLL_A VCO_AMPLITUDE_VOLTAGE; t_CP_SEL CHARGE_PUMP_CURRENT; t_PSC_SEL PRESCALER_MODULUS; } t_stw8110x_Config ; 26/32 AN2491 STW8110x public header file #ifdef __INTERFACE_I2C // // Definition of the STW8110x I2C ReadOnly register typedef struct { t_stw8110x_Device_TypeDEV_TYPE; // Device identifier bit t_stw8110x_PLL_StatusLOCK_DET; // '1' when PLL is locked t_uint8 INT_CAL; // internal value of VCO control word } t_stw8110x_I2C_RO_reg ; #endif //__INTERFACE_I2C //***************************************************************** // -------STW8110x Hardware Access Definitions------//***************************************************************** #ifdef __INTERFACE_SPI // Description: // ST1 - reference divider, VCO amplitude, VCO Calibration, // Charge Pump current,Prescaler Modulus // #define bwREF_CLK_DIV_RATIO 10 // Reference clock divider ratio #define bwPLL_A 2 // VCO Amplitude control #define bwCPSEL 3 // charge pump output current control #define bwPSC_SEL 1 // Prescaler modulus select #define bwINITCAL 1 // Test purpose only,must be set to 0 #define bwSERCAL 1 // VCO Calibration Enable #define bwSELEXTCAL 1 // Test purpose only,must be set to 0 #define bwCAL 5 // Test purpose only,must be set to 0 #define bsREF_CLK_DIV_RATIO 14 // Reference clock divider ratio #define bsPLL_A 12 // VCO Amplitude control #define bsCPSEL 9 // charge pump output current control #define bsPSC_SEL 8 // Prescaler modulus select #define bsINITCAL 7 // Test purpose only,must be set to 0 #define bsSERCAL 6 // VCO Calibration Enable #define bsSELEXTCAL 5 // Test purpose only,must be set to 0 #define bsCAL 0 // Test purpose only,must be set to 0 // // Description: // ST2 - Functional modes, VCO dividers // #define bwPD 7 // Functional mode #define bwcount_B 12// swallow counter #define bwcount_A 5 // main counter #define bsPD 17// Functional mode #define bscount_B 5 // swallow counter #define bscount_A 0 // main counter #endif //__INTERFACE_SPI #ifdef __INTERFACE_I2C // REG0 #define bwPD 7 // Reference clock divider ratio #define bwcount_B11 1 // main counter #define bsPD 1 // Test purpose only, must be set to 0 #define bscount_B11 0 // main counter 27/32 STW8110x public header file AN2491 // REG1 #define bwcount_B10_3 8 // main counter #define bscount_B10_3 0 // main counter // REG2 #define bwcount_B2_0 3 // main counter #define bwcount_A 5 // swallow counter #define bscount_B2_0 5 // main counter #define bscount_A 0 // swallow counter // REG3 #define bwREF_CLK_DIV_RATIO9_2 8 // Ref clock divider ratio #define bsREF_CLK_DIV_RATIO9_2 0 // Ref clock divider ratio // REG4 #define bwREF_CLK_DIV_RATIO1_0 2 // Ref clock divider ratio #define bwPLL_A 2 // VCO Amplitude control #define bwCPSEL 3 // charge pump output current control #define bwPSC_SEL 1 // Prescaler modulus select #define bsREF_CLK_DIV_RATIO1_0 6 // Reference clock divider ratio #define bsPLL_A 4 // VCO Amplitude control #define bsCPSEL 1 // charge pump output current control #define bsPSC_SEL 0 // Prescaler modulus select // REG5 #define bwINITCAL 1 // Test purpose only,must be set to 0 #define bwSERCAL 1 // VCO Calibration Enable #define bwSELEXTCAL 1 // Test purpose only,must be set to 0 #define bwCAL 5 // Test purpose only,must be set to 0 #define bsINITCAL 7 // Test purpose only,must be set to 0 #define bsSERCAL 6 // VCO Calibration Enable #define bsSELEXTCAL 5 // Test purpose only,must be set to 0 #define bsCAL 0 // Test purpose only,must be set to 0 // REGRO #define bwDEV_ID 2 // VCO Calibration Enable #define bwLOCK_DET 1 // '1' when PLL is locked #define bwINTCAL 5 // Internal value of VCO control word #define bsDEV_ID 6 // Dev ID:'00'-> 81101,'01' -> 81102 #define bsLOCK_DET 5 // '1' when PLL is locked #define bsINTCAL 0 // Internal value of VCO control word // Used for parameters splitted #define bwB11 1 #define bsB11 11 #define bwB10_3 8 #define bsB10_3 3 #define bwB2_0 3 #define bsB2_0 0 #define bwREF_DIV9_2 8 #define bsREF_DIV9_2 2 #define bwREF_DIV1_0 2 #define bsREF_DIV1_0 0 #endif //__INTERFACE_I2C 28/32 AN2491 STW8110x public header file //***************************************************************** // -------Public Functions------//***************************************************************** // Global Initialization t_stw8110x_error STW8110x_Init (t_stw8110x_Config *Device_config_init #ifdef __INTERFACE_I2C ,t_uint8 I2C_ADD #endif ); // Configuration t_stw8110x_error Configure_STW8110x (t_stw8110x_Config Device_Config #ifdef __INTERFACE_I2C ,t_uint8 I2C_ADD #endif ); // Getting Information t_stw8110x_error STW8110x_Get_Fout_value(t_stw8110x_Config Device_Config, double Fref_clk, double *Fout_MHz); t_stw8110x_error STW8110x_Check_config(t_stw8110x_Config Device_Config); #ifdef __INTERFACE_I2C t_stw8110x_error I2C_Read_Status_Register(t_stw8110x_I2C_RO_reg *ReadOnlyReg, t_uint8 I2C_ADD); #endif // Errors management void STW8110x_ProcessError(t_stw8110x_error error); #ifdef __cplusplus } // allow C++ to use these headers #endif// __cplusplus #endif // _STW8110x.H /**************** End of file – STW8110x.h************************* 29/32 Digital_Bus_interface header file 8 AN2491 Digital_Bus_interface header file /****************************************************************** Copyright (C) 2006 STMicroelectronics File name:Digital_Bus_interface.h Description:Header file for the SPI/I2C Interface Driver code. Provides function type and data structure definition Creation:11/20/2006 ******************************************************************* #ifndef _DBI_H #define _DBI_H #ifdef __INTERFACE_I2C // Type enumeration regarding Acknowledge of I2C mode typedef enum { NO_ACK, ACK } t_I2C_Ack ; // Function dedicated to send data on I2C bus // Parameters: // data: Table of Bytes to send (in) // nb_bytes: number of bytes to send (in) // Return: // ACK if acknowledge is received by master // NO_ACK if acknowledge isn't received by master t_I2C_Ack I2C_Send_data(unsigned char *data, int nb_bytes); // Function dedicated to read data on I2C bus // Parameters: // Add: Slave Address to read (in) // data: Countain the byte read (out) // Return: // ACK if acknowledge is received by master // NO_ACK if acknowledge isn't received by master t_I2C_Ack I2C_Read_data(unsigned char Add, unsigned char *data); #endif //__INTERFACE_I2C #ifdef __INTERFACE_SPI // Function dedicated to send data on SPI bus // Parameters: // data: Data (32 bits) to send (in) void SPI_Send_data(unsigned int data); #endif //__INTERFACE_SPI #endif // _DBI_H //*********** End of file -Digital_Bus_interface.h************** 30/32 AN2491 9 Definitions Definitions Table 4. Acronyms used in this document Acronym 10 Definition API Application programming interface HCL Hardware component layer WID Wireless infrastructure division IC Integrated circuit SPI Serial peripheral interface I2C Inter-integrated circuit STW8110x STW81101, STW81102 or STW81103 Revision history Table 5. Document revision history Date Revision 10-Aug-2007 1 Changes Initial release. 31/32 AN2491 Please Read Carefully: Information in this document is provided solely in connection with ST products. STMicroelectronics NV and its subsidiaries (“ST”) reserve the right to make changes, corrections, modifications or improvements, to this document, and the products and services described herein at any time, without notice. All ST products are sold pursuant to ST’s terms and conditions of sale. Purchasers are solely responsible for the choice, selection and use of the ST products and services described herein, and ST assumes no liability whatsoever relating to the choice, selection or use of the ST products and services described herein. No license, express or implied, by estoppel or otherwise, to any intellectual property rights is granted under this document. If any part of this document refers to any third party products or services it shall not be deemed a license grant by ST for the use of such third party products or services, or any intellectual property contained therein or considered as a warranty covering the use in any manner whatsoever of such third party products or services or any intellectual property contained therein. UNLESS OTHERWISE SET FORTH IN ST’S TERMS AND CONDITIONS OF SALE ST DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY WITH RESPECT TO THE USE AND/OR SALE OF ST PRODUCTS INCLUDING WITHOUT LIMITATION IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (AND THEIR EQUIVALENTS UNDER THE LAWS OF ANY JURISDICTION), OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. UNLESS EXPRESSLY APPROVED IN WRITING BY AN AUTHORIZED ST REPRESENTATIVE, ST PRODUCTS ARE NOT RECOMMENDED, AUTHORIZED OR WARRANTED FOR USE IN MILITARY, AIR CRAFT, SPACE, LIFE SAVING, OR LIFE SUSTAINING APPLICATIONS, NOR IN PRODUCTS OR SYSTEMS WHERE FAILURE OR MALFUNCTION MAY RESULT IN PERSONAL INJURY, DEATH, OR SEVERE PROPERTY OR ENVIRONMENTAL DAMAGE. ST PRODUCTS WHICH ARE NOT SPECIFIED AS "AUTOMOTIVE GRADE" MAY ONLY BE USED IN AUTOMOTIVE APPLICATIONS AT USER’S OWN RISK. Resale of ST products with provisions different from the statements and/or technical features set forth in this document shall immediately void any warranty granted by ST for the ST product or service described herein and shall not create or extend in any manner whatsoever, any liability of ST. ST and the ST logo are trademarks or registered trademarks of ST in various countries. Information in this document supersedes and replaces all information previously supplied. The ST logo is a registered trademark of STMicroelectronics. All other names are the property of their respective owners. © 2007 STMicroelectronics - All rights reserved STMicroelectronics group of companies Australia - Belgium - Brazil - Canada - China - Czech Republic - Finland - France - Germany - Hong Kong - India - Israel - Italy - Japan Malaysia - Malta - Morocco - Singapore - Spain - Sweden - Switzerland - United Kingdom - United States of America www.st.com 32/32