本帖最后由 axellaw 于 2017-3-6 00:38 编辑
如果CPLD的SPI用的是同步边沿检测的话,50M时钟实现18M的SPI通信是几乎不可能的,简单算一下就知道了
可靠的边沿检测需要两级寄存器来缓冲输入数据,也就是说,spi时钟到了CPLD中,被检测到后,至少也在2个时钟周期后了。
spi的工作模式是,主从机在相同的沿捕获和移出数据,比如时钟相位是0,则主机在上升沿捕获数据,在下降沿发送数据,从机也是这样,所以spi通信必须满足:从机在下降沿发送据后必须在下个上升沿之前到达主机,因为时钟是主机发出的,所以对主机没要求。
可以估算一下时序,主机在下降沿移出数据,布线延迟1.5cm就是1ns,算你3cm的布线2ns吧,到达cpld后,50M的主时钟,延迟2个时钟周期,就是40ns,加上CPLD的tco(从引脚进入信号)延迟,一般5ns是有的,这就47ns了,然后把数据打出寄存器,到达引脚,差不多8ns,这就55ns了,已经远远超过18M的半个时钟周期了,所以cpld在主机给出的时钟下降沿送出数据,是无论如何也无法在上升沿之前到达主机的
解决的办法只有:
1.提高cpld的工作时钟,降低边沿检测需要的时间
2.降低spi的发送速率,按照一般经验,cpld使用同步边沿检测实现spi从机,spi速度最好不要超过主时钟的1/5
3.cpld采用异步spi从机的设计,但异步电路设计需要小心的坑太多,自己看吧4.不使用标准的spi通信模式,即在上升沿捕获数据的同时,提前发送数据到主机,这样可以抢半个spi时钟周期的时间,但时序计算方式就不同了
|