背景及问题描述
最近在FPGA上写了一个与海德汉编码器进行endat协议通信的代码。endat协议的通信时序在网上很容易找到,简单的实现角度的获取难度也不是很大。但是在写完之后实物验证上出现了问题:
我能接收到编码器传回来的数据,但是这些数据最终在计算机上看起来是毫无规律的。在排除了传输路径上的其他可能出问题的阶段之后,最后问题定位到了endat协议的通信上。
最初我对这个问题束手无措,因为从ILA抓取的波形来看,我发送时钟和模式指令的时序是符合通信协议的,但是编码器传回的数据也确实是毫无规律。
后来我将状态机卡在接收数据的阶段,让FPGA不断产生时钟,观察编码器返回的波形。这样还真发现了编码器返回数据的规律,每隔一段时间数据线上就会出现一段极其相似的波形,我完全有理由相信这是正确的反馈结果,但是不是很懂为什么会这样,甚至一度怀疑是这个编码器已经坏了。
解决方法
最终解决这个问题是延长了两个通信周期之间的间隔时间。我发送的时钟频率大致在几百KHz那样,根据编码器手册讲这时需要两个通信周期的时间间隔在10us到40us,而我的时间间隔时间恰好只有10us左右。后来将这个时间延长到了80us,计算机上读到了正确的角度数据。
我猜测这个长时间的间隔可能会使编码器复位。
我的实际实验数据结果与说明书上的数据不是很相符,这需要更多的实验去验证。
但是可以得到这样的结果:通信协议的时序图只有一个周期的波形,单看这么一个图很容易忽略间隔时间。两个通信周期之间的间隔时间是很必要的,时间应该足够长来保证接收到的数据的准确。