背景
小马哥发布Altera平台的TN256热成像模块Demo代码后,有网友想移植到Zynq开发板上,但是遇到了模组数据输出全是0的现象。根据前期调试的经验看,这种情况一般是I2C配置没有成功导致的。
调试过程
想要解决问题,首先要尝试复现问题,排除假情况、确认真问题。
问题复现很容易,找一块正点原子领航者Zynq开发板,将代码移植过去,用ILA把TN256模组输出的数据抓出来,果然现象和网友描述的一样,I2C配置后模组有VS和HS输出,但是数据全0(夹杂着极少量的其他数据)。
经过调试发现,该问题是跟编译相关的,有时候能编译出好的版本来,探测器输出一些有响应的正常数据,因此我在代码中加了些断言代码,只要I2C配置期间出现了NACK那么debug信号就会拉高,最终实验现象是,只要是编译出的版本有问题,I2C配置期间就一定会有NACK,这也就意味着问题可以确定是I2C配置模块导致的。
解决过程
因为问题和编译相关,有时候编译结果是好的,有时候不行,这种情况根据经验十有八九是时序问题,但是I2C的SCLK时钟频率只有100KHz,如此低的频率有时序问题似乎难以理解。因为Xilinx平台直接用ILA抓I2C的双向数据不方便,没辙了只能返回Altera平台用Signaltap抓一抓I2C的配置波形(外部的逻辑分析仪用起来没有Signaltap方便)。
抓波形果然抓出了点问题,如下图所示是I2C的Start条件,可以看出起始条件后产生SCLK低电平发生后SDA立即拉高了,这里可能误触发停止条件,所以这里SCLK拉低时机应该提前一点,时序问题应该就出在这里。
好在虽然代码是很多年前写的烂代码,但毕竟自己写的,在哪里改很清楚,于是只修改了一行代码,得到如下图所示的正常的I2C起始条件波形。
代码修改位置:在I2C.v文件的Line146增加下图绿框中的代码即可,代码修改后I2C配置稳定,不再出现不同编译结果I2C配置不生效的问题。