遇到的问题beij
-
背景:时钟极性(Clock Polarity)CPOL,默认为LOW。
-
遇到的问题,首先我是直接给了一个CODE让AND8810能够输出电流,然后按照数据手册给的公式把电流转为CODE的时候出现了自认为玄学的问题,更改预设电流值,输出经常会跳为0。我一直是以为通信出现了问题,一直没有准确复现这个问题。然后按照公式预设100毫安左右时输出只有50毫安,这我一开始没注意,以为是公式解错了。直到学长让我测一下输出的分辨率等参数。我用CODE++惊奇的发现CODE为奇数全没有输出。
-
解决问题的过程,我看了一下逻辑分析仪,发现硬件SPI的数据线在每一次传输完数据后会一直保持最后一位的状态,结合ADN8810首位必须为低电平的特性判断应该是ADN8810把上一次 的高电平判断为了本次通信的数据。
那么首先想到的是直接下拉数据线,然后发现硬件SPI不支持。
-
再想下一个解决方案,我想明明通信时有CLK才能读取数据啊,为什么会先读到上一次还没变化的数据。我就想到了肯定是数据的判决时刻问题。有可能ADN8810是检测时钟的上升沿开始写入数据,时钟为低的时候,时钟开始就是上升沿,这个时候读取数据很容易造成数据线还没跳变数据就已经开始传输的情况了。
-
如果我们把时钟的极性调为高,时钟一开始跳变就是下降沿,半个周期后才有上升沿,这样数据线就有足够的时间稳定。修改了这一个参数解决了玄学问题。最大值小了一半的原因也肯定是把上一个数据没有改变的0当成了这一次的第一个数据,相当于整个十六位数据右移了一位。
-