使用Aardvark(Total phase)通过i2c连续访问CPLD的寄存器
1、 在Aardvark的选项界面中,i2c
Monitor一项之前提到过是无差别的对i2c链路上的信号进行采集并记录。那么如果我们想针对I2C链路,断开master设备,将total phase来作为master访问slave的话该如何操作呢?一般的做法是选择前两项即带有i2c字样的mode,在这些mode下面,Aardvark提供为了比较通用的i2c设备的寄存器的访问方法,按一些button即可完成访问,但是对于特殊的设备的寄存器,例如大于32k的eeprom的寄存器的地址是双字节的,通用的i2c访问方法无法正常通信,又例如CPLD的寄存器信息,访问时是一种类似于eeprom的双字节的寄存器地址(command + index),对于这种特殊的I2C设备,一般的通信协议里无法正常的访问。除此之外,我们有时候希望能连续不断的对一个设备的某一些寄存器进行读取,这种情况对于total phase里通用的i2c的入口界面也无法完成。
2、 那么Aardvark能否提供一种方法来让我们按照想要的i2c协议来访问设备呢?答案是肯定的。事实上,关注上图中的绿框部分,其中有一项是Batch Mode。这一个模式是做什么的呢?在回答这一个问题之前,我们可以先查看一下Aardvark的文件夹,发现里面除了我们用的操作程序外,还有几个文件,包括example,help,image和windows,可以确认,image是保存一些程序的图片的,windows里都是程序运行的必要的动态链接库等。那么example和help是做什么的呢?
3、 点进入发现,example里面都是XML脚本,help里面都是一些函数的说明文档。原来Aardvark的程序里面集成了一个XML解释器,可以根据我们所编写的XML脚本来进行解析生成我们所需要的I2C协议,而之前提到的Batch Mode就是指通过加载XML脚本来完成I2C访问的模式。
4、 随便打开一个example中的xml文件,如下图所示,关于XML编程的语法本文不做解释,非常简单从web上学习半个小时即可掌握。从下图中可以看到,Aardvark提供了一些标签,例如i2c_write或i2c_read等基本动作,通过自由的组合这些基本动作即可完成一个i2c的协议;除此之外,Aardvark还提供了一些类似于configure的标签来配置I2C链路的时钟以及上下拉电阻等设置。
5、 在XML编写完成后,在Aardvark界面下选择batch
mode模式,如下图所示,点击Load按钮选择对应的XML文件,可以看到XML文件被成功加载到了窗口中,然后点击Execute按钮,如果没有错误的话,那么久可以在Transaction log当中看到I2C链路上的得到的数据了。
6、 我们根据CPLD的i2c协议要求,来修改example中提供的XML文件。首先用记事本打开一个XML,如下所示。这里面所有标签的说明文件都在help文档里,不知道具体用法的话可以去查阅对应的文件。
<aardvark>
<configure i2c="1" spi="1" gpio="0" tpower="1" pullups="1"/>
<i2c_bitrate khz="100"/>
<i2c_write addr="0x50" count="1" radix="16" nostop="1">00</i2c_write>
<i2c_read addr="0x50" count="256"/>
</aardvark>
前两行根据我们的需要来改参数,因为板子上有上拉了,所以这里的pullups就改为0.另外,spi也可以改为0。第三行是设置时钟的,100Khz,我们不需要改。第四五行比较关键,目前可以看到
该配置下total phase将会访问0x50设备,然后访问0x00寄存器。然后slave返回从0x00开始的256字节的数据。对于CPLD的通信协议来说,CPLD的地址为0x41,并且访问CPLD寄存器需要向CPLD写2字节的数据,分别是command 和 data address。然后CPLD返回的值只需要反馈一个字节的数据即可。因此这两行我们需要修改为:
<i2c_write addr="0x41" count="2" radix="16" nostop="1">05 00</i2c_write>
<i2c_read addr="0x50"count="1"/>
之后再添加一行延时的程序
<sleepms="10"/>
最终就完成了这一段代码的修改。载入Aardvark可以正确读到CPLD的数据。
7、 但是如何不停的执行程序呢?很遗憾,在研究了一下这个工具后发现,目前手里的版本确实没有提供循环执行操作的标签。但是可以采用一种曲线救国的方案,即使用按键精灵来控制鼠标每隔一秒自动点一下excute按键,这样就实现了自动的对脚本进行执行的方法。具体的按键精灵的使用方法不再介绍,网上的教程非常多。这里只提供了一个笔者已经生成好了的按键小精灵,直接执行就可以完成上述的动作。需要注意的是,该原理是通过找屏幕中“长得”和excute按键一模一样的区域然后控制鼠标点击的方法来实现循环执行的。因此在程序运行的过程中,计算机不能做任何事情,并且必须保证界面干净。幸运的是,因为这个过程相当于一直在操作鼠标,所以计算机不会因为“闲置”而黑屏。数据保存的格式是向量文件,和cadence里的BOM格式一样。之后怎么处理就不再赘述了。
任何问题及讨论欢迎致函zhengguanru@163.com