OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7340|回复: 7

求助,关于SPI Flash部分功能无法实现

[复制链接]

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
发表于 2015-7-13 11:24:23 | 显示全部楼层 |阅读模式
5金钱

本来自己写了一个w25q128的驱动,结果怎么也不行,总是死在等待中,后来反复看原子哥的代码,发现原子的代码中每一个操作前操作后都要开关Flash的片选,我之前还以为是省电或者抗干扰什么的,于是我就写了一个先关片选再开片选的函数,并加在每条不同的操作前,居然成功了!原来每次换操作之前都要用片选“重启”一次Flash呀,虽然不明白为什么,但是好歹成功了,于是再试试其他功能。我想在Flash中写入一个字符串,然后读出来(这里应该一致的吧),然后再执行全片擦除操作,完成后再读出来(这里应该是全部0xff的才对吧?),结果出现各种问题。我觉得可能是我的代码有问题,于是再例程上再跑一遍,因为例程的代码总比自己的要可靠吧,结果一试还是有问题,我真是晕了。。。。。。现在把代码贴上来请大家看看,仅仅只改了例程的主函数,直接覆盖探索者SPI例程的main就可以了。

[mw_shl_code=c,true]int main(void) { char nihao[]={"ABCDEFG123456"}; char Nihao[sizeof nihao]; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(168); uart_init(115200); LED_Init(); LCD_Init(); KEY_Init(); W25QXX_Init(); printf("初始化完成\n"); //弹出【初始化完成】 W25QXX_Write((u8 *)nihao,0x12345678,sizeof nihao); //在地址0x12345678写入字符【ABCDEFG123456】 W25QXX_Read ((u8 *)Nihao,0x12345678,sizeof nihao); //在同样的地址中读出同样长度的数据 printf("芯片ID: %X\n",W25QXX_ReadID()); //为什么弹出【初始化完成】后会有时很长时间(几十秒)才能读出ID?而有时候会很快(0.x秒)? printf("%s\n",Nihao); //读出来的是【??????????????】 printf("%X\n",Nihao); //读出来的是【20001750】 W25QXX_Erase_Chip(); //芯片擦除 W25QXX_Read ((u8 *)Nihao,0x12345678,sizeof nihao); printf("%X\n",Nihao); //为什么读出来的还是【20001750】?不是已经芯片擦除了吗? //另外貌似在Flash全片擦除时复位单片机会发生严重错误? while(1); //为什么芯片擦除后芯片内容不是变成0xff而是0x3f(在字符串中是【?】)?并且每隔4096个【?】会出现318个字符的乱码? }[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

你这地址已经超过SPI FLASH的范围了,你的flash才16M,你看看你这个地址多大? 不过这个问题不大,超过了低位地址有效,高位直接被阉了。 怀疑问题出在其他地方,你直接在我们开发板上,修改代码测试下试试吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-13 11:24:24 | 显示全部楼层
你这地址已经超过SPI FLASH的范围了,你的flash才16M,你看看你这个地址多大?
不过这个问题不大,超过了低位地址有效,高位直接被阉了。
怀疑问题出在其他地方,你直接在我们开发板上,修改代码测试下试试吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2015-7-13
在线时间
15 小时
发表于 2015-7-13 11:28:55 | 显示全部楼层
20001750这个数字更像是RAM地址
工业4.0的节奏
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2015-7-13 11:37:56 | 显示全部楼层
w25q128  一页是多少个字节啊
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
 楼主| 发表于 2015-7-13 11:38:52 | 显示全部楼层
我去,不知道什么状况,等了好长时间复位一次看看,又好了!只是好了一部分,再复位一次又不行了。。。

回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
 楼主| 发表于 2015-7-13 12:00:55 | 显示全部楼层
回复【3楼】止天:
---------------------------------
w25q128有256个块,每个块有16个扇区,每个扇区有4096字节,共计16MB。没有页这么一说。这里容量分块问题原子哥的pdf和代码注释冲突了~~
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2015-1-28
在线时间
44 小时
 楼主| 发表于 2015-7-14 10:28:26 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
谢谢原子哥的指点,现在一切正常了,读ID速度保持很快,能够正确读出内容,全片擦除操作也起作用了!
现在唯一的问题是全片擦除后,任意读3个地址的内容,都被擦除成了0x3F?
我觉得全片擦除的话应该是擦成0xff才对吧?虽然起作用了,但好像不是那么回事。。
难道这个功能确实是擦成0x3f吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-7-14 23:03:01 | 显示全部楼层
回复【7楼】琉璃:
---------------------------------
肯定是0XFF才对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 20:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表