任意频率时钟发生器Si5324配置小结

       Si5324是Silicon Labs公司的一款任意频率时钟发生芯片。基于Silicon Labs的DSPLL技术,可以从任何输入频率产生无限组合的低抖动输出频率,Si53xx系列的芯片好像都是这种类似的功能。

 

                                                   图1. DSPLL®模块图解

       Si5324有很多寄存器,要正确的使用它就得配置这些寄存器,它的控制模式有IIC和SPI两种,我程序里面用的是模拟IIC,IIC通信协议网上一找全都是,所以协议我就不多说了。图1左下角的信号检测模块包含信号丢失报警(LOS)、频率偏置报警(FOS)和PLL是否锁定标志,都可以通过寄存器来设置是否开启警报或读取警报状态,更详细的内容可以参考下面资源链接里面的数据手册。

       刚开始使用IIC与Si5324通信时总是失败,依照格式先是一行IIC产生起始信号函数i2c_start(),紧接着再发送一个字节的器件写地址i2c_SendByte(0xd0),然后等待应答信号i2c_WaitAck(),但这里总是显示的从器件无应答,这就表明Si5324就像个高冷的小姐姐一样,你想搭理她她却不理你,出现这种情况就不能再继续下去了,要找出到底是自身的原因还是对方的原因。 

       首先便是用示波器观测IIC的时钟线SCL和数据线SDA的时序是否按照预想的进行,起始信号和要发送的字节都没问题,说明模拟IIC的底层函数写的没问题,然后仔细查看板子的原理图和芯片数据手册,发现了原理图上Si5324有个复位引脚经上拉电阻后接入了MCU。既然如此,那就在通信之前加个复位函数,将其复位引脚拉低一段时间后再拉高(刚开始复位时傻逼了,拉低之后就不管了,导致芯片一直处于复位状态,又找了好久的原因)。进行完复位操作后应该是万事大吉了,发送器件写地址过去后是有回应了,但见了鬼的是紧接着发送一个字节的寄存器地址过去后又没回应了。真特么的是走一步卡一步,难道回去养猪才是正道么。

       后来用万用表检测Si5324芯片的几个VDD和GND引脚时发现有个重要的地线板子上面没连上,给我的原理图和PCB文件上显示的是接上了的,但那个小老弟解释道可能是最后一次修改后投去做板的文件是没有保存的文件,真是一波令人窒息的骚操作。通过飞线解决后一切正常,可以与Si5324通信了,想写就写想读就读,真好。

                                                 图2. Si5324 IIC读写命令格式

       图2还是不难理解的,依照格式来就能读写指定的寄存器,寄存器地址和寄存器里面各位代表的功能数据手册里面有详细介绍,图中还说明了芯片的寄存器地址是自动增加的,也就是说先写了一个寄存器之后,地址自动加一,可以不断的写数据,感觉这功能没啥用。

       接下来便是要仔细研究数据手册中的各个寄存器描述了,配置寄存器时最主要的还是设置其各项分频参数,可以利用Silicon Labs公司的DSPLLsim软件快速得到各项分频值,然后在程序里面利用IIC写入对应分频寄存器的值便可完成分频配置。图3图4便是DSPLLsim的软件预配置界面(软件是他们开发板的配套软件,我们只需用它来获取各个分频系数即可),图4中PLL Divider Settings下面的几个参数便是分频系数,这里设置的是CKIN1输入4MHz,CKOUT1输出40MHz。软件可以从Silicon Labs官网下载,下面的资源链接里面也有。

图3. 配置界面

图4. 主要信息界面

                      

        配置完成后既可以读取其中几个指示状态的寄存器来获取芯片运行时的状态信息,例如通过读取寄存器130的值来获取PLL是否处于锁定状态。注意不要在配置完后立即读取状态信息,我一开始是配置完后直接读取寄存器130的值来得知PLL是否锁定,结果一直显示的是未锁定状态,还以为配置出了问题,后来发现PLL从失锁进入锁定状态需要一定的时间,立即读取的话肯定是显示未锁定状态。

       配套资源链接:https://download.csdn.net/download/qq_25648927/10770209

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
我可以回答这个问题。要实现任意频率的方波信号发生器,需要使用verilog语言中的计数器和比较器。计数器用于计数时钟信号的周期数,比较器用于比较计数器的值和设定的阈值,从而生成方波信号。 在实现过程中,可以引入时钟抖动来模拟实际情况。时钟抖动可以通过在计数器中添加一个随机数生成器来实现。具体的实现方式可以参考以下代码: module freq_divider(input clk, input rst, output reg out); parameter width = 16; parameter threshold = 2**width - 1; reg [width-1:0] cnt; reg [width-1:0] jitter; always @(posedge clk) begin if (rst) begin cnt <= 0; jitter <= $random % width; end else begin cnt <= cnt + 1; if (cnt == threshold) begin out <= ~out; cnt <= 0; jitter <= $random % width; end end end assign clk_jitter = (cnt >= jitter); endmodule 这个模块接受时钟信号和复位信号,以及一个输出信号out,表示生成的方波信号。width参数表示计数器的位宽,threshold参数表示计数器的阈值,即设定的周期数。在每个时钟周期上升沿的时候,计数器cnt加1,如果cnt等于阈值,则输出信号out反转,并将计数器清零。同时,也生成一个随机数jitter,表示时钟抖动的大小。在后续的时钟周期中,判断计数器cnt是否大于等于jitter,如果是,则认为时钟信号已经到达了下一个周期的起始位置,从而引入了时钟抖动。 需要注意的是,这只是一个简单的例子,实际的方波信号发生器可能需要更复杂的逻辑。同时,时钟抖动的大小也需要根据具体的实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值