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卡写入常见问题的主要内容,如果未能解决你的问题,请参考以下文章

ZYNQ7000系列学习之TF卡读写实验

恢复安装过树莓派相关操作系统的TF卡容量

关于TF卡

荔枝派nano初体验-windows写入镜像到TF卡启动

如何让orangepi zero支持从u盘启动

ZYNQ之FPGA学习----FIFO IP核使用实验