打印
[应用相关]

SD卡与FatFS文件系统----AT_SURF案例15

[复制链接]
699|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 muyichuan2012 于 2022-3-31 19:37 编辑

SD卡与文件系统----AT_SURF案例15



简介
SD 存储卡是一种基于半导体快闪**器的新一代**设备,由于它体积小、容量大、传输速度快、
可热插拔等优良的特性、被广泛的应用于便携式装置。
SD 卡由松下电器、东芝、SanDisk 1999 年联合推出,数据传送和物理规范由MMC 发展而来,向下
兼容MMC 卡,SD 卡的通讯有一套标准的协议,关于协议的详细内容,请查看SD 卡协议。
如果SD 卡仅仅和单片机通讯,那么仅需要简单的直接对SD 卡进行数据读写就可以了,但是如果
SD 卡里面的数据,要能被电脑所识别,那么SD 卡内部的数据还需要符合电脑文件系统的格式,所
以在此就引出了文件系统,适合单片机的文件系统有很多比如FatFS、ThreadX FileX、RLFlashFS
、FreeRTOS FAT。
我们此次提供的demo 中使用的是FatFS,FatFS 是一个小型开源的文件系统,常用于小型嵌入式
系统中实现FAT 文件系统,FatFS 完全分离磁盘IO 层,不依赖硬件平台,它可以集成到资源有限的
小型微控制器中。
AT32-SUFR 板载了一个SD 卡,AT32F437 通过SDIO 接口和SD 卡通讯。


资源准备
 硬件环境:
对应产品型号的AT-SURF-F437 Board
 软件环境:
AT32F435_437_Firmware_Library_V2.x.x\project\at_sufr_f437\examples\sd_card

硬件设计
本案例使用的硬件资源有TFT LCD 液晶显示屏、SD 卡,对应的引脚如下:

表17. 硬件资源使用
编号        PIN  Name          外设功能            备注
1             PB4                   SDIO_D0            SD卡数据引脚0
2             PC9                   SDIO_D1            SD卡数据引脚1
3             PC10                 SDIO_D2            SD卡数据引脚2
4             PC11                 SDIO_D3            SD卡数据引脚3
5             PC12                 SDIO_CLK           SD卡时钟引脚
6             PD2                  SDIO_CMD         SD卡命令引脚


表18. PCA9555 使用
编号      PIN Name                    引脚功能            备注
1           IO0_3 Card_detect       SD卡检测引脚


图41. SD 卡电路原理图




图42. PCA9555 电路原理图


软件设计
1) SD 卡测试
 初始化TFT LCD
 初始化SD 卡
 对SD 卡读写文件
 将信息显示在LCD 屏上
2) 代码介绍
 main 函数代码描述

int main(void)
{
FRESULT ret;
UINT bytes_written = 0;
UINT bytes_read = 0;
DWORD fre_clust, fre_sect, tot_sect;
FATFS* pt_fs;
/* 初始化系统时钟 */
system_clock_config();
/* 初始化中断优先级分组 */
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
/* 初始化延时函数 */
delay_init();
/* 初始化LCD */
lcd_init(LCD_DISPLAY_VERTICAL);
/* 显示信息*/
lcd_string_show(10, 20, 200, 24, 24, (uint8_t *)"SD Card Test");
/* SD 卡以及fatfs 文件系统初始化 */
if(file_system_init() == SUCCESS)
{
lcd_string_show(10, 55, 200, 24, 24, (uint8_t *)"sd card init ok");
}
else
{
lcd_string_show(10, 55, 200, 24, 24, (uint8_t *)"sd card init error");
}
/* 打开文件,如果没有就创建文件 */
if((ret = f_open(&file, filename, FA_READ | FA_WRITE | FA_CREATE_ALWAYS)) != 0)
{
error_handler(ret);
}
/* 写数据到文件 */
if((ret = f_write(&file, write_buf, sizeof(write_buf), &bytes_written)) != 0)
{
error_handler(ret);
}
/* 移动文件指针到文件起始处 */

f_lseek(&file, 0);
/* 从文件读取数据 */
if((ret = f_read(&file, read_buf, sizeof(read_buf), &bytes_read)) != 0)
{
error_handler(ret);
}
/* 关闭文件*/
if((ret = f_close(&file)) != 0)
{
error_handler(ret);
}
pt_fs = &fs;
/* 获取磁盘剩余空间 */
ret = f_getfree("1:", &fre_clust, &pt_fs);
if(ret == FR_OK)
{
/* 获取总共空间和剩余空间(单位扇区) */
tot_sect = (pt_fs->n_fatent - 2) * pt_fs->csize;
fre_sect = fre_clust * pt_fs->csize;
/* 计算容量 */
tot_sect = tot_sect * 512 / 1024 / 1024;
fre_sect = fre_sect * 512 / 1024 / 1024;
/* 显示总容量 */
lcd_string_show(10, 100, 300, 24, 24, (uint8_t *)"card capacity: MB");
lcd_num_show(182, 100, 200, 24, 24, tot_sect, 1);
/* 显示剩余容量 */
lcd_string_show(10, 130, 300, 24, 24, (uint8_t *)"free capacity: MB");
lcd_num_show(182, 130, 200, 24, 24, fre_sect, 1);
}
/* 注销工作区 */
ret = f_mount(NULL, "1:", 1);
/* 对比写入和读出的数据 */
if(buffer_compare((uint8_t*)read_buf, (uint8_t*)write_buf, sizeof(write_buf)) == 0)
{
lcd_string_show(10, 175, 310, 24, 24, (uint8_t *)"file write/read ok");
}

else
{
lcd_string_show(10, 175, 310, 24, 24, (uint8_t *)"file write/read fail");
}
while(1)
{
}
}

下载验证
 对SD 卡读写文件,并比较读写文件数据是否正确。
 在LCD 屏上显示信息。



使用特权

评论回复
沙发
海滨消消| | 2022-4-2 15:01 | 只看该作者
学习学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

150

主题

1733

帖子

24

粉丝