FPGA上實現SD卡連續多塊讀的命令

在FPGA上實現SD卡連續多塊讀的命令

CMD17命令一次只能讀取1個塊

CMD18命令一次可以連續讀取多個塊,直到停止命令CMD12

CMD18命令讀的塊數程序可任意設置

目錄

前言

一、SD卡多塊讀命令CMD18

二、停止讀命令CMD12

三、SD卡初始化+SD卡連續塊讀操作的verilog代碼

總結


前言

? ? ? ? 在用FPGA驅動LCD顯示屏播放視頻時,視頻數據是存到SD卡里面的,播放視頻對數據量的讀需求非常大。如果用單塊讀CMD17命令顯然無法滿足我屏幕320*320的分辨率單像素16bit 24幀的需求,因為實測發現SD卡每次發單塊讀CMD17命令后,中間都要等很長一段時間,SD卡才會開始返回數據,這個等的時間比返回512個字節的時間還要多。所以得發送CMD18命令,改命令發一次可以連續讀取多個塊,直到發送停止命令CMD12,SD卡停止讀,這樣方可滿足播放視頻的需求。以下內容是對SD卡連續多塊讀操作的說明,同時也給出了相應的時序波形圖,方便理解。


提示:以下是本篇文章正文內容,均為作者本人原創,寫文章實屬不易,希望各位在引用時附上本文鏈接。

一、SD卡多塊讀命令CMD18

? ? ? ? 關于SD的初始化,單塊讀寫操作見文章,基于FPGA的SD卡音樂播放器之SD卡篇_sdio verilog-CSDN博客本文不再敘述。

CMD18命令芯片手冊描述如下:

可見,發一次命令返回多個塊,發送CMD18命令格式如下:

cmd_rd <= {8'h52,rd_sec_addr_buf,8'hff}; ? ?//寫入連續讀多個快CMD18

其中rd_sec_addr_buf是讀的32位起始扇區地址,由于SD卡在SPI模式下默認不開啟CRC校驗,所以校驗字節直接填的8'hff。發完命令后等8bit R1的響應,正常情況下響應的8bit為全0,然后準備開始解析SD卡返回的數據頭0xfe, 解析到數據頭0xfe后,接下來接收SD卡返回的512個字節的數據,緊接著又會有下一塊,依然是先解析到數據頭0xfe后,再接收SD卡返回的512個字節的數據,如此循環直到發送CMD12這個停止命令。由此可見一次讀多少個塊是由主機什么時候發停止命令決定的。為了方便,我在編程的時候定義了一個參數,即一次連續讀多少個塊,讀夠后即發送停止命令,該參數可隨意設置,設置成1就和單塊讀沒區別。

該命令的實測波形圖如下,注意由于MISO下降沿穩定,所以ILA抓取時注意用clk的下降沿取抓數據

觀察這張波形圖,就能明白為什么我開始說的發命令后等的時間比返回512個字節的時間還要多了。放大發命令的部分如下圖所示,可見發完命令后,SD卡會返回R1數據8‘h00。

返回數據部分放大如下:

下面是抓取的解析后的數據,解析時是每兩個字節湊成16bit,和winhex中的數據完全對得上。

下圖是兩個塊交界處的時序,可見第一個塊數據返回完后,會接著有兩字節的CRC,然后又去解析FE,之后便是下一個塊的數據。

可見塊連續讀,一個塊的數據返回完后,過24個CLK(圖中9793-9769,2個FF+1個FE)就會接著返回下一個塊的數據,比單塊讀效率高多了。

二、停止讀命令CMD12

CMD12命令芯片手冊描述如下:

R1b和R1類似,只是其帶有忙信號。發送CMD18命令格式如下:

cmd_rd <= {8'h4C,32'b0,8'hff}; ? ?//停止讀命令CMD12

parameter RD_BLOCKS = 20'd400; ? ? //SD卡連讀讀一次的塊數

我在程序中定義了SD卡連讀讀一次的塊數,支持修改為任意值,這里400是因為320*320的16bit像素一幀需要連續讀400個塊的數據。

三、SD卡初始化+SD卡連續塊讀操作的verilog代碼

????????代碼已經完成了SD卡的初始化,設置RD_BLOCKS后,連續讀只需要將sd_rd_start_en拉高一個電平,在電平拉高的同時,給sd_rd_sec_addr復制塊讀開始讀的扇區地址后,接下來sd_rd_val_en和sd_rd_val_data就會返回數據,其中sd_rd_val_en是是數據有效標志。

sd_ctrl_top

#(

? ? .RD_BLOCKS(RD_BLOCKS)

)

u_sd_ctrl_top(

? ? .clk_ref ? ? ? ? ? (clk),

? ? .clk_ref_180deg ? ?(!clk),

? ? .rst_n ? ? ? ? ? ? (rst_n),

? ? //SD卡接口

? ? .sd_miso ? ? ? ? ? (sd_miso),

? ? .sd_clk ? ? ? ? ? ?(sd_clk),

? ? .sd_cs ? ? ? ? ? ? (sd_cs),

? ? .sd_mosi ? ? ? ? ? (sd_mosi),

? ? //用戶讀SD卡接口

? ? .rd_start_en ? ? ? (sd_rd_start_en),

? ? .rd_sec_addr ? ? ? (sd_rd_sec_addr),

? ? .rd_busy ? ? ? ? ? (sd_rd_busy),

? ? .rd_val_en ? ? ? ? (sd_rd_val_en),

? ? .rd_val_data ? ? ? (sd_rd_val_data), ? ?

? ?

? ? .sd_init_done ? ? ?(sd_init_done)

);

?? ? ? ?https://download.csdn.net/download/m0_66360845/90601476https://download.csdn.net/download/m0_66360845/90601476?


總結

? ? ? ? 以上就是本文全部內容,給出了每個步驟的時序圖,對理解塊讀操作很有幫助。寫這篇文章的目的一是為了分享知識,二是為了記錄實現方法,方便自己回顧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76709.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76709.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76709.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek 助力 Vue3 開發:打造絲滑的日歷(Calendar)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現

目錄 NSGA-II 多目標優化 —— 理論、案例與交互式 GUI 實現一、引言二、NSGA-II 基本原理2.1 非支配排序2.2 擁擠距離2.3 算法流程三、數學模型與算法推導3.1 多目標優化問題描述3.2 非支配關系與排序3.3 擁擠距離計算四、NSGA-II 的優缺點4.1 優點4.2 缺點五、典型案例分析5.…

庫學習04——numpy

一、基本屬性 二、 創建數組 &#xff08;一&#xff09;arange a np.arange(10,20,2) # [10,12,14,16,18] 只有一個參數n的話&#xff0c;默認是從0到n-1的一維數組。 &#xff08;二&#xff09;自定義reshape a np.arange(12).reshape((3,4)) [[ 0 1 2 3][ 4 5 …

NVIDIA Jetson 快速切換CUDA版本| 多CUDA版本

當NVIDIA Jetson中安裝了多個CUDA時&#xff0c;可以通過命令&#xff0c;快速切換不同版本的。 這樣在環境變量和代碼編譯時&#xff0c;能使用指定版本的CUDA了。 本文適用于Jetson Nano、TX1/TX2、Xavier 和 Orin系列的設備&#xff0c;供大家參考。 cuda參考地址&#xf…

當開源邂逅AI,公益長出翅膀 | 回顧3.30 上海「開源×AI 賦能公益」Meetup

在春和景明的三月&#xff0c;一場打破常規的公益聚會在上海剪愛公益發展中心肇清項目點溫暖上演。這&#xff0c;便是G-Star公益行帶來的「開源AI 賦能公益」Meetup&#xff0c;一場技術與善意交織、創新與溫暖共生的奇妙之旅。 活動現場&#xff0c;沒有高冷的技術壁壘&#…

高階函數/柯里化/純函數

本篇文章主要是介紹一下標題里面的概念&#xff0c;在面試的時候經常文檔&#xff0c;結合閱讀到的資料&#xff0c;結合本人的個人見解出品了該文章&#xff0c;如有寫的不好的地方或理解有誤的&#xff0c;還望閣下多多指教。 1、高階函數 什么是高階函數&#xff1f; 接受…

Docker+Jenkins+Gitee自動化項目部署

前置條件 docker安裝成功 按照下面配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://register.librax.org"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker一、…

穿梭在數字王國:Python進制轉換奇遇記

穿梭在數字王國:Python進制轉換奇遇記 想象一下,你是一位勇敢的探險家,正在穿越神秘的"數字王國"。在這個王國里,不同的地區使用著不同的語言(或者說,進制)。二進制村的居民只懂"0"和"1";八進制鎮的人們使用0到7的數字;而十六進制城的…

FileInputStream 詳解與記憶方法

FileInputStream 詳解與記憶方法 一、FileInputStream 核心概念 FileInputStream 是 Java 中用于從文件讀取原始字節的類&#xff0c;繼承自 InputStream 抽象類。 1. 核心特點 特性說明繼承關系InputStream → FileInputStream數據單位字節&#xff08;8bit&#xff09;用…

設計模式 四、行為設計模式(2)

五、狀態模式 1、概述 狀態設計模式是一種行為型設計模式&#xff0c;它允許對象在其內部狀態發生時改變其行為&#xff0c;這種模式可以消除大量的條件語句&#xff0c;并將每個狀態的行為封裝到單獨的類中。 狀態模式的主要組成部分如下&#xff1a; 1&#xff09;上…

大模型學習八:?Sealos 私有化部署之VMware 安裝ubuntu22.04 虛擬機安裝(實操)

一、說明 windows 11 ubuntu22.04.5 安裝5個虛擬機&#xff0c;3個master 2個node 二、安裝 Vmware 17&#xff08;沒成功&#xff0c;但你可以成功&#xff09; 我的電腦配置比較舊&#xff0c;直接提示處理器不支持xsave 無法打開虛擬機的電源&#xff0c;網上方法試過了…

Win32++ 使用初探

文章目錄 1. 環境要求2. Win32安裝3. 項目創建3.1 項目創建&#xff08;1&#xff09;直接使用Win32里的示例Sample&#xff08;2&#xff09;自行創建項目 最近想用 VC寫些 UI&#xff0c;但又不太想用 MFC&#xff0c;正好對界面要求不太高&#xff0c;就使用了一下 Win3…

R 語言科研繪圖第 38 期 --- 餅狀圖-玫瑰

在發表科研論文的過程中&#xff0c;科研繪圖是必不可少的&#xff0c;一張好看的圖形會是文章很大的加分項。 為了便于使用&#xff0c;本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中&#xff0c;獲取方式&#xff1a; R 語言科研繪圖模板 --- sciRplothttps://mp.…

Linux驅動開發進階(六)- 多線程與并發

文章目錄 1、前言2、進程與線程3、內核線程4、底半步機制4.1、軟中斷4.2、tasklet4.3、工作隊列4.3.1、普通工作項4.3.2、延時工作項4.3.3、工作隊列 5、中斷線程化6、進程6.1、內核進程6.2、用戶空間進程 7、鎖機制7.1、原子操作7.2、自旋鎖7.3、信號量7.4、互斥鎖7.5、comple…

第四節:React Hooks進階篇-useEffect依賴項為空數組[]與不寫的區別

陷阱題&#xff1a;閉包問題、Stale Closure舉例 一、依賴項為空數組[]與不寫的核心區別 行為空數組[]不寫依賴項執行時機僅在組件掛載時執行一次&#xff08;類似componentDidMount&#xff09;組件每次渲染后都執行&#xff08;類似componentDidUpdate&#xff09;更新觸發…

【第39節】windows編程:打造MFC版本任務管理器

目錄 一、項目概述 二、項目開發的各種功能關鍵 2.1 進程信息的獲取 2.2 線程信息的獲取 2.3 進程模塊信息的獲取 2.3.1 模塊快照 2.3.2 枚舉模塊 2.4 進程堆信息的獲取 2.5 窗口信息的獲取 2.6 文件信息的獲取 2.7 內存信息和CPU占用率的獲取 2.7.1 內存信息相關結…

計算軸承|滾動軸承故障頻率

一、軸承故障頻率概述 在旋轉機械故障診斷中&#xff0c;軸承故障頻率&#xff08;BPFO、BPFI、BSF、FTF&#xff09;是重要的分析依據。通過計算這些特征頻率&#xff0c;可以幫助工程師&#xff1a; 識別軸承故障類型&#xff08;內圈/外圈/滾動體故障&#xff09;制定振動…

【數據結構與算法】ArrayList 和 順序表

文章目錄 &#x1f332;List&#x1f332;1. 線性表&#x1f332;2. 順序表&#x1f33f;2.1 MyArrayList2.1.1 類中重寫所有接口方法1.新增元素2.在pos位置新增元素(指定位置)3.判定是否包含了某個特定元素 4.查找特定元素對應的位置 5.獲取pos下標的元素 6.給pos位置的元素替…

OceanBase 推出單機版 ,為中小規模業務提供高性價比方案

近日&#xff0c;OceanBase正式推出了全新的單機版數據庫。這款產品基于OceanBase自主研發的單機分布式一體化架構&#xff0c;具有精簡的架構設計和出色的兼容性&#xff0c;能夠為中小規模業務場景提供高性價比的數據庫解決方案&#xff0c;充分滿足客戶在不同業務規模下的多…

如何在 Vue 3 中實現百度地圖位置選擇器組件

如何在 Vue 3 中實現百度地圖位置選擇器組件 前言 在開發前端應用時&#xff0c;地圖選擇器是一個非常常見的需求。尤其是在一些需要用戶選擇地址的場景&#xff0c;如電商平臺、旅游網站、酒店預定等&#xff0c;百度地圖組件能提供準確的地理位置服務。在本文中&#xff0c…