Cracking the SI5351 Multiple Clock Generator – Part I

Facebooktwitterredditpinterestmail

Its been some time I have been wanting to use a SI5351 chip to build a VFO.  As the cheapest version of this chip (at just $1.30) can be configured to generate up to 3 programmable clocks, it can be put to use in a HAM rig very well.  One clock as a VFO and other as a BFO.  Simple code on Arduino can generate a LSB and USB signal with no hassle of pulling crystals down or up with inductors makes it so much easy and fun.  The 3rd output can be put to use as a CW tone generator.

There are many breakout boards for this chip available, but all in the DX land (QRP Labs, Eatherkit, etc).  With multiple projects at hand I was hesitant to order one.  I had also been discussing about it online with VU2SWX, Prof. Sunil Thomas who was keen to design a breakout board for the SI5351 himself and subsequently I got this update a couple of days ago at VU2SWX’s Blog:

Board-Totalsi1I quickly ordered the SI5351 chip from RSdelivers here and toner transferred a PCB.  This was my 1st SMD PCB, but it turned out pretty good.

PCB Etched using Toner Transfer Method
PCB Etched using Toner Transfer Method

To build this one I had to additionally buy a SMD soldering Iron (MAX 550) and liquid soldering flux.

Caution: There are errors in this PCB, please wait for an update from VU2SWX.
IMG-20150227-WA0007
Si5351 and LM1117 mounted in reverse (upside down)
IMG_20150227_102220126_HDR
Si5351 VFO using Arduino Nano

When I started to build this PCB I figured out there were 2 big errors in the layout.  Both the SI5351 chip and LM1117 regulator IC layout on the PCB was reversed.  I didn’t want to waste more time so mounted the ICs in reverse and finished the PCB mounting all other components.I burned the SI5351 VFO sketch by AK2B, Tom Hall here to a Arduino Nano and built the VFO as per this design:AdafruitSi5351_UNO_bbHere’s my VFO on a breadboard: Here is a copy of the sketch I used for testing: VFO Sketch for Si5351 with IF

The sketch was working perfect but no output from the breakout board.  I rechecked the board for connection issues or soldering errors, everything seemed correct.  So I set out to check the communication between Arduino and the SI5351 chip.  I burned this I2C scanner sketch to the nano and got no result on the serial monitor. This made clear that there was no communication between Arduino and Breakout board.

i2c scanner
I2C scanner output showing communication with Si5351 and Arduino

I cross checked the Level shifter FETs BS170.  I realized the board was made for through hole components while I used SMD 1206 package.  The Pin for both these packages is different.BS170_PinoutI re-soldered the SMD BS170 correctly as per pin out and checked the I2C Scanner again. and voila !  This is what I got:

SI5351_VFO_Output
output from a Si5351 Breakout Board.

I quickly burned the SI5351 VFO Sketch again and got a clear VFO signal on my dongle !One of these PCB has already been sent to VU2SWX with all the errors and I am waiting to hear from him with a corrected PCB.

In the meanwhile if you have any suggestions or feedback, please feel free to post your comments in the section below.

Amogh Desai
Facebooktwitterrssyoutube

22 Comments


  1. Great Achievement Amogh… Go Ahead..Waiting for Post Part II!!

    Reply

    1. Actually I am eagerly waiting for the final version of this board so that all the hassle of a stable vfo and L.O. vanishes. Shri Carudatta Uplap has said that the board will be ready soon. But your board seams to be in advance stage of design and testing.
      Satish
      VU2SNK

      Reply

  2. GR8 Amogh, I am sorry, was getting the boards ready, but then a tooth fairy gave me a Adafruit BreakOut Board and so the immediate need for the board was dropped.

    A Breakout board for this should not be a big problem and I sincerely hope , that someone now makes a dedicated board with the ATMEL Chip and the Si Chip on one Board Complete project.

    Amogh : How much did you get the chip for and any specific reason you used a crystal ?

    regards
    VU2UPX

    Reply

    1. great.. now will have choices.. this board is more of a demonstration.. need to also see how well it performs as compared to AD9850..

      Reply


  3. I have posted the corrections to the board. Need more beta testers.

    Reply

    1. congrats….Amongji good work….eagerly waiting for the latest version
      with all corrections.

      Reply

  4. Very nice! How was the performance of the rx compared to ad9850 and Si570 ? audio clarity, birdies and noise floor

    Reply

    1. Hey Riyas,

      It was good. I dint find any specific issue with audio clarity. It is on par with the AD9850. I don’t have much test and measurement equipment to show comparisons. But I understand from reports that Si5351 has some amount of spurs and is quite noisy compared to SI570. Also its performs well if only one clock is used or 2 clocks away from each other are used. But is not a bad choice over AD9850 at all. SI570 is very clean and cant replace AD9850 or Si5351.

      Reply

  5. Two things

    1 I am looking for a single board, Uno format, but including Si5351 & 74AC74 generating IQ signals for SDR

    2 To interface with a single board (Arduino Uno size) SDR Transceiver I have designed

    Reply

    1. Hi Antony,

      Please check VU2IIA Mahesh’s blog for this kind of setup. He has talso taken the info from some other blog, but has successfully used an arduino + SI5351 +74HC74 to drive an IQ based SDR.

      73s
      Amogh
      VU3DES

      Reply

  6. I complied the sketch but found, it is giving error which I have pasted here. I have no idea about programming, and where to look for answers, could you please let me know how to resolve this.

    Error :
    Arduino: 1.8.5 (Windows Store 1.8.10.0) (Windows 10), Board: “Arduino/Genuino Uno”

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino: In function ‘void setup()’:

    LCD_VFO_Si5351_IF:157: error: no matching function for call to ‘Si5351::init(int)’

    si5351.init(SI5351_CRYSTAL_LOAD_8PF);

    ^

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:157:40: note: candidate is:

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:283:7: note: bool Si5351::init(uint8_t, uint32_t, int32_t)

    bool init(uint8_t, uint32_t, int32_t);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:283:7: note: candidate expects 3 arguments, 1 provided

    LCD_VFO_Si5351_IF:161: error: no matching function for call to ‘Si5351::set_freq(volatile uint32_t&, long long unsigned int, si5351_clock)’

    si5351.set_freq(vfo, SI5351_PLL_FIXED, SI5351_CLK0);

    ^

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:161:55: note: candidate is:

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: uint8_t Si5351::set_freq(uint64_t, si5351_clock)

    uint8_t set_freq(uint64_t, enum si5351_clock);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: candidate expects 2 arguments, 3 provided

    LCD_VFO_Si5351_IF:165: error: no matching function for call to ‘Si5351::set_freq(volatile uint32_t&, int, si5351_clock)’

    si5351.set_freq( bfo, 0, SI5351_CLK2);

    ^

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:165:41: note: candidate is:

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: uint8_t Si5351::set_freq(uint64_t, si5351_clock)

    uint8_t set_freq(uint64_t, enum si5351_clock);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: candidate expects 2 arguments, 3 provided

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino: In function ‘void loop()’:

    LCD_VFO_Si5351_IF:186: error: no matching function for call to ‘Si5351::set_freq(long unsigned int, long long unsigned int, si5351_clock)’

    si5351.set_freq(vfo + bfo, SI5351_PLL_FIXED, SI5351_CLK0);

    ^

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:186:63: note: candidate is:

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: uint8_t Si5351::set_freq(uint64_t, si5351_clock)

    uint8_t set_freq(uint64_t, enum si5351_clock);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: candidate expects 2 arguments, 3 provided

    LCD_VFO_Si5351_IF:191: error: no matching function for call to ‘Si5351::set_freq(volatile uint32_t&, int, si5351_clock)’

    si5351.set_freq( bfo, 0, SI5351_CLK2);

    ^

    C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:191:43: note: candidate is:

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: uint8_t Si5351::set_freq(uint64_t, si5351_clock)

    uint8_t set_freq(uint64_t, enum si5351_clock);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: candidate expects 2 arguments, 3 provided

    LCD_VFO_Si5351_IF:198: error: no matching function for call to ‘Si5351::set_freq(volatile uint32_t&, int, si5351_clock)’

    si5351.set_freq( bfo, 0, SI5351_CLK2);

    ^

    In file included from C:\Users\ragin\AppData\Local\Temp\Temp1_LCD_VFO_Si5351_IF.zip\LCD_VFO_Si5351_IF\LCD_VFO_Si5351_IF.ino:12:0:

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: uint8_t Si5351::set_freq(uint64_t, si5351_clock)

    uint8_t set_freq(uint64_t, enum si5351_clock);

    ^

    C:\Users\ragin\OneDrive\Documents\Arduino\libraries\Si5351Arduino-master\src/si5351.h:285:10: note: candidate expects 2 arguments, 3 provided

    exit status 1
    no matching function for call to ‘Si5351::init(int)’

    Let me know or you can mail me directly
    Thanks for your help

    Reply

  7. hello,
    this is VU3PJI, Bhadresh Thakkar.
    Ahmedabad, Gujarat
    I have Handy SXA, also a VFO.
    please help me to connect the SXA with VFO.
    please provide me the details.

    vu3pji@gmail.com
    9426873288

    Reply

  8. Hi Amogh ji,

    Please can you tell me what type of crystal you have used? Data sheet specifies only SMD crystal with less than 10 pf capacitance. What you have used ? I can see in your board it was a Through Hole crystal. I need to know is it possible to run this chip using ordinary crystals.

    Regards
    Ashok

    Reply

  9. What type of crystal you have used? In datasheet it says only SMD crystals, but in your design it looks a through hole component.

    Reply

    1. Sorry for late response. I used a generic 25mhz crystal. It works. Not for zero noise/zero jitter enthusiasts though 🙂

      Reply

  10. Hi Amogh,
    I wired everything as shown, uploaded the sketch, seems to work properly (LCD showing frequency changing by the encoder), but there seems to be no output on all clocks when I checked it with the frequency counter. I did not change anything in the .ino sketch, so could you please tell me where to look for a mistake? Have you ever experienced a similar problem? Thank you.

    Reply

    1. You could try using an i2c scanner and make sure the si5351 is connected right and communicating with the arduino.

      For this you need to download the i2c scanner .ino file and burn into your arduino and check its output in the serial monitor.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.