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); //串口初始化为115200LED_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); //串口初始化为115200usmart_dev.init(72); //初始化USMART LED_Init(); //初始化与LED连接的硬件接口KEY_Init(); //初始化按键LCD_Init(); //初始化LCD
// W25QXX_Init(); //初始化W25Q128my_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卡总容量 MBLCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB while(1){t++; delay_ms(200); LED0=!LED0;}
}
实验结果
若fatfs初始化成功会显示FAFS ok字样,接着会显示SD卡总容量和剩余容量。