打印
[ZLG-ARM]

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

[复制链接]
1926|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
WnEunfn|  楼主 | 2008-11-29 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原来的方案是这样的,一个模块(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,所以也有可能是这个时钟的问题

最后请教一下大家,不考虑时钟的问题,数据传输出错的其它可能是什么?

相关帖子

沙发
WnEunfn|  楼主 | 2008-11-29 11:11 | 只看该作者

附伪代码


主端的伪代码:

//初始化
关闭SPI的使能(片选)
设置SPI为主模式
关闭SPI的中断
配置SPI为16位传输模式,极性,相位
配置SPI的时钟

开启SPI的片选

//传输数据,另外操作的时钟是SPI的时钟的10倍
发送 0X03000000 //读命令,一共32Bit
for(i = 0; i < 4K/2/8; i++)
{
 当SPI的发送FIFO不空的时候等待
  发送8个16bit的数据(FIFO深度均为8)
  当SPI的接收FIFO不满时等待
  接收8个16bit的数据
}
关闭SPI,取消片选




从端的伪代码:
根据主端来配置从端
向FIFO写8个数据
打开从端//FIFO的数据可以先写入
while(数据没有传输完)
{
  当接收FIFO为空时等待
    UINT16* Buffer++ = 从接收FIFO里读取一个数据
    当发送FIFO为满时等待//其实可以不要
    向发送FIFO中写一个数据
}

//后面的操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝