zoukankan      html  css  js  c++  java
  • ZYNQ7000系列学习之TF卡读写(2)

    ZYNQ读写实验(2)

    1、实验原理

    在TF卡读写实验1中,已经将每一个步骤都做完了,但是最后得到的结果是错误的。那个时候由于TF没有格式化,显示的是错误信息。在格式化后,再次实验,得到了预期的结果。此外,本人使用的开发板不具备SD卡的读写能力。

    在这个基础上,通过在C语言的代码上进行修改,可以完成对TF读写操作的认识,为后续实现TF卡设计各种功能提供基础。

    2、实验操作

    阅读代码

    想要修改代码,首先要看懂代码。而看代码,自然可以从结果向前逆向。

    先看主函数main

    int main()
    {
    init_platform();
    print("zynq_sd_card_fatfs-test 
    ");
    SD_Init();
    Sd_Test_Write();
    Sd_Test_Read();
    while(1)
    {
    ;
    }
    cleanup_platform();
    return 0;
    }

    开始和结尾都是platform的操作,可以作为模块保留。

    第二局语句是打印一段信息。

    然后是三个功能函数和一个无限等待。重点的功能是是这三个函数。

     1 int SD_Init()
     2 {
     3 FRESULT rc;
     4 rc = f_mount(&fatfs,"",0);
     5 if(rc)
     6 {
     7 xil_printf("ERROR: f_mount returned %d
    ",rc);
     8 return XST_FAILURE;
     9 }
    10 return XST_SUCCESS;
    11 }
    12 int Sd_Test_Write()
    13 {
    14 FIL fil;
    15 FRESULT rc;
    16 UINT br;
    17 const char src_str1[] = "hsp test sd card write and read line1 string. if you see this message,sd_card fatfs test ok!
    ";
    18 rc = f_open(&fil,"test.txt",FA_WRITE|FA_CREATE_NEW);
    19 if(rc)
    20 {
    21 xil_printf("ERROR : f_open returned %d
    ",rc);
    22 return XST_FAILURE;
    23 }
    24 rc = f_write(&fil,src_str1,sizeof(src_str1),&br);rc = f_sync(&fil);
    25 rc = f_close(&fil);
    26 }
    27 int Sd_Test_Read()
    28 {
    29 FIL fil;
    30 FRESULT rc;
    31 UINT br;
    32 const char src_str[4096]={0};
    33 rc = f_open(&fil,"test.txt",FA_READ);
    34 if(rc)
    35 {
    36 xil_printf("ERROR : f_open returned %d
    ",rc);
    37 return XST_FAILURE;
    38 }
    39 rc = f_lseek(&fil, 0);
    40 rc = f_read(&fil,src_str,4096,&br);
    41 xil_printf(src_str);
    42 rc = f_close(&fil);
    43 }

    第一个函数先是使用FRESULT 申明了一个变量rc,从后面看好像还是整形的。使用f_mount得到一个返回值,用于判断初始化。rc为0时初始化成功。

    这是在写入一次数据后再次写入数据时所得到的实验结果。可以看到,init的目的是判断TF卡内部是否有数据。

    然后看一下Sd_Tset_write,这个函数定义了四个变量:FIL型,FRESULT型,UINT型和一个const char型数组。rc的作用和前面一样,就是判断某个函数是否成功执行。FIL则是获取地址的变量。br也是同样的作用。

    然后看一下函数的功能。f_open,应该是新建文件。其中有文件名和文件格式。f_write,则是写入内容。他们联系的地方就是fil,这个变量可能具有标识作用。然后就是f_close,关闭文件。这是一次写操作。

    后面就是Sd_Test_Read,从函数名可以看出这是一个读操作。同样是先用f_open打开文件。返回0则成功。然后是f_lseek,感觉这个函数是在寻找读取点。然后使用f_read读取数据,最后使用printf打印数据,显示在主机。然后使用f_close关闭文件。

    这个程序还是比较标准的,阅读起来的问题也不是很大。

    改写代码:

    通过简单的尝试,代码改写需要找到相应库函数的定义,这里好像不大好做。以后有时间找到相应的资料再做吧。

    3、实验结果

    大体了解了ff.h的库函数,了解C在实现硬件功能时的工作原理。

  • 相关阅读:
    不写helloworld总觉得哪里似乎不对之javascript
    SQl中drop与truncate的区别
    对MarshalByRefObject的讲解(转自DuDu)
    “模态子窗体关闭后,父窗体也关闭”解决方案
    ENVI5.0 32位工具栏图标不显示解决办法
    HTML5的基础写法
    查询远程服务器数据
    javascript变量、作用域和内存问题
    javascript基本概念
    让应用程序具体相应权限
  • 原文地址:https://www.cnblogs.com/electricdream/p/12966533.html
Copyright © 2011-2022 走看看