如何将SD卡模块与PIC微控制器连接并在其中存储数据

如何将SD卡模块与PIC微控制器连接并在其中存储数据,第1张

  安全数字(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卡也按“写入速度”和“物理尺寸”分类

如何将SD卡模块与PIC微控制器连接并在其中存储数据,poYBAGLqNdqAE1fnAADpdZORb4g908.png,第2张

  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卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNdWAJ1Z8AAXKSnEt91Q493.png,第3张

  标准 SD 卡可以在 3 种模式下运行:

  1. SPI 模式引脚配置

如何将SD卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNdGAAqS5AAFw8Wj-ubE862.png,第4张

  2.一位 SD 模式引脚配置

如何将SD卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNc2AXnhBAAGLHBxewyM570.png,第5张

  3.四位 SD 模式引脚配置

如何将SD卡模块与PIC微控制器连接并在其中存储数据,poYBAGLqNcqAHeZTAAFyg_Aam9E034.png,第6张

  在这个项目中,我们将通过 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 微控制器的数据记录器的电路图。

如何将SD卡模块与PIC微控制器连接并在其中存储数据,poYBAGLqNcWAdGxBAAFPRbVHZNg474.png,第7张

  我们使用 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微控制器连接并在其中存储数据,pYYBAGLqNcKANTsBAAVdAJmPsn0495.png,第8张

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卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNbqAXgcoAAE5SSva7Jg649.png,第9张

  看到“创建文件成功”信息后,我们从SD卡模块中取出SD卡,直接放入PC中验证文件是否创建,果然文件创建成功。

如何将SD卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNbaAMzmRAAE_cOvIfeM018.png,第10张

  我们打开文件并检查我们输入的消息是否存在。它就在那里,这证明我们的代码工作正常。

如何将SD卡模块与PIC微控制器连接并在其中存储数据,pYYBAGLqNbKAD1P9AACTBXBPfsI345.png,第11张
 

#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){

// 添加您的应用程序代码

}

}

/**

文件结束

*/

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2718607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存