你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【零基础学习STM32】第十三讲:SDIO实验——读取SD卡信息

[复制链接]
kkhkbb 发布时间:2018-4-19 09:32
本帖最后由 kkhkbb 于 2018-4-27 11:38 编辑

一、概述
    1.SDIO的定义
       SDIO在SD标准上定义了一种外设接口。目前,SDIO主要有两类应用——可移动和不可移动。可移动设备作为Palm和Windows Mobile的扩展设备,用来增加蓝牙、照相机、GPS和802.11b功能。不可移动设备遵循相同的电气标准,但不要求符合物理标准。某些手机内包含通过SDIO连接CPU的802.11芯片。此举将“珍贵”的I/ O管脚资源用于更重要的功能。
       蓝牙、照相机、GPS802.11b设备有专为它们定义的应用规范。这些应用规范与为PCIUSB设备定义的类规范很相像。它们允许任何宿主设备与任意外设通话,只要它们都支持应用规范。
      SDIOSD卡规范间的一个重要区别是增加了低速标准。SDIO卡只需要SPI1SD传输模式。低速卡的目标应用是以最小的硬件开支支持低速I/ O能力。低速卡支持类似调制解调器、条码扫描仪和GPS接受器等应用。对组合(存储器+ SDIO)而言,全速和4位操作对卡内存储器和SDIO部分都是强制要求的。
    2.SDIO的功能
      转换设备的能力 SD标准有很大的弹性,比方说,SD插槽不仅能插入内存卡。SDIO卡是一种界面,即由使用标准SD卡插槽来扩展设备的功能,让设备拥有新的功能。
      新功能列举如下:GPS 相机 Wi-Fi 调频广播 以太网 条形码读卡器 蓝牙; 将与SD memory card同样的终端形状的卡槽利用于扩张卡的规格。把对应SDIO卡槽(插口)称为SDIO卡,扩张卡称为SDIO卡。
      是为了在个人电脑和PDA等中添加功能而使用SD卡的规格,由于可以使用比PC卡形状还小的卡和插槽,相比于笔记本电脑,更多采用于小巧的PDA中。主要销售的产品有,面向PDAPHS通讯卡和蓝牙通讯卡,无线网卡,小型数码相机等。
      为了使用SDIO,必须要有对应的插槽,数码相机memory card的专用缝儿插槽不对应SDIO卡。SDIO插槽中能够插入SD memory card来读写。
      SD/SDIO MMC卡主机接口(SDIO)提供APB2外设总线与多媒体卡(MMC)、SD卡、SDIO卡以及CE-ATA设备之间的接口。
   3.SDIO具有如下主要特性:
  • 完全兼容多媒体卡系统规范版本4.2。卡支持三种不同数据总线模式:1位(默认)、4位和8位。
  • 完全兼容先前版本的多媒体卡(向前兼容性)。
  • 完全兼容SD存储卡规范版本2.0。
  • 完全兼容SDI/O卡规范版本2.0:卡支持两种不同数据总线模式:1位(默认)和4位。
  • 完全支持CE-ATA功能(完全符合CE-ATA数字协议版本1.1)。
  • 对于8位模式,数据传输高达48MHz。
  • 数据和命令输出使能信号,控制外部双向驱动程序。

4.SD卡识别过程:
    多媒体卡和SD卡的卡识别过程有所不同。对于多媒体,识别过程是以时钟速率开始。SDIO_CMD线输出驱动器是开楼引脚,在此识别过程中允许并行的卡操作。对准过程以如下方式完成:
(1)激活总线。
(2)SDIO卡主机广播SEND_OP_COND(CMD1)以接收运行条件。
(3)卡以其运行条件寄存器的内容进行响应。
(4)不兼容的卡将被置于无效状态。
(5)SDIO卡主机向所有有效广播ALL_SEND_CID(CMD2)。
(6)这些卡将发回其唯一的卡识别号(CID)并进入识别状态。
(7)SDIO卡主机向某个地址的有效卡发出SET_RELATIVE_ADDR(CMD3)。这一新地址称为相对卡地址(RCA);它比CID更短,可对卡进行寻址。分配的卡变为待机状态。SDIO卡主机可以重新发出此命令以更改RCA。卡的RCA是最后分配的值。
(8)SDIO卡主机对所有有效卡重复步骤5到7。
二、硬件电路
1.png
                 图13_0 SD卡槽电路图
三、实验原理
      STM32F407上带有SDIO控制器,iCore3核心板上将SDIO连接到TF卡座上。本实验将Micro SD卡插入TF卡座上即可。硬件连接示意图如下:
2.png
                图13_1  实验原理图
四、源代码
1.     主函数
  1. <div>/*
  2. * Name                : main
  3. * Description         : ---
  4. * Author              : ysloveivy.
  5. *
  6. * History
  7. * --------------------
  8. * Rev                 : 0.00
  9. * Date                : 12/01/2015
  10. *  
  11. * create.
  12. * --------------------
  13. */int main(void)
  14. {
  15.         int i;
  16.         led.initialize();
  17.         usart4.initialize(115200);
  18.         usart4.printf("\x0c");                           //清屏        
  19.         usart4.printf("\033[1;32;40m");             //设置字体终端为绿色
  20.         usart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n");
  21.         //判断SD卡是否初始化
  22.         if(SD_Init() != 0){
  23.                 usart4.printf("SD ERROR!\r\n");
  24.                 while(1){
  25.                         for(i = 0;i < 10000000;i++);
  26.                         LED_RED_ON;
  27.                         for(i = 0;i < 10000000;i++);
  28.                         LED_RED_OFF;
  29.                 }
  30.         }
  31. //输出SD卡的类型
  32. switch(SDCardInfo.CardType){</div><div>case SDIO_STD_CAPACITY_SD_CARD_V1_1:
  33.           usart4.printf("SDCardType\t\t:SDIO_STD_CAPACITY_SD_CARD_V1_1\r\n");
  34.                         break;
  35. case SDIO_STD_CAPACITY_SD_CARD_V2_0:
  36.           usart4.printf("SDCardType\t\t:SDIO_STD_CAPACITY_SD_CARD_V2_0\r\n");
  37.                         break;
  38. case SDIO_HIGH_CAPACITY_SD_CARD:
  39.           usart4.printf("SDCardType\t\t:SDIO_HIGH_CAPACITY_SD_CARD\r\n");
  40.                         break;</div><div> case SDIO_MULTIMEDIA_CARD:
  41.           usart4.printf("SD CardType\t:SDIO_MULTIMEDIA_CARD\r\n");
  42.                         break;
  43.         }
  44. //输出SD卡的参数
  45.         usart4.printf("SD CardCapacity\t\t: %dMB\r\n",(unsigned long int)(SDCardInfo.CardCapacity >> 20));
  46.         usart4.printf("SDCardBlockSize\t: %dByte\r\n",SDCardInfo.CardBlockSize);
  47.         usart4.printf("SD RCA \t\t\t: %d\r\n",SDCardInfo.RCA);
  48.         usart4.printf("SDManufacturerID\t: %d\r\n",SDCardInfo.SD_cid.ManufacturerID);
  49.         while(1){
  50.                         for(i = 0;i < 10000000;i++);
  51.                         LED_GREEN_ON;
  52.                         for(i = 0;i < 10000000;i++);
  53.                         LED_GREEN_OFF;
  54.         }
  55. }</div>
复制代码
2.SDIO配置结构体
  1. <div>  SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV + 2;
  2.   SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
  3.   SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
  4.   SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
  5.   SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
  6.   SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
  7.   SDIO_Init(&SDIO_InitStructure);
  8. </div>
复制代码
3.SD卡初始化程序
  1. SD_Error SD_Init(void)
  2. {
  3.   __IO SD_Error errorstatus = SD_OK;

  4. NVIC_InitTypeDef NVIC_InitStructure;

  5. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  6. // SDIO Interrupt ENABLE
  7. NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
  8. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  9. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  10. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  11. NVIC_Init(&NVIC_InitStructure);
  12. // DMA2 STREAMx Interrupt ENABLE
  13. NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
  14. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  15. NVIC_Init(&NVIC_InitStructure);
  16. /* SDIO Peripheral Low Level Init */
  17. SD LowLevel Init ();
  18. SDIO DeInit();
  19. errorstaus = SD PowerON();
  20. if (errorstatus ! = SD_OK)
  21. {
  22.    /*!<CMD Response TimeOut(wait for CMDSENT flag) */
  23.    return(errorstatus);
  24. }
  25. errorstatus = SD InitializeCards();
  26. if (errorstatus != SD_OK)
  27. if (errorstatus !=SD_OK)
  28. {
  29.   /*!< CMD Response TimeOut (wait for CMDSENT flag) */
  30.    return(errorstatus);
  31. }
复制代码
五、实验现象
      端显示屏上可以看到Micro SD卡的信息,如下图:
3.png
               图13_2  实验现象显示图
六 、代码包下载
       网盘:https://pan.baidu.com/s/1hqM787E





























收藏 评论1 发布时间:2018-4-19 09:32

举报

1个回答
zzzhuzhe 回答时间:2020-2-28 17:11:07
请问博主 SDCardInfo.CardType 是什么意思啊

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版