上一篇BLOG简单介绍了MS5611的基本情况。这里我们考虑一下如何在ZYNQ里面实现,也就是规划PS和PL如何分工实现。
一般这种有一定简单时序的外设控制器我们可以采用两个方式编写:
1,用PL构造时序,做成所谓的加速器。
2,用PL做出来基本GPIO,用PS模拟控制每一个脚模拟出来时序完成对外设的控制。
第一种方法是一个硬件加速器的思想,第二种方法是返璞归真,大道至简的方法或者说笨办法。
如果是一个简单的SPI外设,我们用第一钟方法是专业的,但是我们为了图省事,完全可以采用第二种方法,我们做一个SPI控制器的PL加速器,实现SPI的输入输出,让PS只操作几个寄存器就可以SPI数据收发,但是我们一般PS在进行SPI进行写操作之前要等待上一个SPI操作完毕,在进行读操作要等待读的完成,所以PS依然在等待。让PS直接操作PL写的IO脚,模拟出时序在这种情况下也是比较好的选择,这种模拟出来的时序能到2Mhz的样子,也不算低。这种方式好处是调试方便灵活。
这里我们设想一下,如果采用第2种方式,在进行MS5611的D1 D2转换操作时候,要白白等待8.2ms,这对于咱们一个主频高达1G的处理器来说意味着多大的浪费。于是我们采用第一种方法构造一个特殊的PL控制器。
我们在想,如何才能省掉这接近10ms的等待呢,如果让加速器自动完成这D1 D2转换命令并且把数据保存到队列里,PS用的时候直接取走。取走后队列为空,加速器再转换读出并保存到D1 D2。这样只要PS两次读之间的价格大于一定数值(且说 8.2MS+8.2MS+时序时间多说1ms)20ms,这样PS的每次读就是直接从队列里面直接取出。
既然想到这这样自动读出D1 D2,我们也直接在这个控制器里面完成RESET命令的发送以及6个16位校准字的读出。