第25章 串行FLASH文件系统FatFs (6)

11     sector+=1536;//扇区偏移,外部Flash文件系统空间放在外部Flash后面6M空间

12     BSP_QSPI_Read(buff, sector <<12, count<<12);

13     return RES_OK;

14 }

TM_FATFS_FLASH_SPI_disk_read函数有四个形参。lun为设备物理编号。buff是一个BYTE类型指针变量,buff指向用来存放读取到数据的存储区首地址。sector是一个DWORD类型变量,指定要读取数据的扇区首地址。count是一个UINT类型变量,指定扇区数量。

BYTE类型实际是unsigned char类型,DWORD类型实际是unsigned long类型,UINT类型实际是 unsigned int类型,类型定义在integer.h文件中。

开发板使用的QSPI Flash芯片型号为W25Q128FV,每个扇区大小为4096个字节(4KB),总共有16M字节空间,为兼容后面实验程序,我们只将后部分10MB空间分配给FatFs使用,前部分6MB空间用于其他实验需要,即FatFs是从6MB空间开始,为实现这个效果需要将所有的读写地址都偏移1536个扇区空间。

对于QSPI Flash芯片,主要是使用QSPI_FLASH_Read()实现在指定地址读取指定长度的数据,它接收三个参数,第一个参数为指定数据存放地址指针。第二个参数为指定数据读取地址,这里使用左移运算符,左移12位实际是乘以4096,这与每个扇区大小是息息相关的。第三个参数为读取数据个数,也是需要使用左移运算符。

扇区写入

代码清单 25-4 扇区输入

1 DRESULT TM_FATFS_FLASH_SPI_disk_write(

2     BYTE lun,//物理扇区,多个设备时用到(0...)

3     const BYTE *buff,//数据缓存区

4     DWORD sector, //扇区首地址

5     UINT count)//扇区个数(1..128)

6 {

7     uint32_t write_addr;

8     FLASH_DEBUG_FUNC();

9     sector+=1536;//扇区偏移,外部Flash文件系统空间放在外部Flash后面4M空间

10     write_addr = sector<<12;

11     BSP_QSPI_Erase_Block(write_addr);

12     BSP_QSPI_Write((uint8_t*)buff,write_addr,4096);

13     return RES_OK;

14 }

TM_FATFS_FLASH_SPI_disk_write函数有四个形参,lun为设备物理编号。buff指向待写入扇区数据的首地址。sector,指定要读取数据的扇区首地址。count指定扇区数量。对于QSPI Flash芯片,在写入数据之前需要先擦除,所以用到扇区擦除函数(BSP_QSPI_Erase_Block)。然后就是在调用数据写入函数(BSP_QSPI_Write)把数据写入到指定位置内。

其他控制

代码清单 25-5  其他控制

1 DRESULT TM_FATFS_FLASH_SPI_disk_ioctl(BYTE lun,BYTE cmd, void *buff)

2 {

3

4     FLASH_DEBUG_FUNC();

5     switch (cmd) {

6     case GET_SECTOR_COUNT:

7         *(DWORD * )buff = 2560; /* 扇区数量:2560*4096/1024/1024=10(MB) */

8         break;

9     case GET_SECTOR_SIZE :     /*获取扇区读写的大小(字)*/

10

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzsjd.html