DSP28335与AD7606的通信终于实现了。最终的方案是通过DSP28335控制AD7606的采样,采集的数据通过SPI串口发送给28335,然后28335通过串口发送给上位机显示。
其实程序第一天就写好了,但是一直读不出AD7606采集到的数据,所以后两天主要是调试。
对于程序员来说,调试是最重要的能力,也还最考验人的耐心的,因为很小的细节出错就可能导致意想不到的结果,而且明明感觉是对的东西,有时确是错误的。
下面就说下这个调试过程。
首先程序是一部分一部分的实现的,这样的话容易定位出错的模块,首先实现的是DSP与上位机的串口通信,这个在上篇的博客中有说明。
另一个模块即是DSP控制AD7606的采样与通信。AD7606购买的是一个模块,外围的电路已经设计好,各功能引脚已经引出,而且给出了STM32与AD7606的控制程序,但这个程序只是用于STM32,而且中间的设置及寄存器配置都是根据STM32来的,所以说要用到28335上需要大量的修改。所以还是相当于从头来写,因为程序的框架可以按照给的程序来写,所以还是节省了许多的工作。不过写好之后发现上位机什么也没有显示。之后漫长的调试过程就来了。
既然读不到数据,首先想到的是SPI的控制是不是有问题,利用DSP28335自有的SPI回环测试功能测试了一下,又修改了下SPI的配置,但是还是没有数据。之后想确认下是否执行了SPI中断程序,发现SPI的中断程序没有执行,但是可以进入外部中断程序,这个外部中断程序是由AD7606的BUSY引脚产生的,当启动转换的时候BUSY会变成高电平,转换完成后又变成低电平。这个过程中间有个下降沿,利用此下降沿产生中断然后开始读取转换后的数据。说明AD7606工作了,且完成了转换。但是通过观察DSP的SPI接收寄存器中一直没有数据。
之后跟着程序,参照数据手册走了一遍程序,确定程序逻辑上是没有问题的。怀疑SPI的时钟有没有输出,一些引脚的电平是否输出正确,因此用示波器观察了各引脚的电平(某一时间内电平固定的引脚),都是期望的电平。想观察下AD7606的数据引脚有数据输出没,奈何没有逻辑分析仪,用示波器观察不了(频率太快,也不是一直都有输出,示波器的干扰又大),而作罢。
上网查找AD7606与DSP28335的相关资料,看了一些别人的资料没有找到需要的。其实上网查找的过程中还是发现了许多的资料,包括ADI公司完整的包括AD7606的应用、控制程序、外围电路的设计资料等,不要小看无意间的一句话,也许某句话也就点醒了你,所以遇到问题的时候可以多看别人遇到了什么问题、怎么解决的。这可以节省大量的时间。但是不能一味的求助别人,要自己多想。
数据手册是一个重要的资料,关键点一定要明确。
控制芯片的时候要多注意这些关键点,因为有一个地方不对,结果就出现不了。(要特别注意),对照自己的程序,根据时序图看一下,是否满足各方面的要求,包括延时、信号的先后顺序等。
在不同的时钟频率下,同一个延时函数,延时是不一样的,所以移植程序的时候也要注意这点。
在这个程序中,其实读不出数据的最主要的一个问题还是SPI配置的问题,因为控制发送功能的寄存器中有一位是开启增强功能模式,就是可以使用FIFO,而默认情况下是不能使用FIFO的,因为想着不使用DSP的发送功能,所以直接把发送功能的配置给删除了,而忘记了这位,所以读取不出。而在回环测试的时候是对的,是因为回环测试的时候要开启发送功能。
这个问题的发现是想着重新写下代码,看书核对配置的时候偶然在发送寄存器中看到有一位是控制开启增强模式的。所以理不清的时候,不妨重新来过。(下策)
(也曾怀疑过硬件的问题,如果没有解决的话,下步应该是在STM32上跑下。不过硬件因为是买的现成的模块,出问题的概率不大)
此次调试总结
首先核对硬件连接是否正确,包括供电,接地,参考电平,时钟等,然后需要检查寄存器配置是否正确,再逐渐调试软件(首先跟着程序的流程走一遍,确认是否有明显的失误。然后可设置断点、标志位、观察某一变量的值、内存的值等),仔细研究时序图,这才是正确方法。另外就需要耐心与细心。