发新帖本帖赏金 105.00元(功能说明)我要提问
返回列表
打印
[RISC-V MCU 应用开发]

借助ClockBuilder Pro生成配置,在ESP32-C3上使用Si5351

[复制链接]
1510|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gaoyang9992006 于 2023-6-5 17:26 编辑

#申请原创#
ClockBuilder Pro是一款用于配置和生成时钟信号的软件工具,而Si5351是一款常用的时钟发生器芯片。使用ClockBuilder Pro可以方便地配置和生成适合Si5351芯片的时钟信号。以下是使用ClockBuilder Pro配置Si5351的一般步骤:
1、下载和安装ClockBuilder Pro软件:您可以从搜索引擎找到官方网站下载并安装ClockBuilder Pro软件。

图1

2、连接硬件:将Si5351芯片连接到您的开发板或电路中。确保硬件连接正确,并且Si5351的电源和通信接口正常工作。
本次实验采用的是ESP32-C3,可以使用Arduino来完成测试工作,这里我采用的是Arduino默认的ESP32-C3的默认I2C接口,你也可以在程序里指定使用哪些IO作为I2C。
默认接口配置文件在以下目录可以找到
C:\Users\Mint\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\variants\esp32c3\pins_arduino.h
其中关于定义I2C的地址为
static const uint8_t SDA = 8;
static const uint8_t SCL = 9;
下图是我使用的SI5351模块,该模块为SI5351A 10PIN的,支持3路生成时钟输出:CLK0、CLK1、CLK2。


图2

3、打开ClockBuilder Pro:启动ClockBuilder Pro软件,并选择与Si5351芯片兼容的设备和芯片型号。如果您的芯片型号不在列表中,您可能需要手动添加或选择类似型号进行配置。具体步骤如下:
(1)、启动软件后,如图1,选择Create New Project,创建新的工程
(2)、单击Clock Generators,选择时钟发生器

图3

(3)、然后会弹出一个元件选择列表,选择我们这次使用的SI5351A,然后单击下一步

图4



图5

继续下一步


图6

(4)、此处你可以输入一些设计笔记,如果没有什么要写的,可以直接下一步跳过。


图7

(5)、选择我们使用的封装型号,这里选择3输出的10PIN封装,然后单击下一步


图8

(6)、如图8所示,这时候我们可以看到默认的I2C地址,以及I2C的通信原理图。请记住该地址,或者在芯片手册查看该地址:0x60。


图9

(7)、如图9所示,这一步选择时钟源,即你使用的晶振是多大的,这里默认有两种选择27MHz,25MHz,我这里使用的是25MHz的。其他按照默认即可。继续下一步


图10

(8)、这一步,是设置输出使能以及配置输出的频率为多少,共3个输出通道可供配置,可以配置的范围是2.5KHz~200MHz。如图10所示。完成配置后单击下一步。


图11


(9)、图11为输出斜率设置,这里如果不需要可以默认,如果不知道什么意思可以在三个通道设置为相同的输出频率,然后在此处设置为不同的输出斜率,观察结果,以确认该参数的意义。单击下一步。


图12

(10)、如图12所示,该步骤为设置输出驱动能力配置,如果不清楚请查看该页面右半边的介绍。默认配置即可。然后下一步,完成了配置。


图13

(11)、接下来可以导出配置了,如图13,单击Export,进入导出菜单,我们选择选项卡Register File,寄存器配置文件。


图14

单击下边的Save to File,保存生成的配置头文件,如图14所示。完成时钟配置后,您可以使用ClockBuilder Pro生成一个配置文件,该文件包含了所有的时钟配置信息。将该文件保存到您的计算机上。

4、接下来使用生成的头文件,将配置信息通过I2C写入到Si5351A。

(1)、新建一个Arduino项目,并选择所用的主控芯片为ESP32-C3,选择芯片模块对应的烧录串口。设置如下图所示



图15

将wire.h与生成的Si5351A配置头文件都包含进来

完整代码如下所示

#include <Wire.h>
#include "Si5351A-RevB-Registers.h"
/*
  利用 Clock Builder Pro生成时钟芯片Si5351A的配置后,生成的文件默认位地址是16BIT,数据为8BIT。
  如果直接使用需要注意这一点,因为Arduino的write(uint8_t),参数为8bit变量,注意转换。
*/
#define SI5351A_ADDRESS            0x60


void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);
  Wire.begin();

  for(unsigned char i=0;i<255;i++)
  {
    SI5351_WR_Byte(0,i) ;
  }


  for(int i=0;i<SI5351A_REVB_REG_CONFIG_NUM_REGS;i++)
  {
    SI5351_WR_Byte(si5351a_revb_registers[i].value, si5351a_revb_registers[i].address) ;
  }

}

void loop()
{
  // put your main code here, to run repeatedly:

}

void SI5351_WR_Byte(unsigned char dat, unsigned char reg_addr)
{
  Wire.beginTransmission(SI5351A_ADDRESS);  // 开始I2C传输,并指定设备地址为SI5351A_ADDRESS
  Wire.write((unsigned char)reg_addr);      // 发送地址字节,注意有效位为低8位,自动生成的地址为16BIT的。
  Wire.write(dat);              // 发送数据字节
  Wire.endTransmission();       // 结束传输
}
我没观察一下生成的头文件的主要内容


图16

可以看到配置代码放在一个结构体变量里,可以方便的访问到内存地址与对应的配置参数。另外主意到该生成的配置结构体种的地址为16BIT的,注意我们使用的I2C写入函数的操作参数为8BIT,这里应做强制转换,保证传入的参数与定义的参数类似是一致的。

完成代码后我们下载代码到芯片。并用示波器观察三路时钟信号。






使用特权

评论回复

打赏榜单

zhuomuniao110 打赏了 5.00 元 2023-07-28
理由:全面,终于知道得到这个数据怎么用了。

21小跑堂 打赏了 100.00 元 2023-06-15
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
forgot 2023-6-28 08:42 回复TA
非常全面 
21小跑堂 2023-6-15 13:38 回复TA
借助ClockBuilder Pro工具,助力Si5351芯片的开发使用,软件配置过程详细有条理,实现效果较好。 

相关帖子

沙发
幸福小强| | 2023-6-17 23:29 | 只看该作者
方法不错,也学会了怎么用Arduino 的I2C底层函数。

使用特权

评论回复
板凳
caizhiwei| | 2023-6-24 13:59 | 只看该作者
羔羊哥又出新作啦,支持支持

使用特权

评论回复
地板
forgot| | 2023-6-26 14:06 | 只看该作者
楼主写的非常全面,来学习一下啊

使用特权

评论回复
发新帖 本帖赏金 105.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1896

主题

15632

帖子

198

粉丝