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