本帖最后由 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 屏上显示信息。
|
|