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在实现硬件功能时的工作原理。