11 *(WORD * )buff = 4096; /*flash最小写单元为页,256字节,此处取2页为一个读写单位*/
12 break;
13 case GET_BLOCK_SIZE : /* 同时擦除扇区个数(双字) */
14 *(DWORD * )buff = 1; /*flash以1个sector为最小擦除单位*/
15 break;
16 case CTRL_TRIM:
17 break;
18 case CTRL_SYNC :
19 break;
20 }
21 return RES_OK;
22 }
TM_FATFS_FLASH_SPI_disk_ioctl函数有三个形参,lun为设备物理编号,cmd为控制指令,包括发出同步信号、获取扇区数目、获取扇区大小、获取擦除块数量等等指令,buff为指令对应的数据指针。
对于QSPI Flash芯片,为支持FatFs格式化功能,需要用到获取扇区数量(GET_SECTOR_COUNT)指令和获取擦除块数量(GET_BLOCK_SIZE)。另外,SD卡扇区大小为512字节,SPI Flash芯片一般设置扇区大小为4096字节,所以需要用到获取扇区大小(GET_SECTOR_SIZE)指令。
时间戳获取代码清单 25-6 时间戳获取
1 __weak DWORD get_fattime(void)
2 {
3 /* 返回当前时间戳 */
4 return ((DWORD)(2015 - 1980) << 25) /* Year 2015 */
5 | ((DWORD)1 << 21) /* Month 1 */
6 | ((DWORD)1 << 16) /* Mday 1 */
7 | ((DWORD)0 << 11) /* Hour 0 */
8 | ((DWORD)0 << 5) /* Min 0 */
9 | ((DWORD)0 >> 1); /* Sec 0 */
10 }
get_fattime函数用于获取当前时间戳,在ff.c文件中被调用。FatFs在文件创建、被修改时会记录时间,这里我们直接使用赋值方法设定时间戳。为更好的记录时间,可以使用控制器RTC功能,具体要求返回值格式为:
q bit31:25 ——从1980至今是多少年,范围是 (0..127) ;
q bit24:21 ——月份,范围为 (1..12) ;
q bit20:16 ——该月份中的第几日,范围为(1..31) ;
q bit15:11——时,范围为 (0..23);
q bit10:5 ——分,范围为 (0..59);
q bit4:0 ——秒/ 2,范围为 (0..29) 。
25.3.5 FatFs功能配置ffconf.h文件是FatFs功能配置文件,我们可以对文件内容进行修改,使得FatFs更符合我们的要求。ffconf.h对每个配置选项都做了详细的使用情况说明。下面只列出修改的配置,其他配置采用默认即可。
代码清单 257 FatFs功能配置选项
1 #define _USE_MKFS 1
2 #define _CODE_PAGE 936
3 #define _USE_LFN 2
4 #define _VOLUMES 3
5 #define _MIN_SS 512
6 #define _MAX_SS 4096
1) _USE_MKFS:格式化功能选择,为使用FatFs格式化功能,需要把它设置为1。
2) _CODE_PAGE:语言功能选择,并要求把相关语言文件添加到工程宏。为支持简体中文文件名需要使用“936”,正如在图 256的操作,我们已经把cc936.c文件添加到工程中。
3) _USE_LFN:长文件名支持,默认不支持长文件名,这里配置为2,支持长文件名,并指定使用栈空间为缓冲区。
4) _VOLUMES:指定物理设备数量,这里设置为3,包括预留SD卡和qSPI Flash芯片。