安全数字(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){
// 添加您的应用程序代码
}
}
/**
文件结束
*/
评论
查看更多