Frank

板间SPI通讯,想说爱你不容易

0
阅读(3831) 评论(1)

一、板间SPI通讯,想说爱你不容易

问题是针对导航系统中控制计算机板与导航计算机板的板间SPI通讯的问题,尽管经过了两天的痛苦折磨,但是最终还是把问题解决了,写一个调试文档记录一下这苦逼的两天,斌哥说,不总结的人生等于白活,学会总结,trytrytry

系统描述:控制计算机板主要是DSP28335,在板间SPI通讯过程中作为从机,导航计算机板主要是DSP6747,在板间SPI通讯过程中为主机。SPI信号从DSP6747SPI主机)出来经过1642463.3V转换为5V),经过30cm左右的杜邦线与控制计算机板的接口相连,经过1642465V转换为3.3V)进入DSP28335SPI从机),首先测试主机向从机发送数据。

问题描述1:主机发送没有问题,时钟信号、数据信号均没有问题,但是经过两个电压变换信号后,数据信号变得不干净,有毛刺,而且高电平达到了3.3VDSP28335完全接受不到信号。

分析阶段1:用示波器测试主机出来信号,依然有,没有问题,但是经过电压变换,信号OK,经过杜邦线,OK,经过另一电压变换芯片,数据信号没有,但是时钟信号有,将两个通道换一下,结果数据信号有了,问题已浮出水面,进入从机的电压变换芯片通道坏掉了,话没多说果断换掉。

问题描述2:将芯片换掉后,信号、时钟一切OK,从机收到了数据,但是完全不对,主机发送的是固定值,上位机收到的数据是各种变化。

分析阶段2:收到了数据,但是数据不对,用示波器测量,信号都没有问题,但是数据仍然有杂波,不管丫的毛刺了,首先定位为软件问题,将主机、从机的模式检查了一遍:

 主机:  配置为主模式;每次收、发数据位数为16bit;首先发送数据的高位;波特率26.6M;时钟极性CLOCK POLARITY =0,时钟相位CLOCK PHASE = 0,即数据在SPICLK上升沿发送数据,在SPICLK下降沿锁存输入数据。

 从机:  配置为从模式;每次收、发数据位数为16bit;首先收到数据的高位,因此为右对齐;时钟极性CLOCK POLARITY =0,时钟相位CLOCK PHASE = 0,即数据在SPICLK上升沿发送数据,在SPICLK下降沿锁存输入数据;时钟由主机产生。

 检查了一遍,首先将时钟极性配置为一致,继续测试,主机是定时器发送的,从机通过查询标志位进行读取,此时定时器仍然是错误的,但是收到的数据错误的比较有规律,发生了错位,后来上网上查询,说需要清除接收标志位,网址如下

http://blog.sina.com.cn/s/blog_56e19aa70101a33q.html

Datasheet上明确写着清除接收标志位的方法,

  (1)、复位SPI

  (2)、读取接收寄存器中的数据

初始化的时候已经复位将标志位清除,并且每次读取接收数据寄存器,按照datasheet上的说明肯定没有问题,但是问题就出在这,每次读取完寄存器中的值,然后软件将SPI复位,然后退出复位,上电,测试,结果,结果,结果尼玛大部分数据对了,还是有一些数据是错的,必须声明一下,现在发送的数据是0x0102,有将近1/3是错的,而且依然是错位,到现在,我不解,不解,还是不解,明明datasheet说的读取接收寄存器中的数据也能清楚标志位,为毛只有复位才行,难道尼玛TI公司顾得清洁工写的datasheet,而且还是有错位的数据,拿示波器一测,依然有毛刺,而且幅值依然较高。

山重水复疑无路,柳暗花明又一村,没想到,没想到,没想到的是当我们把发送的数据改为0xABCD,结果数据没有一个错误的,数据齐刷刷的摆在眼前,没有一个错误的,测试7FFF,没错,测试0x0203,依然有错;用双通道示波器测试从机电压变换前后的数据,奇迹出现了,哥告诉你,奇迹出现了,数据的毛刺杂波没有了,而且齐刷刷的数据,就连0x0102,0x0203都没有任何错误,到现在为止,问题再一次浮出水面,发送程序、接收程序肯定没有问题,不然发送0xABCD时不会成功,问题就出在毛刺这,0xABCD7FFF数据之所以正确,就是因为这两个数据有一共同点,就是基本都为高电平,0x0102,0x0203信号之所以正确,就是因为信号基本为低电平,低电平容易受到扰动,信号在主机出来时没有毛刺,但是经过了杜邦线,数据出现了毛刺,突然想起了特权同学的EPCS芯片的信号完整性、以及斌哥总结杜邦线出现的问题,综合考虑,是出现了信号完整性问题,尼玛,听说过,没见过,信号完整性n年前就听说过了,但是只闻其声不见其人,今天终于见到了真面目,既高兴又感到幸运,高兴的是第一次遇到信号完整性问题,幸运的是我看过了斌哥和特权同学的经验,很快的锁定了问题,并有了解决方法,特权同学原文这样说道:

  示波器探头客串了“终端匹配者”的角色,示波器通常由一定的寄生电容,相当于在被测试端并联了一个10pF左右的电容。

  手头没有10pF,在数据线与地之间并联了一100pF的电容,上电,测试,激动人心的时刻到了,困扰了一天半的问题马上得到解决,运行程序,OKOK了,一切OK,数据的波形不在有毛刺,从机的数据接收全部正确。

总结一下经验:

1、保证主机、从机的时钟极性一致。

2、从机接收数据软件复位才靠谱,接收完一次复位一下,这才是王道啊。

3、杜邦线,请慎用,尤其是在高速电路上。

 

二、电容滤毛刺原理

    电容、顾名思义,是电的容器。 

以直流电源滤波为例在直流电源滤波电路中,电容的两个极并接在需要滤波的电路上,当电源电压向上波动而高于电容两端电压时,就会对电容充电(或叫电容吸收电流),使向上的电压不再升高或升高缓慢当电源电压向下波动而低于电容两端电压时,电容就会对电路放电使电路电压不再向下波动或波动减慢。 这一充一放就铲平高的填平低的,使电源输出平滑的直流电。 

无论高频低频的滤波原理都一样,只是用的电容量容量不同而已。滤高频,用小电容,因为电容越小,充放(充满和放完)电时间就越短,对变化极慢的低频来说根本就不起作用。 滤低频,用大电容,因为电容越大,充放(充满和放完)电时间就越长,对变化极快的高频信号来不及反应

  1. 我也遇到了相似的问题,看了作者的文章豁然开朗。作者两天就解决了问题,这个问题却困扰了我很久。

    我刚进入嵌入式行业,见识太少,对作者提到的 “ 斌哥和特权同学 ”不是很了解。请问作者哪里可以看到这两位大神的文章。