原来的方案是这样的,一个模块(IP,已做成单板)可以自行启动,IP有三条SPI线与外部相连,这三条SPI线是完全一样的,其中SPI3作为主端,连接一个S25FL008A,当上电的时候,执行IP内部的一小块固化的ROM中的代码,将SPI3初始化为主端,然后发送命令0x03000000读取S25FL008A中的前4KB代码(在发送命令之后,一直发送0xFFFF来维持SPI的时钟),将之装载入RAM中执行再进行下一步的操作,于是IP启动成功。
现在将S25FL008A取下,IP的SPI3连到主设备的SPI上,主设备来控制IP的启动,当IP需要S25FL008A的数据时,由主设备先行将SPI配置成从设备,然后将相应的数据发送给SPI3,以完成IP的引导。
现在情况是这样的,用另外一块单板来模拟主设备,将SPI1或SPI2与IP的SPI1与SPI3相连(各个SPI的配置与要求的完全一致:主端与固化的ROM中的代码一致),结果在传输的时候,结果正常。无论收到还是发送的数据,都是与要求的一样,代码一致,但是只要接到IP的SPI3上,从端收到的数据不再是以0x03000000FFFF...开始的,而全是0xFFFFFFF...的序列,这表示传输到IP的SPI3的数据也是错误的。请问这大概是什么地方出现了问题?
已确认的是: 1。主端与从端都与没有去掉S25FL008A的时候的配置一致。 2。单板(没有去掉S25FL008A的IP)与IP(去掉S25FL008A)之间,相同的代码,在单板的SPI1,SPI2,与IP的SPI1、2上测试的数据都是正常的。 3。如果在过程2中,将SPI的时钟频率调高到20M/12,会有误码发生,频率越高,误码率越高;而固化的ROM中的代码中,设置的SPI3主端的时钟频率为20M/7,所以也有可能是这个时钟的问题
最后请教一下大家,不考虑时钟的问题,数据传输出错的其它可能是什么?
|