基于一个的FPGA代码管理芯片配置的细节

本来是一个很普通的时钟管理芯片,通过串口用自带的软件很容易配置,但是尝试写FPGA代码进行配置却遇到了各种困难,等最后的问题解决后,才发现有一个很重要的部分被忽略。小细节。硬件调试是这样的。只要没有调试经验,一个小细节可能会耽误很久。就像现在做芯片一样,最重要的是你买不起的就是时间。行情的时间窗口一旦过去,即使做出来,也没有任何意义。因此,经验的积累非常重要。平时点点滴滴的经验积累,以后可能会在不经意间被利用,也起到了非常重要的作用。画一条线值一美元,

AD9558芯片主要用于时钟倍增和时钟同步(输出时钟与输入参考时钟同步)。

查看官方芯片手册,我们可以看到芯片的引脚排列(见下图1),以及内部模块的详细信息(见下图2).

图1

图 2

配置前,我们先阅读芯片的引脚功能介绍,获取各个引脚的输入输出特性,包括引脚功能、电压等信息。

接下来,配置寄存器。手册给出了AD9558的入门初始化流程图、系统时钟初始化子框图、APLL初始化子框图。看完这些流程图,你会发现自己更加困惑!这些流程图只有一个通用的流程框架,并没有具体的寄存器配置顺序和对应的寄存器值。

说到寄存器的配置顺序和对应的值,先看手册,最后查看各个寄存器的含义。从寄存器图中我们可以看到下图,寄存器地址为16位,最高位全部为0,也就是说地址的有效位为低12位,数据位D7-D0对应以不同的含义,最后一列是寄存器的默认值。不同的寄存器配置的功能是不同的。例如,从 0x0101 开始的一系列寄存器对应系统时钟的配置。其他的也在手册中指定。

了解了寄存器的作用之后,我们需要了解寄存器的值是如何在芯片内部进行配置的。其实在最开始的芯片管脚处,我们可以看到名为spio/spo等的管脚,顾名思义就是通过spi总线将数据以串行的方式配置到寄存器中。

我们也可以从手册中找到Spi总线的读写时序图:

从上图可以看出,spi总线的核心是三个信号,片选信号cs(低电平有效)、时钟信号和sdio数据信号。这里,sdio 信号由四部分组成。R/W 为 1 时表示读,为 0 时表示写。接下来的W1和W0表示数据传输类型(00表示一次发送1个字节的数据,01表示一次发送2个字节,10表示一次发送3个字节,11表示流模式)。上图是一次传输2个字节,知道初始地址后地址自增。

因此,我们只需要在配置寄存器时将片选信号拉低,让24位数据在时钟的上升沿由低到高依次传输。

在具体配置中,我们根据芯片公司提供的配置软件手动输入需要配置的参数,如系统时钟频率、参考时钟频率、输出时钟频率、输出端口片选,软件会自动计算相应寄存器的参数。下图左侧是配置软件打开的初始化界面,下图右侧是时钟配置向导界面。可以看出我们选择参考时钟c和参考时钟d输入,频率为125Mhz。

配置的界面如下:

该软件配置的寄存器地址及其值也可以通过文件设置文件导出。

遇到的问题和解决方法

下面介绍配置过程中遇到的问题及其解决方法。

按照上面的思路,我们把配置软件导出的文件转换成coe文件,通过rom读取,然后从fpga用spi串行时序输入到ad9558芯片,但是之后没有时钟输出配置完成。

这时候的现象是可以通过vio配置和读取寄存器的值,但是0D01寄存器读取的值是0X16,0D01寄存器是状态指示寄存器,0X16表示系统时钟pll没有锁定。

我们可以看到,如果系统时钟没有锁定,进程1就没有输出,那么后续的进程2和进程3就更不稳定了。查看coe文件,我们发现导出的寄存器地址是按照从小到大的顺序排列的,所以我们怀疑寄存器配置应该遵循特定的顺序,而不是地址从小到大的顺序。

为了得到正确的寄存器配置顺序,我们想到了通过usb串口捕捉软件来捕捉通过配置软件配置的寄存器的顺序和值。抓拍软件界面如下:

捕获的值如下:

经过分析,我们认为长度为24,连续输出的是有效信息ad转换子程序流程图,另一个是usb板与电脑的通讯信息。

我们取每个两位数据的第二位,然后将四个二进制数组组合成一个十六进制数。最后上图对应的是000501,即0005地址处的寄存器值为01,用于更新IO效果。为了提高效率,我们使用python来处理文本,在软件配置时获取寄存器配置顺序和对应的值。Python程序如下:

接下来按照上面的配置方法,将rom中的coe文件通过fpga写入到AD9558芯片中。但是结果还是出乎意料,还是没有时钟输出!

为了实现fpga配置和软件配置的一致性,我们查看了电路图,发现usb下载器对应的管脚和fpga下载器的管脚之间只有一个电阻,可以认为是直连。

这个时候,我们有了新的想法。由于usb下载引脚与fpga下载引脚直接相连,通过usb下载的数据在进入AD9558芯片时也会进入fpga。我们只需要将fpga的所有对应引脚设置为输入类型就可以捕获usb下载的数据。为了保证fpga不损坏,我们用万用表测试了usb管脚的输出电压,用示波器捕获了usb板配置寄存器的输出波形。

万用表测试结果约为3.3V。fpga捕获的sclk波形如上图所示。我们可以看到usb板的输出信号类似于门控时钟。当片选信号拉低时,时钟也停止。

由此,我们怀疑是否应该将自己的配置信号波形完全这样,即加门控时钟还是降低频率?

我们之前配置的频率是25Mhz,上面示波器读取的频率是227Hz左右,fpga捕捉到的波形频率是1Mhz左右。

再看手册,spi总线支持40Mhz以下的时钟ad转换子程序流程图,我们决定不改自己的时钟,

同时,手册中还声明不关心cs拉高时的时钟和数据值。这表明这不是配置的时钟频率或门控的问题。

接下来操作有点“玄学”,用usb板配置可以成功,但是fpga输入同样的东西结果错误,怀疑是usb板配置后会给出“结束信号”完成,用这个信号来标记配置完成,然后芯片收到“结束信号”后才会输出时钟。

抱着这个想法,我先通过fpga把配置信息烧到板子里,然后接上usb板子。这时候打开usb串口抓包软件进行抓包。由于没有打开ad9558配置软件,所以串口抓包软件还没有抓到任何信息。,但芯片示波器触发。也就是说,通过fpga配置后,只需插上usb卡,无需软件配置,芯片有时钟输出。但是只插了usb板,并没有通过fpga进行配置,芯片依然没有时钟输出。同时串口抓包软件没有抓到任何信息,说明板子没有发送任何信息。这很奇怪吗?usb板不输出信息但允许AD9558芯片产生时钟输出!

usb板如下:

为了搞清楚板子在fpga配置的AD9558芯片上是怎么工作的,我把板子的杜邦线一根接一根地接在芯片上,最后发现当sync接芯片的时候,芯片有时钟输出!我用万用表测试了同步电压,发现usb卡的同步电压是3.3v,但是芯片上对应的同步是0.3v,然后我去芯片手册查看sync函数,发现sync函数同步复位时,低电平有效,也就是说我们之前没有匹配成功的原因是:没有复位!插上usb板后,芯片输入同步为高电平,取消reset!

其实从一开始就应该发现有两个reset信号,但是由于思维惯性,我们只收到reset的reset信号,导致问题排查了半天,做了一个很多无用的工作!

这也告诉了我们一个道理。排查时要从大局出发,先看复位、时钟和有效信号,再看内部具体原因。在进行芯片相关应用时,一定要仔细阅读芯片的配置手册,了解芯片的逻辑和电路特性,以免一开始就发现同步信号为低电平。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论