Linux下写spiflash (有代码,代码,代码)
2017.6.18-2017.6.24: 由于需要给flash(W25Q64FV)写启动程序,刚开始在网上查了一下感觉很简单,就是open,write…就应该可以了,现实很残酷,遇到了好多问题,刚开始拿到的数据一直是FF,片选ID也是ff,这不是默认的拉高电平么,我就没写进去,看了芯片手册(不会硬件还要我做这个,也不知道理解的对不对)感觉操作的命令也正确啊,此时很彷徨
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);
}
上面两幅图片都是读取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的操作还是简单,遇到问题必须快速定位问题所在,示波器是个很厉害的工具,网上的牛人现成的代码也很多,前人种树后人乘凉,谢谢那些乐于分享的牛人…