准备工作:
1. 准备SPI接口的SD读卡模块。KE02和读卡模块之间通过SPI进行通信,需要连接电源和SPI通信的四根线。另外还需要一个GPIO用以检测卡座的CD引脚,CD是Card Detection的意思,当SD卡插入时,CD引脚会对地短路,因此将CD引脚通过电阻上拉后,就可以检测CD引脚的电平来判断是否有SD卡插入啦。
2. 下载FatFs官网的移植sample,ffsample.zip。压缩包里有很多已经移植好的sample源码,我们只用在此基础上进行修改,就可以很快完成移植工作啦。
3. 下载NXP官方KE驱动库,KEXX_DRIVERS_V1.2.1_DEVD.zip。我们需要通过此驱动库新建工程,并且驱动库函数对单片机的寄存器进行了抽象,能够大大提高代码的可读性。
4. 连接硬件。需要连接的有3.3V电源,SPI和CD引脚,本实验中使用固定的SPI0模块,在FRDM-KE02Z40M上使用SPI0的引脚分别为,PTE0_SPI0_SCK, PTE1_SPI0_MOSI, PTE2_SPI0_MISO, PTE3_SPI0_SS。另外,通过PTD2来检测CD引脚。
开始移植:
1. 新建工程
-解压KE驱动库,通过make_new_project_ke02.exe工具,只用输入工程名字,就能新建属于自己的工程啦。
-工具所在目录为..KEXX_DRIVERS_V1.2.1_DEVDkexx_drv_libbuildiarke02make_new_project_ke02.exe。
2. 添加FatFs文件
-解压FatFs的官方移植Sample,里边会有很多单片机移植的sample。鉴于我上学时一直使用的STM32,对STM32相当熟悉,因此就从STM32的sample开始啦。
-在stm32的sample文件夹下有很多文件,但实际我们移植所需要的文件只有:mmc_32f1.c, integer.h, ffconf.h, ff.h, ff.c, diskio.h 六个文件。由于本实验使用的MCU为KE02,因此将mmc_32f1.c重新命名为mmc_ke02.c。完成后将这六个文件复制并添加到我们新建的工程中去。
-需要注意,在添加文件完成后,我们也需要将文件所在的目录添加到预编译处理时的包含目录里,这样才能正常通过编译。
3. 修改mmc_ke02.c文件
需要修改的部分有:
-SPI的通信速率宏定义:FCLK_SLOW和FCLK_FAST
-片选信号的控制:CS_HIGH和CS_LOW
-SPI的初始化宏定义,SPIxENABLE(),这里我直接使用了SPI的初始化函数替代了原来的宏定义
-修改头文件:STM32F100.h改为common.h,并添加其他一些用到的外设的头文件,spi.h, sim.h, gpio.h
-修改延时:原sample里,使用Timer1和Timer2两个变量来判断延时,并通过定时器的1ms中断调用disk_timerproc()函数对Timer1和Timer2两个变量进行控制。我们可以直接简化程序,直接使用while循环来进行延时。延时需要修改的地方比较多,修改后需要仔细确认程序的逻辑没有问题。
-修改SPI底层函数:xchg_spi(), rcvr_spi_multi(), xmit_spi_multi()
-添加get_fattime()空函数,或在ffconf.h中将_FS_NORTC宏定义的0改为1
经过上面的步骤,程序就已经可以编译通过啦。
4. 修改主函数,添加测试代码
-主函数需要添加ff.h头文件,接下来就可以使用FatFs函数啦。