Si5351 library uses the Si configuration tool output to program frequencies via I2C

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
wd5gnr
Date:
Tue Oct 13 02:03:48 2015 +0000
Commit message:
Initial commit;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r e9b74a8ed1d1 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Oct 13 02:03:48 2015 +0000
@@ -0,0 +1,177 @@
+#include "mbed.h"
+
+// Simple driver for Si5351 -- Williams
+// Expects you to use the desktop configuration tool at
+// https://www.silabs.com/products/clocksoscillators/pages/timing-software-development-tools.aspx
+
+I2C i2c(dp5, dp27);  // change to suit your i2c -- I used an LPC1114
+
+DigitalOut myled(LED1);
+const int addr = 0xC0;  // note: address is x2 so really 0x60 shifted over
+
+// The SI tool for generating a clock plan will dump a large
+// text file (select export plan for others)
+// In there will be 232 lines of register "map"
+// You need entries 15-92 and 149-170
+// The entries will look like:
+// 15,00h
+// I used regular expressions in my editor (emacs)
+// to convert ,\(..\)h -> ,0x\1
+// Then I copy paste the lines I want to another buffer
+// and then replace
+// [0-9]+, -> ,
+// That is relace the nubers ahead of the commas with nothing
+// Then you can paste it below in map0 (15-92) and map1 (149-170)
+// You actually don't even need all of these for the little 3 channel
+// breakout board, but it is fast and simple to just blow it all out
+// NOTE: Do not replace the first byte of each array (15 and 149) as
+// these are the register addresses.
+
+char map0[] = { 15,   // registers 15-92
+                0x00
+                ,0x4F
+                ,0x6F
+                ,0x4F
+                ,0x80
+                ,0x80
+                ,0x80
+                ,0xC0
+                ,0xC0
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x01
+                ,0x00
+                ,0x10
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x01
+                ,0x00
+                ,0x0E
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x01
+                ,0x01
+                ,0xC0
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x01
+                ,0x43
+                ,0xE6
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x01
+                ,0x03
+                ,0x82
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+                ,0x00
+              };
+
+char map1[] = {
+    149,     // registers 149-170
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00,
+    0x00
+};
+
+
+// Easily send a byte to a register
+void send(int r,int x)
+{
+    char cmd[2];
+    cmd[0]=r;
+    cmd[1]=x;
+    i2c.write(addr,cmd,2);
+}
+
+// Once the map arrays are set up, call this to load the chip with those values
+int updatemap(void)
+{
+    char cmd[5];
+    send(3,0xFF);  // disable everything
+    cmd[0]=16;
+    cmd[1]=cmd[2]=cmd[3]=0x80;
+    i2c.write(addr,cmd,4);
+    i2c.write(addr,map0,sizeof(map0));  // blow register map to chip
+    i2c.write(addr,map1,sizeof(map1));
+    send(3,0);  // turn everything back on
+    send(177,0xAC);  // reset PLLs
+
+    // To do: ought to make accessors to the map arrays to set different parameters
+    return 0; // To do: error checking
+}
+
+int main()
+{
+
+
+    // Blink a light so as to not be boring
+    updatemap();
+    while(1) {
+
+        myled = 1;
+        wait(0.2);
+        myled = 0;
+        wait(0.2);
+    }
+}
diff -r 000000000000 -r e9b74a8ed1d1 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Oct 13 02:03:48 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/34e6b704fe68
\ No newline at end of file