Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SI570.h
00001 /* mbed SI570 Library, for driving the SI570 programable VCXO 00002 * Copyright (c) 2010, Gerrit Polder, PA3BYA 00003 * 00004 * Permission is hereby granted, free of charge, to any person obtaining a copy 00005 * of this software and associated documentation files (the "Software"), to deal 00006 * in the Software without restriction, including without limitation the rights 00007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00008 * copies of the Software, and to permit persons to whom the Software is 00009 * furnished to do so, subject to the following conditions: 00010 * 00011 * The above copyright notice and this permission notice shall be included in 00012 * all copies or substantial portions of the Software. 00013 * 00014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00020 * THE SOFTWARE. 00021 */ 00022 00023 #ifndef MBED_SI570_H 00024 #define MBED_SI570_H 00025 00026 #include "mbed.h" 00027 00028 //these must be floating point number especially 2^28 so that 00029 //there is enough memory to use them in the calculation 00030 #define POW_2_16 65536.0 00031 #define POW_2_24 16777216.0 00032 #define POW_2_28 268435456.0 00033 #define FOUT_START_UP 56.320 //MHz 00034 #define PPM 3500 // +/- max ppm from center frequency 00035 #define FDCO_MAX 5670.0 //MHz 00036 #define FDCO_MIN 4850.0 //MHz 00037 00038 00039 /** Interface to the popular SI570 VCXO */ 00040 class SI570 { 00041 public: 00042 /** Create an instance of the SI570 connected to specified I2C pins, with the specified address. 00043 * 00044 * Example: 00045 * @code 00046 * #include "mbed.h" 00047 * #include "TextLCD.h" 00048 * #include "SI570.h" 00049 * #include "QEI.h" 00050 * 00051 * TextLCD lcd(p11, p12, p15, p16, p29, p30); // rs, e, d0-d3 00052 * SI570 si570(p9, p10, 0xAA); 00053 * QEI wheel (p5, p6, NC, 360); 00054 * 00055 * int main() { 00056 * int wp,swp=0; 00057 * float startfreq=7.0; 00058 * float freq; 00059 * 00060 * while (1) { 00061 * wp = wheel.getPulses(); 00062 * freq=startfreq+wp*0.00001; 00063 * if (swp != wp) { 00064 * si570.set_frequency(freq); 00065 * swp = wp; 00066 * } 00067 * lcd.locate(0,0); 00068 * lcd.printf("%f MHz", si570.get_frequency()); 00069 * } 00070 * } 00071 * @endcode 00072 * 00073 * @param sda The I2C data pin 00074 * @param scl The I2C clock pin 00075 * @param address The I2C address for this SI570 00076 */ 00077 SI570(PinName sda, PinName scl, int address); 00078 00079 /** Resets the SI570. 00080 * 00081 * Resets and reads the startup configuration from the Si570 00082 */ 00083 void si570reset(void); 00084 00085 /** Read the current frequency. 00086 * 00087 * get the SI570 registers an calculate the current frequency 00088 * 00089 * @returns the current frequency 00090 */ 00091 double get_frequency(void); 00092 00093 /** Read the current rfreq value. 00094 * 00095 * get the SI570 registers an calculate the current rfreq 00096 * 00097 * @returns the current rfreq 00098 */ 00099 double get_rfreq(void); 00100 00101 /** Read the current n1. 00102 * 00103 * get the SI570 registers an calculate the current n1 00104 * 00105 * @returns the current n1 00106 */ 00107 int get_n1(void); 00108 00109 /** Read the current hsdiv. 00110 * 00111 * get the SI570 registers an calculate the current hsdiv 00112 * 00113 * @returns the current hsdiv 00114 */ 00115 int get_hsdiv(void); 00116 00117 /** Set a new frequency. 00118 * 00119 * Set the SI570 registers to output frequency 00120 * When the new frequency is within the 3500 PPM range of the center frequency, hsdiv and n1 needs not to be reprogrammed, resulting in a glitch free transition. 00121 * For changes larger than 3500 PPM, the process of freezing and unfreezing the DCO will cause the output clock to momentarily stop and start at any arbitrary point during a clock cycle. This process can take up to 10 ms. 00122 * 00123 * @param frequency the frequency to set. 00124 * @returns the current frequency 00125 */ 00126 int set_frequency(double frequency); 00127 00128 00129 private: 00130 I2C _i2c; 00131 int _address; 00132 char cmd[2]; 00133 char buf[6]; 00134 unsigned char n1; 00135 unsigned char hsdiv; 00136 unsigned long frac_bits; 00137 double rfreq; 00138 double fxtal_device; 00139 double currentFreq; 00140 double currentRfreq; 00141 00142 void get_registers(void); 00143 int set_frequency_small_change(double currentFrequency); 00144 int set_frequency_large_change(double currentFrequency); 00145 00146 unsigned char SetBits(unsigned char original, unsigned char reset_mask, unsigned char new_val); 00147 }; 00148 00149 00150 #endif
Generated on Tue Jul 12 2022 19:03:22 by
1.7.2
SI570