[ZLG-ARM] SPI从端来代替S25FL008A的boot功能数据总是出错?请教!

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

附伪代码

附<br />主端的伪代码:<br /><br />//初始化<br />关闭SPI的使能(片选)<br />设置SPI为主模式<br />关闭SPI的中断<br />配置SPI为16位传输模式,极性,相位<br />配置SPI的时钟<br /><br />开启SPI的片选<br /><br />//传输数据,另外操作的时钟是SPI的时钟的10倍<br />发送&nbsp;0X03000000&nbsp;//读命令,一共32Bit<br />for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;4K/2/8;&nbsp;i++)<br />{<br /> 当SPI的发送FIFO不空的时候等待<br />&nbsp;&nbsp;发送8个16bit的数据(FIFO深度均为8)<br />&nbsp;&nbsp;当SPI的接收FIFO不满时等待<br />&nbsp;&nbsp;接收8个16bit的数据<br />}<br />关闭SPI,取消片选<br /><br /><br /><br /><br />从端的伪代码:<br />根据主端来配置从端<br />向FIFO写8个数据<br />打开从端//FIFO的数据可以先写入<br />while(数据没有传输完)<br />{<br />  当接收FIFO为空时等待<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT16*&nbsp;Buffer++&nbsp;= 从接收FIFO里读取一个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;当发送FIFO为满时等待//其实可以不要<br />&nbsp;&nbsp;&nbsp;&nbsp;向发送FIFO中写一个数据<br />}<br /><br />//后面的操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部