SDIO/SD卡实验
实验内容
将SD卡插入实训平台并烧写程序,开机后TFTLCD屏幕上会显示是否成功初始化SD卡并显示SD卡容量。
电路原理图
实验原理
SD卡的通信方式有两种:SPI和SDIO。SD卡有五种寄存器,如下表
SD 卡的指令由 6 个字节组成,字节 1 的最高 2 位固定为 01,低 6 位为命令号字节 2~5 为命令参数,有些命令是没有参数的。字节 6 的高七位为 CRC 值,最低位恒定为 1。每发送一个命令,SD卡都会给出一个应答,以告知主机该命令的执行情况,或者返回主机需要获取的数据。
程序源码
首先要对SD卡进行初始化,在主函数中进行调用,这里仅展示主函数。
int main(void)
{
u8 key;
u32 sd_size;
u8 t=0;
u8 *buf=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
// KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
my_mem_init(SRAMIN); //初始化内部内存池
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,50,200,16,16,"WarShip STM32");
LCD_ShowString(30,70,200,16,16,"SD CARD TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2015/1/20");
LCD_ShowString(30,130,200,16,16,"KEY0:Read Sector 0");
while(SD_Init())//检测不到SD卡
{
LCD_ShowString(30,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
show_sdcard_info(); //打印SD卡相关信息
POINT_COLOR=BLUE; //设置字体为蓝色
//检测SD卡成功
LCD_ShowString(30,150,200,16,16,"SD Card OK ");
LCD_ShowString(30,170,200,16,16,"SD Card Size: MB");
LCD_ShowNum(30+13*8,170,SDCardInfo.CardCapacity>>20,5,16);//显示SD卡容量
while(1)
{
// key=KEY_Scan(0);
// if(key==KEY0_PRES)//KEY0按下了
{
buf=mymalloc(0,512); //申请内存
if(buf==0)
{
printf("failed\r\n");
continue;
}
if(SD_ReadDisk(buf,0,1)==0) //读取0扇区的内容
{
LCD_ShowString(30,190,200,16,16,"USART1 Sending Data...");
printf("SECTOR 0 DATA:\r\n");
for(sd_size=0;sd_size<512;sd_size++)printf("%x ",buf[sd_size]);//打印0扇区数据
printf("\r\nDATA ENDED\r\n");
LCD_ShowString(30,190,200,16,16,"USART1 Send Data Over!");
}
myfree(0,buf);//释放内存
while(1); //!!!!
}
t++;
delay_ms(10);
if(t==20)
{
LED0=!LED0;
t=0;
}
}
}
FATFS实验
实验内容
将Fatfs文件系统移植到SD卡中并利用Fatfs相关函数获取SD卡的总容量和剩余容量,最后在TFTLCD屏幕上显示。
FATFS
FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简单的修改。它支持FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
FATFS 的特点有:
• Windows 兼容的FAT 文件系统(支持FAT12/FAT16/FAT32)
• 与平台无关,移植简单
• 代码量少、效率高
• 多种配置选项
(1)支持多卷(物理驱动器或分区,最多 10 个卷)
(2)多个ANSI/OEM 代码页包括 DBCS
(3)支持长文件名、ANSI/OEM 或Unicode
(4)支持RTOS
(5)支持多种扇区大小
(6)只读、最小化的 API 和 I/O 缓冲区等
程序源码
int main(void)
{
u32 total,free;
u8 t=0;
u8 res=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usmart_dev.init(72); //初始化USMART
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化按键
LCD_Init(); //初始化LCD
// W25QXX_Init(); //初始化W25Q128
my_mem_init(SRAMIN); //初始化内部内存池
POINT_COLOR=RED; //设置字体为红色
LCD_ShowString(30,50,200,16,16,"STM32");
LCD_ShowString(30,70,200,16,16,"FATFS TEST");
LCD_ShowString(30,90,200,16,16,"STM32F103ZET6");
LCD_ShowString(30,110,200,16,16,"2015/1/20");
LCD_ShowString(30,130,200,16,16,"Use USMART for test");
while(SD_Init())//检测不到SD卡
{
LCD_ShowString(30,150,200,16,16,"SD Card Error!");
delay_ms(500);
LCD_ShowString(30,150,200,16,16,"Please Check! ");
delay_ms(500);
LED0=!LED0;//DS0闪烁
}
exfuns_init(); //为fatfs相关变量申请内存
f_mount(fs[0],"0:",1); //挂载SD卡
// res=f_mount(fs[1],"1:",1); //挂载FLASH.
// if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
// {
// LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting..."); //格式化FLASH
// res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
// if(res==0)
// {
// f_setlabel((const TCHAR *)"1:ALIENTEK"); //设置Flash磁盘的名字为:ALIENTEK
// LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish"); //格式化完成
// }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error "); //格式化失败
// delay_ms(1000);
// }
LCD_Fill(30,150,240,150+16,WHITE); //清除显示
while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
{
LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
delay_ms(200);
LCD_Fill(30,150,240,150+16,WHITE); //清除显示
delay_ms(200);
LED0=!LED0;//DS0闪烁
}
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(30,150,200,16,16,"FATFS OK!");
LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");
LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
LCD_ShowNum(30+8*14,170,total>>10,5,16); //显示SD卡总容量 MB
LCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB
while(1)
{
t++;
delay_ms(200);
LED0=!LED0;
}
}
实验结果
若fatfs初始化成功会显示FAFS ok字样,接着会显示SD卡总容量和剩余容量。