OpenEdv-开源电子网

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

关于W25q128的读写地址范围问题

[复制链接]

53

主题

126

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-6-1
在线时间
37 小时
发表于 2016-7-20 12:04:26 | 显示全部楼层 |阅读模式
5金钱
请问一下,针对战舰板的spi实验,W25q128的读写地址是0~16M,还是0~128M呢?程序中有定义变量u32 flash_size=128*1024*1024;  然后往这个变量减去100的地址中读写字符串,共有21个字符。
128M是位地址,16M是字节地址
奇怪的是,程序运行居然是正常的。

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-7-20 12:04:27 | 显示全部楼层
回复

使用道具 举报

53

主题

126

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2013-6-1
在线时间
37 小时
 楼主| 发表于 2016-7-21 11:22:58 | 显示全部楼层
谢谢!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-10-9
在线时间
5 小时
发表于 2016-10-9 22:22:53 | 显示全部楼层
本帖最后由 bjmsnysw 于 2016-10-9 22:24 编辑

0-16M,可是改为从倒数10的地址开始写,为什么读出也会有那么多字节呢?(读的时候也是从倒数10开始读的)。原子在吗?
        while(1)
        {
                key=KEY_Scan(0);
                if(key==KEY1_PRES)        //KEY1按下,写入W25QXX
                {
                        LCD_Fill(0,170,239,319,WHITE);//清除半屏   
                        LCD_ShowString(30,170,200,16,16,"Start Write W25Q128....");
                        W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-10,SIZE-1);                        //从倒数第100个地址处开始,写入SIZE长度的数据
                        LCD_ShowString(30,170,200,16,16,"W25Q128 Write Finished!");        //提示传送完成
                }
                if(key==KEY0_PRES)        //KEY0按下,读取字符串并显示
                {
                        LCD_ShowString(30,170,200,16,16,"Start Read W25Q128.... ");
                        W25QXX_Read(datatemp,FLASH_SIZE-10,SIZE-2);                                        //从倒数第100个地址处开始,读出SIZE个字节
                        LCD_ShowString(30,170,200,16,16,"The Data Readed Is:  ");        //提示传送完成
                        LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串
                }
                i++;
                delay_ms(10);
                if(i==20)
                {
                        LED0=!LED0;//提示系统正在运行       
                        i=0;
                }       

回复

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-24 15:47:07 | 显示全部楼层

请问W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);                       
为什么要从倒数100个bit位置的地址开始写呢??是规定的??
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2016-7-10
在线时间
23 小时
发表于 2019-8-4 20:53:42 | 显示全部楼层
本帖最后由 丁柏文 于 2019-8-5 10:20 编辑

是16*1024*1024
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-8-5
在线时间
6 小时
发表于 2019-8-5 09:28:19 | 显示全部楼层
都不看手册的吗,地址范围是0x00000000~0x00FFFFFF,一算就知道容量了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2020-4-13
在线时间
3 小时
发表于 2020-4-28 10:52:56 | 显示全部楼层

所以FLASH_SIZE就不是字节大小,那它除4096怎么得到的扇区号?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-10-26
在线时间
8 小时
发表于 2021-12-28 16:50:15 | 显示全部楼层
1、u32 flash_size=128*1024*1024 为什么会正常呢?而不是u32 flash_size=16*1024*1024

2、在FATS中W25Q128读函数为void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)  
传递的内容是W25QXX_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
定义的大小是#define FLASH_SECTOR_SIZE         512        ;
                                  FLASH_SECTOR_COUNT=2048*12
这样的话FATS中sector*FLASH_SECTOR_SIZE最大值就是        12*1024*1024


FATS中对W25Q128地址范围操作和单独W25Q128操作定义范围规律有啥区别?


回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-9-21
在线时间
1 小时
发表于 2022-6-28 20:18:02 | 显示全部楼层
FLASH_SIZE=128*1024*1024;这里的128是位地址,可以确定的是正点原子这里没有说明白,但不能算错;把128改为16这才是字节地址,跟后边计算擦除哪个扇区才相得映彰,各位可以试一下,把128改为16,提示擦除的扇区就是4095;因为W25Q128一共有4096个扇区,主函数中用的倒数的地址,自然是第4095个扇区。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 15:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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