安全數(shù)字(SD)卡用于在許多電子設(shè)備中存儲(chǔ)信息,尤其是智能手機(jī)和數(shù)碼相機(jī)。但是您知道您可以借助一個(gè)簡單的 8 位微控制器在SD 卡上讀取和寫入信息嗎?你沒聽錯(cuò),這樣做是可能的,這為嵌入式系統(tǒng)和設(shè)計(jì)打開了一個(gè)充滿機(jī)會(huì)的袋子。由于 SD 卡的價(jià)格遠(yuǎn)優(yōu)于任何其他存儲(chǔ)選項(xiàng),因此它可以用于存儲(chǔ)和記錄數(shù)天的數(shù)據(jù)。這使得日志記錄功能更加簡單。這是一個(gè)例子,你可以用一張 SD 卡做更多的事情。
因此,在本文中,我們將向您展示如何簡單地將 SD 卡模塊與 PIC 微控制器連接并在其中存儲(chǔ)數(shù)據(jù)。
了解不同類型的 SD 卡?
安全數(shù)字卡或 SD 卡是一種由 SD 協(xié)會(huì) (SDA) 開發(fā)的用于便攜式設(shè)備的非易失性存儲(chǔ)卡格式。Secure Digital 卡可細(xì)分為四類,如下所示。
SDSC(安全數(shù)字標(biāo)準(zhǔn)容量):
您可以在市場上找到的最基本和最常見的卡是SDSC卡。它代表安全數(shù)字標(biāo)準(zhǔn)容量;這種類型的卡最大容量為 2GB,它使用 FAT16 文件系統(tǒng)。除此之外,此類卡的最大傳輸容量為 12.5MB/s 。
SDHC(安全數(shù)字大容量):
接下來,列表中還有另一種最常見的卡,稱為SDHC或安全數(shù)字大容量卡。此卡最大容量為 32GB,支持升級(jí)后的 FAT32 文件系統(tǒng)。在一般情況下,此卡支持的總線速度為 12.5MB/s 至 25MB/s,但根據(jù)總線接口(UHS-I、UHS-II、UHS-III、SD-表達(dá))。
SDXC(安全數(shù)字?jǐn)U展容量):
接下來,我們有我們的SDXC卡或Secure Digital eXtended-Capacity, 此卡的最大容量為 2TB,它可以同時(shí)支持 FAT32 和 exFAT 文件系統(tǒng)。此卡的默認(rèn)總線速度為 12.5MB/s 至 25MB/s,但它支持高達(dá) 3938MB/s 取決于總線接口(UHS-I、UHS-II、UHS-III、SD-Express)
SDUC(安全數(shù)字超容量):
接下來,在線上,我們有我們最近升級(jí)的卡或SDUC卡,它代表安全數(shù)字超容量。此卡最大容量為 128TB,僅支持 exFAT 文件系統(tǒng)。它還具有 12.5MB/s 到 25MB/s 的默認(rèn)總線速度,但根據(jù)總線類型,它可以支持高達(dá) 3938MB/s(UHS-I、UHS-II、UHS-III、SD-Express)。
SDIO(安全數(shù)字輸入輸出):
SDIO是一種安全數(shù)字卡接口。根據(jù)容量和總線速度,它可以用作輸入或輸出設(shè)備的接口。
SD卡也按“寫入速度”和“物理尺寸”分類
2.按“物理尺寸”分類
標(biāo)準(zhǔn)(32 毫米 × 24 毫米 × 2.1 毫米)
miniSD(21.5 毫米 × 20 毫米 × 1.4 毫米)
microSD(15 毫米 × 11 毫米 × 1 毫米)
了解 SD 卡不同引腳的功能
一般來說,SD 卡有 9 個(gè)引腳,但其中只有 7 個(gè)引腳用于與 SPI 模式下的 SD 卡通信。SD 卡 MicroSD 卡和 SD 卡模塊的圖像如下所示。
標(biāo)準(zhǔn) SD 卡可以在 3 種模式下運(yùn)行:
1. SPI 模式引腳配置
2.一位 SD 模式引腳配置
3.四位 SD 模式引腳配置
在這個(gè)項(xiàng)目中,我們將通過 SPI 與 SD 卡進(jìn)行通信。工作頻率在 100kHz 至 400kHz 之間。
將 SD 卡與 PIC 微控制器通信所需的組件
構(gòu)建此項(xiàng)目所需的組件非常通用,其中大部分都可以在您當(dāng)?shù)氐膼酆蒙痰曛姓业?。下面給出了所需組件的列表。
PIC單片機(jī)(PIC18F46K22)
SD卡模塊(帶3.3穩(wěn)壓器和邏輯電平轉(zhuǎn)換器)
降壓電阻(3x3.3K 和 3x2.2k)(如果直接使用 SD 卡)
20MHz晶振
33pf 電容 - 2Nos
4.7k, 100E 電阻
PicKit3
帶領(lǐng)任何顏色
按鈕
面包板
跳線
為 PIC 和 SD 卡模塊供電的 12V 適配器
用于將 SD 與 PIC 微控制器連接的示意圖
下面給出了基于 PIC 微控制器的數(shù)據(jù)記錄器的電路圖。
我們使用 PIC18F46K22 作為大腦與 SD 卡模塊進(jìn)行通信。我們已經(jīng)知道PIC單片機(jī)的工作電壓是5V,不適合SD卡。由于 SD 卡工作在 3.3v 電壓范圍內(nèi),因此我們使用了一些分壓器來降低 SD 卡輸入電壓。
我們使用 2.2k 和 3.3k 電阻器來創(chuàng)建分壓器電路。
SD卡輸入電壓 = 5v x (3.3k/ (2.2k+3.3k)) = 3v
SD卡和PIC單片機(jī)之間建立通信的程序
在這個(gè)項(xiàng)目中,我們使用Chan 的 FatFs 通用 FAT 文件系統(tǒng)模塊庫在 SD 卡上讀取和寫入數(shù)據(jù),并使用 Microchip 代碼配置器 (MCC) 為 (PIC18F46K22) 配置程序。完整的程序可以在本頁底部找到。
上面提到的那些庫包含在代碼的開頭。
?
#include "mcc_generated_files/mcc.h" #包括“ff.h”
?
接下來,定義2個(gè)變量fatFs和file用于訪問SD卡的區(qū)域。
?
FATFS FATF;/* 每個(gè)卷需要的 FatFs 工作區(qū) */ 文件;/* 每個(gè)打開的文件需要的文件對象 */
?
接下來,我們定義一個(gè)回調(diào)函數(shù)來讓 LED 閃爍,我們在 Timer0 的幫助下做到這一點(diǎn)。我們計(jì)算它,以便 LED 每 1 秒閃爍一次。
?
無效閃爍_led(){ IO_RA1_Toggle(); }
?
在main()循環(huán)中,我們調(diào)用SYSTEM_Initialize()函數(shù)來初始化系統(tǒng)外圍設(shè)備,如(INTERRUPT、Pin、Timer0、Uart、SPI1)。并啟用全局和外圍中斷。
?
無效主要(無效) { 單位體重; //初始化設(shè)備 SYSTEM_Initialize(); // 如果在 PIC18 高/低優(yōu)先級(jí)模式下使用中斷,則需要啟用全局高和低中斷 // 如果在 PIC 中檔兼容模式下使用中斷,則需要啟用全局和外設(shè)中斷 // 使用以下宏: // 啟用全局中斷 INTERRUPT_GlobalInterruptEnable(); // 禁用全局中斷 //INTERRUPT_GlobalInterruptDisable(); // 啟用外設(shè)中斷 INTERRUPT_PeripheralInterruptEnable(); //禁用外設(shè)中斷 //INTERRUPT_PeripheralInterruptDisable();
?
系統(tǒng)初始化后,調(diào)用TMR0_SetInterruptHandler()函數(shù),設(shè)置回調(diào)函數(shù),然后啟動(dòng) Timer0。
?
TMR0_SetInterruptHandler(blink_led); TMR0_StartTimer();
?
完成所有初始化后,現(xiàn)在我們使用 SD 卡啟動(dòng)主進(jìn)程。首先,我們需要調(diào)用函數(shù)f_mount()來掛載 SD 卡,并將返回值存儲(chǔ)到名為FRESULT的變量中。通過檢查該stat變量,我們可以進(jìn)一步進(jìn)行。所以,如果stat結(jié)果為FR_OK,則表示SD卡掛載成功,否則掛載失敗。所以,在 SD 卡掛載成功后,我們現(xiàn)在調(diào)用f_open()創(chuàng)建一個(gè)名為“?test.txt?”的文件,然后使用?f_lseek()函數(shù)將光標(biāo)指向文件末尾?,F(xiàn)在,我們可以調(diào)用f_write()函數(shù)將數(shù)據(jù)寫入該文件,最后,我們調(diào)用f_close()來關(guān)閉 SD 卡中打開的文件。這就是我們在之前創(chuàng)建的文本文件中寫入的方式。
?
printf("\r\n=============開始與SD卡接口=============\r\n"); FRESULT stat = f_mount(&fatFs, "", 1); if (stat == FR_OK) { /* 掛載 SD */ printf("SD卡掛載成功\r\n"); SD_LED_SetHigh(); if (f_open(&file, "Sd_test.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK) { /* 打開或創(chuàng)建文件 */ printf("創(chuàng)建文件成功\r\n"); if ((file.fsize != 0) && (f_lseek(&file, file.fsize) != FR_OK)) 轉(zhuǎn)到 endSD; /* 跳轉(zhuǎn)到文件末尾 */ f_write(&file, "大家好!\r\n", 13, &bw); f_write(&file, "這是寫入SD卡的短信。更多信息請?jiān)L問www.circuitdigest.com\r\n", 99, &bw); endSD: f_close(&file); /* 關(guān)閉文件 */ SD_LED_SetLow(); }別的{ printf("創(chuàng)建文件失敗\r\n"); SD_LED_SetLow(); } }別的{ printf("SD卡掛載失敗\r\n ------ FRESULT %d ------\r\n"); } printf("\r\n=============完成與SD卡的接口=============\r\n\r\n\r\n \r\n");
?
這就是我們?nèi)绾螌?SD 卡與 PIC 微控制器連接以將數(shù)據(jù)存儲(chǔ)到 SD 卡中。
測試和調(diào)試通信過程
電路和代碼完成后,我們在我們放入代碼中的調(diào)試日志的幫助下測試了電路。如您所見,我們使用 USB 到 UART 轉(zhuǎn)換器在我們使用 PuTTY 的串行監(jiān)視器窗口中記錄調(diào)試數(shù)據(jù)。
看到“創(chuàng)建文件成功”信息后,我們從SD卡模塊中取出SD卡,直接放入PC中驗(yàn)證文件是否創(chuàng)建,果然文件創(chuàng)建成功。
我們打開文件并檢查我們輸入的消息是否存在。它就在那里,這證明我們的代碼工作正常。
?
#include "mcc_generated_files/mcc.h"
#包括“ff.h”
FATFS FATF;/* 每個(gè)卷需要的 FatFs 工作區(qū) */
文件;/* 每個(gè)打開的文件需要的文件對象 */
無效閃爍_led(){
IO_RA1_Toggle();
}
/*
主要應(yīng)用
*/
無效主要(無效)
{
單位體重;
//初始化設(shè)備
SYSTEM_Initialize();
// 如果在 PIC18 高/低優(yōu)先級(jí)模式下使用中斷,則需要啟用全局高和低中斷
// 如果在 PIC 中檔兼容模式下使用中斷,則需要啟用全局和外設(shè)中斷
// 使用以下宏:
// 啟用全局中斷
INTERRUPT_GlobalInterruptEnable();
// 禁用全局中斷
//INTERRUPT_GlobalInterruptDisable();
// 啟用外設(shè)中斷
INTERRUPT_PeripheralInterruptEnable();
//禁用外設(shè)中斷
//INTERRUPT_PeripheralInterruptDisable();
TMR0_SetInterruptHandler(blink_led);
TMR0_StartTimer();
SD_LED_SetLow();
printf("############################################## ###########\r\n");
printf("與 PIC18 的 SD 接口\r\n");
printf("############################################## ###########\r\n");
printf("系統(tǒng)設(shè)置完成\r\n");
printf("\r\n=============開始與SD卡接口=============\r\n");
FRESULT stat = f_mount(&fatFs, "", 1);
if (stat == FR_OK) { /* 掛載 SD */
printf("SD卡掛載成功\r\n");
SD_LED_SetHigh();
if (f_open(&file, "Sd_test.txt", FA_OPEN_ALWAYS | FA_READ | FA_WRITE) == FR_OK) { /* 打開或創(chuàng)建文件 */
printf("創(chuàng)建文件成功\r\n");
if ((file.fsize != 0) && (f_lseek(&file, file.fsize) != FR_OK)) 轉(zhuǎn)到 endSD; /* 跳轉(zhuǎn)到文件末尾 */
f_write(&file, "大家好!\r\n", 13, &bw);
f_write(&file, "這是寫入 SD 卡的短信。更多信息請?jiān)L問www.circuitdigest.com \r\n", 99, &bw);
endSD: f_close(&file); /* 關(guān)閉文件 */
SD_LED_SetLow();
}別的{
printf("創(chuàng)建文件失敗\r\n");
SD_LED_SetLow();
}
}別的{
printf("SD卡掛載失敗\r\n ------ FRESULT %d ------\r\n");
}
printf("\r\n=============完成與SD卡的接口=============\r\n\r\n\r\n \r\n");
而(1){
// 添加您的應(yīng)用程序代碼
}
}
/**
文件結(jié)束
*/
評論
查看更多