本文主要介紹在zynq中通過xilffs庫讀寫sd卡的乙個例子,並給出在使用中遇到的問題在xilinx sdk的standalone已移植好了fatfs庫(sdk中叫做xilffs),所以在sdk中新增xilffs庫後就可以在程式中使用fatfs中各api來操作sd卡,該庫支援fat12, fat16 and fat32檔案系統(本例將sd卡格式化為fat32)。fatfs api詳細說明可檢視
zynq中ps部分已經整合了sd卡控制器,在ps部分需要開啟sd卡控制器,並配置對應管腳(取決於開發板),本人用的開發板ps部分配置如下圖
綜合實現生成.bit後匯出,lautch sdk進入sdk新建工程和bsp,由於用了xilffs庫所以在bsp中需要選擇開啟xilffs,如下圖
對於xilffs的設定如下圖
enable_mmc選擇false;fs_inte***ce選擇1;read_only選擇false。可以參考後面description描述來設定。本例使用如上預設配置即可。
c程式如下:
注意:由於使用了/*
* main.c
* * created on: 2023年8月20日
* author: hsp
* 本檔案實現sd寫入一段字串,然後從其中讀出並列印到串列埠。
* */
#include
#include "platform.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "ff.h"
#include "xdevcfg.h"
static fatfs fatfs;
int sd_init()
return xst_success;
}int sd_transfer_read(char *filename,u32 destinationaddress,u32 bytelength)
rc = f_lseek(&fil, 0);
if(rc)
rc = f_read(&fil, (void*)destinationaddress,bytelength,&br);
if(rc)
rc = f_close(&fil);
if(rc)
return xst_success;
}int sd_transfer_write(char *filename,u32 sourceaddress,u32 bytelength)
rc = f_lseek(&fil, 0);
if(rc)
rc = f_write(&fil,(void*) sourceaddress,bytelength,&bw);
if(rc)
rc = f_close(&fil);
if(rc)
return xst_success;
}#define file "test.txt"
int main()
strlen
函式需要#include
;使用了fatfs api所以要#include "ff.h"
;使用了xst_success
之類的巨集定義作為返回值所以要#include "xdevcfg.h"
。
關於檔名
剛開始定義#define file "husipeng_test.txt"
,每次執行在開啟檔案時返回6即fr_invalid_name
,也就是說檔名無效,查詢api庫path names頁面,再看檔案ffconf.h中有定義#define _fs_rpath 0u
;即檔名不能用子目錄而且為8.3 format file name (sfn)
格式,也就說檔名只能為:<8個字元+.+<3字元方式,所以這裡定義的檔名太長才引起的錯誤,所以改為#define file "test.txt"
這樣的短檔名即可解決這個問題。
關於寫保護
解決了以上檔名錯誤後,發現本次開啟檔案返回10即fr_write_protected
,也就是sd卡開啟了寫保護,本人開發板上使用的小卡且也沒有寫保護的設定管腳。最後發現直接在ps部分sd卡設定裡將wp取消選擇即可(改正後設定如上面ps部分設定圖中所示),出錯原因應該是開發板上沒有寫保護管腳相關的設定,而開始在ps中又設定了wp管腳並設定到了乙個mio管腳,這將導致對寫保護的誤判;wp管腳需要拉低才能取消寫保護,才能寫sd卡,所以也可以將sd控制器的wp管腳連到emio,然後在pl部分將此emio拉低即可;而這裡選擇使用前面不連線wp的方法。
關於檔案長度
zynq中通過xilffs讀寫SD卡
在xilinx sdk的standalone已移植好了fatfs庫 sdk中叫做xilffs 所以在sdk中新增xilffs庫後就可以在程式中使用fatfs中各api來操作sd卡,該庫支援fat12,fat16 and fat32檔案系統 本例將sd卡格式化為fat32 fatfs api詳細說明可...
zynq通過ps呼叫user ip
新建vivado工程 新增user ip路徑 新建bd檔案 新增zynq system ip並配置 新增自定義ip 連線 clk i fclk clk0 rstn i fclk reset0 n led 0 選中右擊make external改名為led 0 generate output 生成bi...
zynq中mgtx應用 ZYNQ中斷體系
arm中斷體系 01 arm體系中,在儲存位址的低位,固化了乙個32位元組的硬體中斷向量表。異常中斷發生時,程式計數器pc所指的位置不同,異常中斷就不同。中斷結束後,中斷不同,返回位址也不同。但是,對於系統復位中斷,不需要返回,因為整個應用系統就是從復位中斷中開始的。快速中斷請求 外部引腳的快速中斷...