arm板子写spiflash

Linux下写spiflash (有代码,代码,代码)

2017.6.18-2017.6.24: 由于需要给flash(W25Q64FV)写启动程序,刚开始在网上查了一下感觉很简单,就是open,write…就应该可以了,现实很残酷,遇到了好多问题,刚开始拿到的数据一直是FF,片选ID也是ff,这不是默认的拉高电平么,我就没写进去,看了芯片手册(不会硬件还要我做这个,也不知道理解的对不对)感觉操作的命令也正确啊,此时很彷徨

W25Q64FV基本命令格式

1.血泪史(确认spi要操作的芯片是OK的不会被其他的处理器给操作)

学长给我一个板子让我直接写代码我以为这就是我写程序的问题了,结果搞了几天都傻了就是没数据出来,只能第一次拿示波器抓波形看和芯片手册要求的一样不,结果波形很乱,我开始怀疑人生了(自从开始搞arm开始相信玄学了),最后有人提醒我那个flash芯片上电后可能被fpga默认给操作了(板子是arm+fpga)开始不跑程序直接测flash引脚,测完我就笑了,真的有信号那我写什么啊,找来fpga的小伙伴先飞一根线把fpga的屏蔽了,接下来终于拿到id了,开心一下

2.第一步解决片选是FF的问题

在获取片选ID的操作中,直接写一个字节读取三个ID就可以了,不需要写使能,需要注意的时在写1个字节读取三个字节过程中时序要完全符合芯片手册的要求就是片选必须一直处于拉低状态,我发现我先write,然后read片选会拉低拉高再拉低这样就读不到数据了,所以用spi_ioc_transfer封装好用ioctl进行读写操作就可以满足时序要求

static void print_chipID(int fd){
    unsigned char tempbuf[3] = {0};  
    unsigned char tempcmd = W25_CHIP_ID; //0x90  
    w25_write_read( fd, &tempcmd , sizeof(tempcmd ), tempbuf , 3);
    dis_array("chip_ID: ManufactureID  MemoryTypeID  CapacityID  ",  tempbuf , 3);
}

READ ID 时序要求

read_write读取id

ioctl读取id
上面两幅图片都是读取id时的偏序和始终时序(CLK CS),第一幅是用write1个字节read3个字节明显可以看到没在一个偏序拉低中不满足时序要求所以肯定读取不到数据,当使用ioctl时波形还是比较好的,这时应该可以拿到id了

3.最后一步,读取文件写到flash中

注意:

1.flash只可以由1写成0,所以在写前必须进行擦除操作,我是每次擦除4kb就是一个Sector

2.每次只可以写256字节,猜测原因是因为每个sector的一行只有256,看下面图片左上方一行是从xx0000h-xx00ffh刚好256个字节

3.每次也读取256个字节判断字节写入的数据是否正确

4.代码


具体的操作可以看代码(能力有限),在板子上测试ok,直接把一个小于8M的文件写到flash再读取出来,通过人眼看了一些数据暂时没有错误,有好的测试方法希望大神教教我一下

http://git.oschina.net/qianlilo/spi

5.总结

spi的操作还是简单,遇到问题必须快速定位问题所在,示波器是个很厉害的工具,网上的牛人现成的代码也很多,前人种树后人乘凉,谢谢那些乐于分享的牛人…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MicroBlaze是一个可配置的软核处理器,它可以嵌入在Xilinx的FPGA芯片中。要实现MicroBlaze对SPI闪存的读写,需要以下步骤: 首先,需要在MicroBlaze的代码中配置SPI控制器。这可以通过向MicroBlaze的配置寄存器入相应的数值来完成。配置寄存器包括SPI控制寄存器、SPI状态寄存器、SPI数据寄存器等。 其次,需要在初始化阶段设置SPI闪存的工作模式和参数,如通信速率、数据位宽等。这可以通过设置控制寄存器中的相应位来完成。 接下来,可以通过向SPI数据寄存器入数据来向SPI闪存发送命令。入的数据包括命令字节和地址字节,用于指定要读取或入的闪存位置。 当发送完命令后,通过监测SPI状态寄存器的位状态,可以确定数据是否已成功发送到SPI闪存。如果发送成功,则可以继续读取或入数据。 要从SPI闪存中读取数据,可以通过读取SPI数据寄存器中的数据来实现。读取数据前,需要等待SPI状态寄存器的相应位变为有效,表示数据已从闪存中读取到。 要向SPI闪存中入数据,可以通过向SPI数据寄存器入数据来实现。入数据前,需要等待SPI状态寄存器的相应位变为有效,表示该位置可入数据。 通过以上步骤,就可以实现MicroBlaze对SPI闪存的读写操作。在实际的应用中,需要根据具体的硬件平台和闪存器件的规格,进行相应的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值