zynq之TF卡写入常见问题
Posted electricdream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zynq之TF卡写入常见问题相关的知识,希望对你有一定的参考价值。
zynq之TF卡写入常见问题
1、基本原理
前面做过zynq的TF读写实验,使用串口返回了实验所需的现象。那个时候也没有深究头文件"ff.h"里的几个常用的函数。这次需要使用TF卡做实验时发现很多操作都不大一样,不能够简单的重复,这里把几个常见的问题列举出来,方便以后的查阅。
2、实际问题
先用一段完整的代码:
#include <stdio.h> #include "xil_printf.h" #include "xdevcfg.h" #include "xparameters.h" #include "ff.h" int SD_Init(void); int Sd_Test_Write(void); int main() { SD_Init(); Sd_Test_Write(); while(1) { ; } return 0; } static FATFS fatfs; int SD_Init() { FRESULT rc; rc = f_mount(&fatfs,"",0); if(rc) { return XST_FAILURE; } return XST_SUCCESS; } int Sd_Test_Write() { FIL fil; FRESULT rc; UINT br; const char src_str1[] = "t "; rc = f_open(&fil,"tesc.txt", FA_OPEN_ALWAYS | FA_WRITE); if(rc) { ; } rc = f_lseek(&fil, f_size(&fil)); rc = f_write(&fil,src_str1,sizeof(src_str1),&br); rc = f_lseek(&fil, f_size(&fil)); rc = f_write(&fil,"t/n",sizeof("t/n"),&br); //rc = f_sync(&fil); rc = f_close(&fil); }
代码中几个重要的部分如下:
SD_Init函数中的f_mount是启动SD卡的分区的,一般一次就足够了,可以获得SD卡的地址方便后面函数使用。其他的判断返回语句都是用于显示地址载入是否成功。f_mount同样可以用于注销工作区,f_mount(0,NULL)就可以注销0为根目录的工作区。
Sd_Test_Write函数中比较关键的函数有:f_open , f_lseek , f_write , f_sync,f_close , f_size;
(1)f_open
打开文件的,也可以用于创建文件,第一个参数是文件对象的地址,第二个是字符串名称,第三个是对应相关的模式。
FA_OPEN_ALWAYS:总是打开模式,有则打开,无则创建,反正要执行到底。
FA_OPEN_EXISTING:存在打开模式,有才打开,无则失败,需要确认有文件才执行。
FA_CREATE_NEW:创建新文件模式,无才创建,有则失败,需要确认没有文件才执行。
FA_CREATE_ALWAYS:总是创建模式,无则创建,有则覆盖创建(原文件被覆盖),反正要建新文件。
FA_WRITE:写模式,允许写入数据
FA_READ:读模式,允许读取数据
显然,前面四种模式是执行模式,后面两种是权限模式,执行和权限可以同时设置。
注意总是打开和总是创建的区别,两者最后都会生成一个文件,总是打开模式会留有已存文件,而总是创建模式只会出新文件。
(2)f_lseek
用于设置起始操作点,第一个参数还是文件对象的地址,第二个可以是数字表示长度,也可以是专门的文件大小的类。这里可以配合f_size(文件对象的地址)得到的文件长度来设置为文件尾为初始操作。
(3)f_write
用于写入数据的函数。第一个参数依旧是文件对象的地址,第二个是字符串或者数组地址(也可能有其他的,还没有遇到),第三个是字符长度,这里可以使用sizeof函数读取,第四个是无符号整型变量的地址,用于指针计数。第四个参数的作用暂时不清楚。
这里需要注意的是,在打开文件之后,如果进行多次的f_write操作,写入的字符串不能太大,否则容易出现乱码。也可以提高写入数据的长度(具体多大根据测试可知,一般需要提高到256的整数倍才可以避免乱码)。这也是f_write不好作为SD卡写入的函数的原因,容易浪费资源。找资料时发现可以使用f_printf,有时间再测试一下。
(4)f_sync
这个好像是一个用于检查的函数,写入失败可能会有一些提示,由于没有测试这个函数,就不好多解释了。参数也就是文件对象的地址。
(5)f_close
关闭文件。这个就一个参数,文件对象的地址。
test my_sd function! test my_sd function! test my_sd function! t t t t/n
这个是开头源码产生的文件的内容,可以参考一下(不完全是,还有其他操作的内容)。
3、概括小结
总结一下文件写操作的基本步骤:
创建工作区 == 打开移动存储卡
打开文件 == 打开文件(这里也可以通过转义字符实现目录的构建)
确认写入起点 == 鼠标点击某处
写入特定长度字符 == 键盘输入数据
检查文件 ==确认输入正确
关闭文件 == 关闭文件
关闭工作台 == 拔出移动存储卡
这就是写操作的基本流程与PC操作的基本流程的对应关系。
至于读操作,基本原理是一样的,就是将f_write换成f_read。两者的参数都是一样的,注意f_open的工作模式即可。注意存储数据需要使用字符串数组存储。
以上是关于zynq之TF卡写入常见问题的主要内容,如果未能解决你的问题,请参考以下文章