当前位置: 首页 > news >正文

SD卡


程序函数分析

 

(一),初始化函数

SD_Error SD_Init(void)
{
	/*重置SD_Error状态*/
  SD_Error errorstatus = SD_OK;
  
  /* SDIO 外设底层引脚初始化*/
  GPIO_Configuration();

  /*对SDIO的所有寄存器进行复位*/
  SDIO_DeInit();  

  /*上电并进行卡识别流程,确认卡的操作电压 */
  errorstatus = SD_PowerON(); 

  /*如果上电,识别不成功,返回“响应超时”错误*/
  if (errorstatus != SD_OK)
  {
    /*!< CMD Response TimeOut (wait for CMDSENT flag) */
    return(errorstatus);	
  }

  /*卡识别成功,进行卡初始化  */
  errorstatus = SD_InitializeCards(); 

  if (errorstatus != SD_OK)	  //失败返回
  {
    /*!< CMD Response TimeOut (wait for CMDSENT flag) */
    return(errorstatus);
  }

  /* 配置SDIO外设
   *上电识别,卡初始化都完成后,进入数据传输模式,提高读写速度
   * 速度若超过24M要进入bypass
   */
  
  /* SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */  
  SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;

	/*上升沿采集数据*/
  SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;

	/* 时钟频率若超过24M,要开启此模式*/
  SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable; 
	
	/* 若开启此功能,在总线空闲时关闭sd_clk时钟 */
  SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
	
  /* 暂时配置成1bit模式 */	
  SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;

	/*硬件流,若开启,在FIFO不能进行发送和接受数据时,数据传输暂停*/
  SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable; 
	
  SDIO_Init(&SDIO_InitStructure);
  
  if (errorstatus == SD_OK)
  {
    /* 用来读取csd/cid寄存器*/
    errorstatus = SD_GetCardInfo(&SDCardInfo);	
  }

  if (errorstatus == SD_OK)
  {
    /* 通过cmd7,rca选择要操作的卡 */
    errorstatus = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));	  
  }

  if (errorstatus == SD_OK)
  {
			/* 最后为了提高读写,开启4bits模式*/
    errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);
  }  

  return(errorstatus);
}

 解析:

流程图

 

1.往SD卡传数据量大,会占用很大的CPU资源,为了防止他一直占用CPU资源,我们用DMA来处理数据,这个速度也很快;

 2.对于SD_PowerON()当中CMD*是对应寄存器中的命令,

CMD0: 没有返回响应

我们的板子上往往只接了一个卡,但SDIO总线可以并联许多个卡

3.SDIO支持的端口电压是2.6-3.8左右,发送CMD8来确定卡的供电电压是不是在这个范围,以及来判断卡的类型,是2.0的还是,,,

4.PWR UP位:确定好电压后,SD卡里面的寄存器PWR UP就会至1,表示电压已经确定好了,HCS位:0,标准的卡(小于2GB)1,大容量的卡(2-32GB) 32GB-2T的暂时没考虑

 

转载于:https://www.cnblogs.com/Ph-one/p/4031261.html

相关文章:

  • Java中的三大框架分别有什么用
  • DDR2是什么意思
  • FATFS(A)
  • 三星核S5PV210AH-A0 SAMSUNG
  • flash
  • RAM,ROM,NAND Flash,NOR Flash(A)
  • Android移植学习笔记
  • NRF24L01通信频率
  • 利用.bat(批处理)来删除KEIL编译生成的无用文件
  • SVC(STM32)
  • 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释
  • 鬼谷子七十二术(完整版)值得永久收藏!终生研读!
  • assert_param
  • stm32时钟树讲解
  • STM32系统时钟为什么没有定义呢
  • 【comparator, comparable】小总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • 10个确保微服务与容器安全的最佳实践
  • 2018一半小结一波
  • 230. Kth Smallest Element in a BST
  • Git初体验
  • JSONP原理
  • mysql 数据库四种事务隔离级别
  • PAT A1092
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue UI框架库开发介绍
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过几道题目学习二叉搜索树
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • ​ssh免密码登录设置及问题总结
  • ​ubuntu下安装kvm虚拟机
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (1)(1.13) SiK无线电高级配置(六)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (python)数据结构---字典
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (接口自动化)Python3操作MySQL数据库
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (转)ABI是什么
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net Redis的秒杀Dome和异步执行
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .NET上SQLite的连接
  • .NET序列化 serializable,反序列化
  • @Autowired多个相同类型bean装配问题
  • @JSONField或@JsonProperty注解使用
  • @property括号内属性讲解