伦伦影院久久影视,天天操天天干天天射,ririsao久久精品一区 ,一本大道香蕉大久在红桃,999久久久免费精品国产色夜,色悠悠久久综合88,亚洲国产精品久久无套麻豆,亚洲香蕉毛片久久网站,一本一道久久综合狠狠老

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-thread SDIO驅動框架分析(貼片SD卡flash驅動\SD Nand flash驅動)

深圳市雷龍發展有限公司 ? 2023-04-04 17:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

文章目錄

rt-thread SDIO驅動框架分析之SD卡驅動

1. 前言

2. SDIO通用驅動框架介紹

3. 文件架構分析

4. SDIO設備驅動分析

5. SDIO設備驅動架構分析

6. 調試記錄

7. 總結


1. 前言

RT-Thread是一款國產化的嵌入式操作系統,目前在嵌入式領域得到廣泛應用,其強大的擴展功能以及通用的外設驅動框架備受大家追捧。

關于基本的外設驅動,其官網上基本也都有部分描述,但是關于SDIO設備驅動目前為止還沒有相關文檔說明,因此本文筆者將根據自己的調試使用經驗,與大家分享下rtthread的通用SDIO設備驅動的實現。

本文基于代碼倉庫 rt-thread/bsp/stm32/stm32f103-fire-arbitrary 分析代碼

分支:main

commit:6808f48bdcf914f03ac757cc19b264a5d0db56de

說明:main分支會有不斷更新,但是SDIO驅動框架目前應該不會有大變更

硬件介紹:

控制器:STM32 基于手上為數不多的野火開發板吧

SD卡:本次采用的并非SD卡,而是創世CS家的一顆SD Nand, CSNP4GCR01-AMW,有幸申請到了一顆樣片

這里多說幾句,SD nand使用起來和SD卡完全一樣,而且SD Nand相比SD卡感覺好用太多,貼片LGA-8封裝,和SPI flash 差不多,完美的解決了SD卡松動導致系統不穩定的問題,而且容量又大,個人感覺以后必定是嵌入式存儲應用上的主流 (除了價格貴點啥都好,哈哈)想要樣片試試水的可以去找深圳雷龍公司官網申請下

2. SDIO通用驅動框架介紹

首先來介紹下 SDIO 通用驅動框架。

RT-Thread 區別于其他操作系統,如FreeRTOS,的一大重要特征是,RT-Thread 中引入了設備驅動框架,并且針對絕大多數外設基本上都已完成對應的設備驅動框架編寫,所謂的設備驅動框架,也就是我們所說的建立在應用層與底層驅動層之間的中間件

如下圖所示:

應用層:完成業務應用,調用通用接口操作設備驅動層

設備驅動框架層:完成外設通用驅動框架設計,脫離具體的芯片,將驅動中相同部分,如針對SPI,關于SPI的完整讀寫邏輯等抽離出來

設備驅動層:完成對應芯片的外設驅動程序編寫,實現設備驅動框架層的具體接口

SD NAND,貼片式TF卡,貼片式SD卡

對于SDIO外設亦是如此:

在設備驅動框架層中,實現SD卡、SDIO卡、MMC卡的通用外設驅動邏輯,如卡的識別、卡的模塊切換、卡的讀寫操作等,這些都是通用的,遵循SD標準協議;

在設備驅動層中,根據對應的硬件,完成具體芯片的SDIO外設配置,并實現設備驅動框架層所需要實現的具體接口,如發送CMD命令等。

在應用層實現具體的應用,應用層與驅動層解耦

通過這種方式,這樣便可以輕松的做到:

需要驅動具體的SD、SDIO、MMC時,根據具體的芯片實現對應的SDIO驅動接口即可

應用層可直接移植,如出現方案芯片替代時,只需完成設備驅動層適配即可

這也就是RT-Thread讓眾多開發者瘋狂追捧的重大原因了,接下來,我們將具體分析關于SD卡的具體框架層實現,關于SDIO卡、MMC卡,由于使用不多,本文不做深入分析。

3. 文件架構分析

首先我們先來看下SDIO驅動框架有關文件及架構

SDIO驅動框架文件:

SD NAND,貼片式TF卡,貼片式SD卡

SDIO驅動框架文件架構:

SD NAND,貼片式TF卡,貼片式SD卡

4. SDIO設備驅動分析

設備驅動與驅動框架文件在不同的目錄,設備驅動一般在 bsp 目錄中

通常設備驅動完成以下幾個事情:

初始化具體外設有關數據結構;

完成具體外設初始化程序編寫;

實現設備框架層的具體接口,如:open,read,write,close,control 等;

將具體設備注冊到內核中;

需要注意的是,SDIO設備驅動會有些許區別,在SDIO設備驅動程序中,主要完成以下幾件事:

初始化具體外設有關數據結構;

SDIO外設的初始化配置;

實現設備框架層的以下幾個接口:

struct rt_mmcsd_host_ops {

void (*request)(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);

void (*set_iocfg)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);

rt_int32_t (*get_card_status)(struct rt_mmcsd_host *host);

void (*enable_sdio_irq)(struct rt_mmcsd_host *host, rt_int32_t en);

};

4.通知驅動框架層(此處demo程序默認上電前sd卡已接入);

以 rt-thread/bsp/stm32/libraries/HAL_Drivers/drv_sdio.c 程序為例,SDIO驅動層程序從 rt_hw_sdio_init 函數開始,由于使能了自動初始化,此函數由 INIT_DEVICE_EXPORT(rt_hw_sdio_init); 宏實現初始化調用

(關于自動初始化如何實現的細節,可參考筆者另外一篇博文對自動初始化的詳細分析:代碼自動初始化(點擊跳轉))

在 rt_hw_sdio_init 函數中,驅動程序主要初始化以下幾個結構體:

stm32外設HAL庫配置結構體 SD_HandleTypeDef hsd

stm32 sdio 設備結構體 struct stm32_sdio_des sdio_des

sdio硬件外設結構體 struct rthw_sdio *sdio

mmc sd host結構體struct rt_mmcsd_host

其關系如下圖所示:

SD NAND,貼片式TF卡,貼片式SD卡

結構體數據初始化完成以后,調用mmcsd_change()函數,觸發框架層邏輯

SD NAND,貼片式TF卡,貼片式SD卡

此外,在設備驅動層提供的操作函數主要有:

SD NAND,貼片式TF卡,貼片式SD卡SD NAND,貼片式TF卡,貼片式SD卡

static const struct rt_mmcsd_host_ops ops =

{

rthw_sdio_request,

rthw_sdio_iocfg,

rthw_sd_detect,

rthw_sdio_irq_update,

};

rthw_sdio_request 實現一次SDIO數據發送

rthw_sdio_iocfg 實現SDIO外設配置,注意在SD識別過程中會反復調用,不斷更新SDIO外設配置

rthw_sd_detect 實現獲取卡的狀態獲取,demo里這里實際沒有實現

rthw_sdio_irq_update 實現SDIO外設中斷的開關配置

函數調用順序如下:

/* 函數調用順序 */

rt_hw_sdio_init()

-> sdio_host_create(&sdio_des)

-> mmcsd_change(host)

5. SDIO設備驅動架構分析

設備驅動架構層,也就是中間層,文件框架如下圖所示:

SD NAND,貼片式TF卡,貼片式SD卡

我們首先來看下 mmcsd_core.c 這個文件:

rt_mmcsd_core_init() 初始化函數通過 INIT_PREV_EXPORT(rt_mmcsd_core_init); 被初始化調用,同時初始化用于 mmc、sd、sdio檢測的郵箱mmcsd_detect_mb,用于熱插拔處理的 mmcsd_hotpluge_mb 以及 mmc、sd、sdio檢測線程 mmcsd_detect_thread;

在線程mmcsd_detect_thread 中,等待mmcsd_detect_mb郵箱喚醒;

當SDIO驅動層完成初始化話之后,通過調用 mmcsd_change(host) 函數,將mmcsd_detect_thread線程喚醒,開始進行mmc、sd卡、sdio卡的識別過程

mmcsd_core_init()函數內容如下:

int rt_mmcsd_core_init(void)

{

rt_err_t ret;

/* initialize detect SD cart thread */

/* initialize mailbox and create detect SD card thread */

ret = rt_mb_init(&mmcsd_detect_mb, "mmcsdmb",

&mmcsd_detect_mb_pool[0], sizeof(mmcsd_detect_mb_pool) / sizeof(mmcsd_detect_mb_pool[0]),

RT_IPC_FLAG_FIFO);

RT_ASSERT(ret == RT_EOK);

ret = rt_mb_init(&mmcsd_hotpluge_mb, "mmcsdhotplugmb",

&mmcsd_hotpluge_mb_pool[0], sizeof(mmcsd_hotpluge_mb_pool) / sizeof(mmcsd_hotpluge_mb_pool[0]),

RT_IPC_FLAG_FIFO);

RT_ASSERT(ret == RT_EOK);

ret = rt_thread_init(&mmcsd_detect_thread, "mmcsd_detect", mmcsd_detect, RT_NULL,

&mmcsd_stack[0], RT_MMCSD_STACK_SIZE, RT_MMCSD_THREAD_PREORITY, 20);

if (ret == RT_EOK)

{

rt_thread_startup(&mmcsd_detect_thread);

}

rt_sdio_init();

return 0;

}

INIT_PREV_EXPORT(rt_mmcsd_core_init);

mmcsd_detect()線程以及mmcsd_change()函數如下:

mmcsd_detect() 函數主要負責完成 SDIO卡、SD卡、MMC卡的初步識別,初步識別確認是哪種類型的卡接入之后,將會調用對應卡驅動文件(SD卡對應sd.c,SDIO卡對應sdio.c,MMC卡對應mmc.c)內的初始化函數,重新完成卡的完整識別流程

如果對于SD卡識別流程不了解,建議先熟悉SD卡識別流程,參考 SD Nand 與 SD卡 SDIO模式應用流程(點擊跳轉)

具體流程見下述函數描述,對應步驟已補充注釋描述

void mmcsd_change(struct rt_mmcsd_host *host)

{

rt_mb_send(&mmcsd_detect_mb, (rt_uint32_t)host);

}

void mmcsd_detect(void *param)

{

struct rt_mmcsd_host *host;

rt_uint32_t ocr;

rt_int32_t err;

while (1)

{

/* 首先等待 mmcsd_detect_mb 信號量,此信號量由 mmcsd_change() 函數發送過來 */

if (rt_mb_recv(&mmcsd_detect_mb, (rt_ubase_t *)&host, RT_WAITING_FOREVER) == RT_EOK)

{

/* 通過判斷 host->card 確認此次操作是識別卡還是移除卡 */

if (host->card == RT_NULL) /* 識別卡 */

{

mmcsd_host_lock(host); /* 獲取鎖 */

mmcsd_power_up(host); /* 配置SDIO外設電源控制器,power up, 即卡的時鐘開啟,同時配置SDIO外設時鐘為低速模式 */

mmcsd_go_idle(host); /* 發送CMD0指令,使卡進入空閑狀態 */

mmcsd_send_if_cond(host, host->valid_ocr); /* 發送CMD8命令,查詢SD卡接口條件 (獲取OCR寄存器) */

/*

* 檢測SDIO卡使用,SD卡不用管

*/

err = sdio_io_send_op_cond(host, 0, &ocr); /* 發送CMD5命令,此處是針對SDIO卡使用,SD卡不會響應 */

if (!err) /* SD卡不會響應此指令,因此此條件不會成立 */

{

if (init_sdio(host, ocr))

mmcsd_power_off(host);

mmcsd_host_unlock(host);

continue;

}

/*

* 檢測SD卡使用,使用SD卡重點關注此項!!!

*/

err = mmcsd_send_app_op_cond(host, 0, &ocr); /* 發送ACMD41指令(ACMD41:CMD55+CMD41) SD卡將應答此指令 */

if (!err)

{

if (init_sd(host, ocr)) /* 此函數內完成SD卡完整的識別流程 */

mmcsd_power_off(host); /* 設置SDIO外設,電源關閉,卡的時鐘停止 */

mmcsd_host_unlock(host); /* 釋放鎖 */

rt_mb_send(&mmcsd_hotpluge_mb, (rt_uint32_t)host); /* 發送郵箱,通知熱插拔事件 */

continue;

}

/*

* 檢測MMC卡檢測使用,SD卡不用管

*/

err = mmc_send_op_cond(host, 0, &ocr);

if (!err)

{

if (init_mmc(host, ocr))

mmcsd_power_off(host);

mmcsd_host_unlock(host);

rt_mb_send(&mmcsd_hotpluge_mb, (rt_uint32_t)host);

continue;

}

mmcsd_host_unlock(host); /* 識別失敗,釋放鎖 */

}

else /* 移除卡 */

{

/* card removed */

mmcsd_host_lock(host); /* 獲取鎖 */

if (host->card->sdio_function_num != 0)

{

LOG_W("unsupport sdio card plug out!");

}

else

{

rt_mmcsd_blk_remove(host->card);

rt_free(host->card);

host->card = RT_NULL;

}

mmcsd_host_unlock(host); /* 釋放鎖 */

rt_mb_send(&mmcsd_hotpluge_mb, (rt_uint32_t)host);

}

}

}

}

在mmcsd_detect()函數內完成SD卡的初步識別之后,之后將調用sd.c文件內的init_sd()函數完成 sd 卡的完整識別過程

/*

* Starting point for SD card init.

*/

rt_int32_t init_sd(struct rt_mmcsd_host *host, rt_uint32_t ocr)

{

rt_int32_t err;

rt_uint32_t current_ocr;

/*

* We need to get OCR a different way for SPI.

*/

if (controller_is_spi(host)) /* 判斷是否采用SPI模式訪問SD卡 */

{

mmcsd_go_idle(host);

err = mmcsd_spi_read_ocr(host, 0, &ocr);

if (err)

goto err;

}

if (ocr & VDD_165_195)

{

LOG_I(" SD card claims to support the "

"incompletely defined 'low voltage range'. This "

"will be ignored.");

ocr &= ~VDD_165_195;

}

current_ocr = mmcsd_select_voltage(host, ocr); /* 配置SDIO外設設置為合適的電壓,對于stm32、gd32等相關控制器,實際是不支持不同等級電壓配置的,所以這里可以忽略,不過你需要注意你所使用的sd卡的電源在硬件上是匹配的 */

/*

* Can we support the voltage(s) of the card(s)?

*/

if (!current_ocr)

{

err = -RT_ERROR;

goto err;

}

/*

* Detect and init the card.

*/

err = mmcsd_sd_init_card(host, current_ocr); /* 完整的SD卡初始化流程在此函數內實現 */

if (err)

goto err;

mmcsd_host_unlock(host); /* 釋放鎖 */

err = rt_mmcsd_blk_probe(host->card); /* 注冊塊設備 */

if (err) /* 如果注冊塊設備失敗,將移除卡 */

goto remove_card;

mmcsd_host_lock(host); /* 獲取鎖 */

return 0;

remove_card:

mmcsd_host_lock(host); /* 獲取鎖 */

rt_mmcsd_blk_remove(host->card); /* 移除塊設備 */

rt_free(host->card); /* 釋放對應的內存 */

host->card = RT_NULL;

err:

LOG_D("init SD card failed!");

return err;

}

調用mmcsd_sd_init_card()函數完成SD卡檢測以及初始化配置

static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,

rt_uint32_t ocr)

{

struct rt_mmcsd_card *card;

rt_int32_t err;

rt_uint32_t resp[4];

rt_uint32_t max_data_rate;

mmcsd_go_idle(host); /* 發送CMD0,復位SD卡,使卡進入空閑模式 */

/*

* If SD_SEND_IF_COND indicates an SD 2.0

* compliant card and we should set bit 30

* of the ocr to indicate that we can handle

* block-addressed SDHC cards.

*/

err = mmcsd_send_if_cond(host, ocr); /* 發送CMD8指令,判斷是否為V2.0或V2.0以上的卡,并獲取OCR寄存器值 */

if (!err) /* 如果是V2.0及以上版本的卡,將置為OCR的bit30位,表明主機支持高容量SDHC卡(OCR將在ACMD41指令時作為參數發送給卡) */

ocr |= 1 << 30;

err = mmcsd_send_app_op_cond(host, ocr, RT_NULL); /* 發送ACMD41(ACMD41 = CMD55+CMD41)指令,發送主機容量支持信息,并詢問卡的操作條件 */

if (err)

goto err;

if (controller_is_spi(host)) /* 判斷是否使用SPI方式訪問SD卡 */

err = mmcsd_get_cid(host, resp); /* 采用SPI方式獲取CID寄存器值 */

else

err = mmcsd_all_get_cid(host, resp);/* 發送CMD2命令,獲取CID寄存器值 */

if (err)

goto err;

card = rt_malloc(sizeof(struct rt_mmcsd_card)); /* 創建rt_mmcsd_card結構體,用于存儲對應SD卡的CID寄存器內容 */

if (!card)

{

LOG_E("malloc card failed!");

err = -RT_ENOMEM;

goto err;

}

rt_memset(card, 0, sizeof(struct rt_mmcsd_card));

card->card_type = CARD_TYPE_SD;

card->host = host;

rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid));

/*

* For native busses: get card RCA and quit open drain mode.

*/

if (!controller_is_spi(host)) /* 如果不是采用SPI方式訪問SD卡 */

{

err = mmcsd_get_card_addr(host, &card->rca); /* 發送CMD3命令,獲取RCA地址 */

if (err)

goto err1;

mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);/* 設置CMD總線為推挽輸出模式,需要注意的是,MMC卡V3.31版本以前的卡,初始化階段,CMD總線需要為開路模式,對于SD/SD I/O卡和MMC V4.2在初始化時也使用推挽驅動 */

}

err = mmcsd_get_csd(card, card->resp_csd); /* 發送CMD9命令,獲取CSD寄存器值 */

if (err)

goto err1;

err = mmcsd_parse_csd(card); /* 解析CSD寄存器值,將解析完成的數據存放在剛剛申請的card結構體內 */

if (err)

goto err1;

if (!controller_is_spi(host)) /* 如果不是采用SPI方式訪問SD卡 */

{

err = mmcsd_select_card(card); /* 發送CMD7命令,選擇卡 */

if (err)

goto err1;

}

err = mmcsd_get_scr(card, card->resp_scr); /* 發送CMD9命令,獲取SCR寄存器值,并保存在剛剛申請的card結構體內 */

if (err)

goto err1;

mmcsd_parse_scr(card); /* 解析SCR寄存器的值,并將解析結果存放在在card結構體內 */

if (controller_is_spi(host))

{

err = mmcsd_spi_use_crc(host, 1);

if (err)

goto err1;

}

/*

* change SD card to high-speed, only SD2.0 spec

*/

err = mmcsd_switch(card); /* 發送CMD6指令,切換卡訪問速率由默認的12.5MB/Sec為25MB/Sec高速接口 */

if (err)

goto err1;

/* set bus speed */

max_data_rate = (unsigned int)-1;

if (card->flags & CARD_FLAG_HIGHSPEED)

{

if (max_data_rate > card->hs_max_data_rate)

max_data_rate = card->hs_max_data_rate;

}

else if (max_data_rate > card->max_data_rate)

{

max_data_rate = card->max_data_rate;

}

mmcsd_set_clock(host, max_data_rate); /* 修改SDIO外設時鐘速度 */

/*switch bus width*/

if ((host->flags & MMCSD_BUSWIDTH_4) &&

(card->scr.sd_bus_widths & SD_SCR_BUS_WIDTH_4)) /* 根據SD卡的SCR寄存器反饋的值,判斷SD卡是否支持4線寬度訪問模式,如果支持則切換為4線寬度訪問模式 */

{

err = mmcsd_app_set_bus_width(card, MMCSD_BUS_WIDTH_4); /* 發送ACMD6(ACMD6=CMD55+CMD6)指令,通知SD卡切換為4線訪問模式 */

if (err)

goto err1;

mmcsd_set_bus_width(host, MMCSD_BUS_WIDTH_4); /* 修改SDIO外設配置為4線訪問模式 */

}

host->card = card; /* 將card結構體數據與host結構體建立綁定關系 */

return 0;

err1:

rt_free(card);

err:

return err;

}


6. 調試記錄

RT-Thread的SDIO驅動,默認上層使用到了 elm-fatfs 文件系統,因此通常我們配置好對應的芯片的SDIO驅動之后,直接就可以快速使用文件系統來操作訪問SD Nand了,關于文件系統的有關內容,不在此文中做過多描述,有興趣的同學可以關注本人博客,后續將及時更新。

此外,在實際使用中有一點需要注意,當我們首次使用芯片的時候,sd nand內還未寫入任何數據,此時通常是沒有文件系統的,所以當一次執行之后你會見到如下錯誤:

SD NAND,貼片式TF卡,貼片式SD卡

這是由于SD nand內沒有掛載文件系統導致,解決此問題有以下兩個方法:

方法一:在命令終端使用mkfs掛載文件系統,具體命令步驟如下:

使用list_device查看sd nand對應的設備名

使用mkfs命令格式化sd nand:mkfs -t elm sd0-t指定文件系統類型為elm-FAT文件系統,對sd0設備操作)

由 drv_sdio.c 外設驅動或其他調用 mmcsd_change() 觸發 mmcsd_detect() 檢測

在 mmcsd_detect () 任務中,實現對SD卡、SD I/O卡、MMC卡的初步識別(發送對應卡特有命令,并判斷是否正確響應),之后根據卡片類型調用不同類型卡片驅動文件內的初始化程序

如針對SD卡,則調用sd.c文件內的 init_sd() 函數完成

在init_sd()函數內調用 mmcsd_sd_init_card() 完成SD卡的完整識別流程以及初始化流程,同時同步修改SDIO外設配置

SD卡初始化完成之后,調用 rt_mmcsd_blk_probe() 將sd卡注冊為塊設備

至此SD的識別與初始化流程順利完成

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FlaSh
    +關注

    關注

    10

    文章

    1755

    瀏覽量

    155779
  • SD卡
    +關注

    關注

    2

    文章

    589

    瀏覽量

    69549
  • SD NAND
    +關注

    關注

    0

    文章

    119

    瀏覽量

    1857
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    從NOR FlashNAND FlashSD NAND,從底層結構到應用差異

    nor flash,nor nand,sd nand,spi nor,nand flash
    的頭像 發表于 03-05 18:24 ?292次閱讀
    從NOR <b class='flag-5'>Flash</b> 到 <b class='flag-5'>NAND</b> <b class='flag-5'>Flash</b> 和<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>,從底層結構到應用差異

    從NOR FlashNAND FlashSD NAND,從底層結構到應用差異

    NAND 如果直接寫,會出現:   寫入放大   頓   壞塊不可控   壽命快速衰減   因此 NAND 必須配套:   ECC   Page Cache(緩存機制)   FTL(Fla
    發表于 03-05 18:23

    ESP32 驅動瀚海微SD NAND 完整方案 + FAT/FAT32 驅動核心區別

    ESP32?驅動 SD NAND?的核心是基于SDIO?接口(SD NAND?主流通信方式,兼容
    的頭像 發表于 02-02 11:38 ?467次閱讀
    ESP32 <b class='flag-5'>驅動</b>瀚海微<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b> 完整方案 + FAT/FAT32 <b class='flag-5'>驅動</b>核心區別

    從NOR FlashNAND FlashSD NAND,從底層結構到應用差異

    NAND 如果直接寫,會出現:   寫入放大   頓   壞塊不可控   壽命快速衰減   因此 NAND 必須配套:   ECC   Page Cache(緩存機制)   FTL(Fla
    發表于 12-08 17:54

    解鎖SD NAND、TFSD的應用密碼

    在科技飛速發展的今天,數據存儲的需求滲透到生活與工作的每一個角落——從手腕上的智能手表,到專業攝影師的相機,再到工廠里的工業路由器,都離不開高效可靠的存儲介質。SD NAND、TFSD
    的頭像 發表于 11-24 11:04 ?642次閱讀
    解鎖<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>、TF<b class='flag-5'>卡</b>、<b class='flag-5'>SD</b><b class='flag-5'>卡</b>的應用密碼

    瑞薩 Titan board RA8P1 sdcard demo例程識別64G、256G exfat的SD掛載失敗的原因?

    - 2024 Copyright by RT-Thread team [32m[I/SDIO] SD card capacity 7802880 KB.[0m found part[0], begin
    發表于 11-05 07:35

    解鎖存儲密碼:SD NAND、TFSD的應用全景

    在數據洪流的時代,存儲介質就如同數字世界的基石,支撐著各類設備的正常運轉。SD NAND、TFSD,雖同屬
    的頭像 發表于 10-29 14:24 ?820次閱讀

    SD NAND寫保護問題的分析

    說起SD NAND /SD寫保護的問題,我們先分析一下出現寫保護的一些原因 首先,我們先除去SD
    的頭像 發表于 10-21 10:28 ?669次閱讀
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>寫保護問題的<b class='flag-5'>分析</b>

    基于RT-Thread的EK-RA2E2 設備驅動移植與應用 | 技術集結

    目錄前言環境配置HelloRT-ThreadGPIO輸入與中斷I2C主機驅動SPI主機驅動ADC設備驅動PWM設備驅動Flash設備
    的頭像 發表于 10-05 10:06 ?6280次閱讀
    基于<b class='flag-5'>RT-Thread</b>的EK-RA2E2 設備<b class='flag-5'>驅動</b>移植與應用 | 技術集結

    一文讀懂 SD NAND,小白也能秒變存儲技術大神

    SD NAND 是一種貼片式存儲芯片,內部集成 NAND FlashSD 控制器,兼容
    的頭像 發表于 08-19 14:40 ?2479次閱讀
    一文讀懂 <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>,小白也能秒變存儲技術大神

    SD—雷龍 SD NAND

    一、SD介紹 1.基本介紹 本質:nand flash + 控制芯片 1.SD ,Secur
    的頭像 發表于 07-21 17:59 ?3983次閱讀
    <b class='flag-5'>SD</b><b class='flag-5'>卡</b>—雷龍 <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>

    【嵌入式開發】SD—雷龍 SD NAND

    的具體型號是CSNP32GCR01-AOW 使用pSLC技術,擁有高容量的同時兼具SLC的特性,不用寫驅動程序自帶壞塊管理的NAND Flash貼片式TF
    發表于 07-21 17:56

    什么是Flash閃存以及STM32使用NAND Flash

    SD NAND Flash 我以貼片式TF“CSNP32GCR01-AOW”型號為例介紹 芯片樣子都一樣,這里隨便放一張 概述 CSN
    發表于 07-03 14:33

    驅動到應用:RT-Thread環境下的SDIO開發指南

    目錄硬件介紹搭建開發環境配置SDIO驅動掛載文件系統文件讀寫測試演示視頻源碼工程總結本文主要講述RT-Thread環境下的SDIO開發指南,基于MCXN947開發板。1硬件介紹本次測評
    的頭像 發表于 06-28 09:02 ?2972次閱讀
    從<b class='flag-5'>驅動</b>到應用:<b class='flag-5'>RT-Thread</b>環境下的<b class='flag-5'>SDIO</b>開發指南

    【STM32系統】基于STM32設計的SD數據讀取與上位機顯示系統(SDIO接口驅動、雷龍貼片SD

      基于STM32設計的SD數據讀取與上位機顯示系統   演示視頻: 基于STM32設計的SD數據讀取與上位機顯示系統(SDIO接口
    發表于 05-09 16:11