安全数字(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){
// 添加您的应用程序代码
}
}
/**
文件结束
*/
大模型参数达百万亿级别,AI商业化进程加速!
发电机保护系统巡检 发电机保护系统巡检
亨通光电全新的5G智慧应用正式上线
一季度电信业务收入3383亿 移动互联网流量357亿GB
LED显示屏中的尖端技术是什么
如何将SD卡模块与PIC微控制器连接并在其中存储数据
pppoe什么意思_pppoe连接不上怎么办
DRAM,NAND闪存价格分别下降11%,21% SK海力士预计今年设备投资削减40%
中国移动与南通移动联手打造5G网络建设和5G融合应用新高地
比特币突破2.1万美元,创下历史新高
基于机智云技术的智能宠物管理系统
如何理解数字电位器
RAM long数据数据烧写到0x1800 Flash中的方法
百度无人车亮相世界互联网大会
专家PK:诺基亚会不会“卖身”微软?
汇顶科技正在积极研发一种LCD屏的光学指纹识别方案
云测试解决传统测试痛点,已形成垂直平台和巨头两大派别
通过超低功耗FLASH单片机实现微波辐射成像系统的设计
智能电网的智能在哪里?从神奇的配电系统出发体验
魅族Pro7发布会倒计时:魅族Pro7配置泄露提前看,魅族Flyme6加持设计升级