OpenEdv-开源电子网

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

W25Q128挂载了文件系统FAFTS只显示有8M?

[复制链接]

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
发表于 2022-4-14 10:08:19 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 JUSTDY 于 2022-4-14 10:11 编辑

使用W25Q64的时候显示是正常的,但使用的是W25Q128,调试的时候读取存储类型也是对的,但是文件系统读出来是下面的
  1. //得到磁盘剩余容量
  2. //drv:磁盘编号("0:"/"1:")
  3. //total:总容量         (单位KB)
  4. //free:剩余容量         (单位KB)
  5. //返回值:0,正常.其他,错误代码
  6. u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
复制代码

total:8172 KB  free: 8164 KB  odd 99.902105:创建目录:1:/DATA-16
下面是定义

  1. #define SD_CARD         0  //SD卡,卷标为0
  2. #define EX_FLASH 1        //外部flash,卷标为1

  3. #define FLASH_SECTOR_SIZE         512               
  4. #define FLASH_TOTAL_SIZE         16   //M               
  5. //对于W25Q64
  6. //前4.8M字节给fatfs用,4.8M字节后~4.8M+100K给用户用,4.9M以后,用于存放字库,字库占用3.09M.                                             
  7. u16            FLASH_SECTOR_COUNT= 2048*FLASH_TOTAL_SIZE;        //4.8M字节,默认为W25Q64
  8. #define FLASH_BLOCK_SIZE           8             //每个BLOCK有8个扇区

  9. //初始化磁盘
  10. DSTATUS disk_initialize (
  11.         BYTE pdrv                                /* Physical drive nmuber (0..) */
  12. )
  13. {
  14.         u8 res=0;            
  15.         switch(pdrv)
  16.         {
  17.                 case SD_CARD://SD卡
  18.                         res = SD_Initialize();//SD_Initialize()
  19.                          if(res)//STM32 SPI的bug,在sd卡操作失败的时候如果不执行下面的语句,可能导致SPI读写异常
  20.                         {
  21.                                 SD_SPI_SpeedLow();
  22.                                 SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟
  23.                                 SD_SPI_SpeedHigh();
  24.                         }
  25.                           break;
  26.                 case EX_FLASH://外部flash
  27.                         W25QXX_Init();
  28.                         FLASH_SECTOR_COUNT=2048*FLASH_TOTAL_SIZE;//W25Q1218,前12M字节给FATFS占用
  29.                         break;
  30.                 default:
  31.                         res=1;
  32.         }                 
  33.         if(res)return  STA_NOINIT;
  34.         else return 0; //初始化成功
  35. }  

  36. //获得磁盘状态
  37. DSTATUS disk_status (
  38.         BYTE pdrv                /* Physical drive nmuber (0..) */
  39. )
  40. {
  41.         return 0;
  42. }

  43. //读扇区
  44. //drv:磁盘编号0~9
  45. //*buff:数据接收缓冲首地址
  46. //sector:扇区地址
  47. //count:需要读取的扇区数
  48. DRESULT disk_read (
  49.         BYTE pdrv,                /* Physical drive nmuber (0..) */
  50.         BYTE *buff,                /* Data buffer to store read data */
  51.         DWORD sector,        /* Sector address (LBA) */
  52.         UINT count                /* Number of sectors to read (1..128) */
  53. )
  54. {
  55.         u8 res=0;
  56.     if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误                          
  57.         switch(pdrv)
  58.         {
  59.                 case SD_CARD://SD卡
  60.                         res=SD_ReadDisk(buff,sector,count);         
  61.                          if(res)//STM32 SPI的bug,在sd卡操作失败的时候如果不执行下面的语句,可能导致SPI读写异常
  62.                         {
  63.                                 SD_SPI_SpeedLow();
  64.                                 SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟
  65.                                 SD_SPI_SpeedHigh();
  66.                         }
  67.                         break;
  68.                 case EX_FLASH://外部flash
  69.                         for(;count>0;count--)
  70.                         {
  71.                                 W25QXX_Read(buff,sector*FLASH_SECTOR_SIZE,FLASH_SECTOR_SIZE);
  72.                                 sector++;
  73.                                 buff+=FLASH_SECTOR_SIZE;
  74.                         }
  75.                         res=0;
  76.                         break;
  77.                 default:
  78.                         res=1;
  79.         }
  80.    //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
  81.     if(res==0x00)return RES_OK;         
  82.     else return RES_ERROR;          
  83. }
复制代码


最佳答案

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

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-4-14 10:08:20 | 显示全部楼层
JUSTDY 发表于 2022-6-22 19:23
没有的  然后我用探索者实验板测试例程 实验30 汉字显示实验 ,

打印效果:

格式化后OK
回复

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2070
金钱
2070
注册时间
2021-7-17
在线时间
647 小时
发表于 2022-4-14 10:31:44 | 显示全部楼层
文件系统读取外部SD卡试试
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-4-14 10:57:21 | 显示全部楼层
ChenRyan 发表于 2022-4-14 10:31
文件系统读取外部SD卡试试

这个准的
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2022-4-14 10:58:21 | 显示全部楼层
看着你这里的程序逻辑没看出来什么问题,可以再多试试其他的,比如像SD卡或者U盘来测试看下
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-14 14:19:31 | 显示全部楼层
看看你的flash读取出来的 ID 是什么
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-4-14 15:38:04 | 显示全部楼层
245925587 发表于 2022-4-14 14:19
看看你的flash读取出来的 ID 是什么

0XEF17  对应128
回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6719
金钱
6719
注册时间
2017-4-12
在线时间
1257 小时
发表于 2022-4-14 16:17:09 | 显示全部楼层

这样就只能检查代码了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-4-14 23:13:35 | 显示全部楼层
把SPI FLASH全片擦除,然后重新格式化一下
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2022-4-15 09:57:03 | 显示全部楼层
数据类型好像小了
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-4-23 10:05:36 | 显示全部楼层
远命 发表于 2022-4-15 09:57
数据类型好像小了

哪里的
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-4-23 10:05:59 | 显示全部楼层
正点原子 发表于 2022-4-14 23:13
把SPI FLASH全片擦除,然后重新格式化一下

这个格式化过了,不起作用
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-4-24 00:00:38 | 显示全部楼层
JUSTDY 发表于 2022-4-23 10:05
这个格式化过了,不起作用

u16            FLASH_SECTOR_COUNT
看看你后面是怎么传递这个参数的,这个最大值只能是65536,你后面没有做*法了吧?
因为 2048*16=32768了,再乘就越界了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

23

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2018-8-12
在线时间
100 小时
 楼主| 发表于 2022-6-22 19:23:17 | 显示全部楼层
正点原子 发表于 2022-4-24 00:00
u16            FLASH_SECTOR_COUNT
看看你后面是怎么传递这个参数的,这个最大值只能是65536,你后面没 ...

没有的  然后我用探索者实验板测试例程 实验30 汉字显示实验 ,
  1. int main(void)
  2. {      
  3.         u32 total,free;  
  4.         u32 fontcnt;                  
  5.         u8 i,j;
  6.         u8 fontx[2];//gbk码
  7.         u8 key,t;
  8.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  9.         delay_init(168);  //初始化延时函数
  10.         uart_init(115200);                //初始化串口波特率为115200
  11.         LED_Init();                                        //初始化LED  
  12.         LCD_Init();                                        //LCD初始化  
  13.         KEY_Init();                                        //按键初始化  
  14.         W25QXX_Init();                                //初始化W25Q128
  15.         usmart_dev.init(168);                //初始化USMART
  16.         my_mem_init(SRAMIN);                //初始化内部内存池
  17.         my_mem_init(SRAMCCM);                //初始化CCM内存池
  18.         exfuns_init();                                //为fatfs相关变量申请内存  
  19.           f_mount(fs[0],"0:",1);                 //挂载SD卡
  20.         f_mount(fs[1],"1:",1);                 //挂载FLASH.
  21.         while(exf_getfree("1:",&total,&free))        //得到SD卡的总容量和剩余容量
  22.         {
  23.                 printf("Flash Fatfs Error!");
  24.                 delay_ms(200);
  25.         }
  26.         printf("total:%d KB  free: %d KB  odd %f:",total,free,free*100.0/total);        //格式化完成       
复制代码


打印效果:
  1. [19:16:00.021]收←◆ LCD ID:5510

  2. [19:16:00.053]收←◆total:12264 KB  free: 12260 KB  odd 99.967384:
复制代码


明显也是不对的10M用于FAFTS的话  打印出来12264KB = 11.97M   对不上
我试了改动
  1. #define SD_CARD         0  //SD卡,卷标为0
  2. #define EX_FLASH 1        //外部flash,卷标为1

  3. #define FLASH_SECTOR_SIZE         512                          
  4. //对于W25Q128
  5. //前10M字节给fatfs用,10M字节后,用于存放字库,字库占用3.09M.        14M字节以后,给客户自己用                                     
  6. u16            FLASH_SECTOR_COUNT=2048*10;        //W25Q1218,前10M字节给FATFS占用
  7. #define FLASH_BLOCK_SIZE           8             //每个BLOCK有8个扇区
复制代码


FLASH_SECTOR_COUNT 全局搜索这个变量,都改动了 发现打印的大小都是对不上的。求解答
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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