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