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

STM32的SDIO接口详解

目录

1. 定义与兼容性

2. SDIO时钟

3. SDIO命令与响应

4. SDIO块数据传输

5. SDIO控制器的硬件结构

6.代码实现

1.SD初始化

2.测试SD卡的读取

3.测试SD卡的写入


STM32的SDIO(Secure Digital Input/Output,安全数字输入输出)接口是一种用于连接外部设备(如SD卡、蓝牙模块、Wi-Fi模块等)的接口标准。以下是对STM32的SDIO接口的详细解析:

1. 定义与兼容性

  • SDIO是在SD卡接口的基础上发展而来,它兼容SD卡,并可以连接SDIO接口设备。
  • STM32的SDIO控制器支持多种存储卡和接口设备,包括多媒体卡(MMC卡)、SD存储卡、SDIO卡和CE-ATA设备。
  • STM32的SDIO控制器复位后,SDIO_D0用于数据传输。如果连接了多媒体卡,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。

2. SDIO时钟

  • SDIO适配器时钟(SDIOCLK):用于驱动SDIO适配器,可产生SDIO_CK时钟,其频率为45MHz(基于系统时钟为180MHz)。
  • APB2总线接口时钟(PCLK2):用于驱动SDIO的APB2总线接口,其频率为90MHz(基于系统时钟为180MHz)。
  • SDIO_CK计算公式SDIO_CK = SDIOCLK / (2 + CLKDIV)在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后可以设置为最大频率(但不可以超过SD卡最大操作频率)

3. SDIO命令与响应

  • 命令类型:分为应用相关命令(ACMD)和通用命令(CMD)两部分。发送ACMD时,需先发送CMD55。
  • 命令和响应传输:所有的命令和响应都是在SDIO_CMD引脚上面传输的,命令长度固定为48位。
  • 响应类型:STM32的SDIO接口支持短响应(48位)和长响应(136位)两种类型。

4. SDIO块数据传输

  • 数据传输方式:SDIO与SD卡通信一般以数据块的形式进行传输。从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带CRC校验。
  • 数据块读写
    • 读操作:单个数据块读的时候,在收到1个数据块以后即可停止,不需要发送停止命令(CMD12)。但多块数据读时,SD卡将一直发送数据给主机,直到接到主机发送的STOP命令(CMD12)。
    • 写操作:与读操作类似,但多了一个繁忙判断,新的数据块必须在SD卡非繁忙的时候发送。

5. SDIO控制器的硬件结构

STM32控制器的SDIO由SDIO适配器和APB2接口两部分组成:

  • SDIO适配器:提供SDIO主机功能,包括SD时钟、发送命令和进行数据传输。
  • APB2接口:用于控制器访问SDIO适配器寄存器,并可以产生中断和DMA请求信号。

6.代码实现

1.SD初始化

//SD卡初始化
//返回值:0 初始化正确;其他值,初始化错误
u8 SD_Init(void)
{u8 SD_Error;//初始化时的时钟不能大于400KHZ SDCARD_Handler.Instance=SDIO;SDCARD_Handler.Init.ClockEdge=SDIO_CLOCK_EDGE_RISING;          //上升沿     SDCARD_Handler.Init.ClockBypass=SDIO_CLOCK_BYPASS_DISABLE;     //不使用bypass模式,直接用HCLK进行分频得到SDIO_CKSDCARD_Handler.Init.ClockPowerSave=SDIO_CLOCK_POWER_SAVE_DISABLE;    //空闲时不关闭时钟电源SDCARD_Handler.Init.BusWide=SDIO_BUS_WIDE_1B;                        //1位数据线SDCARD_Handler.Init.HardwareFlowControl=SDIO_HARDWARE_FLOW_CONTROL_DISABLE;//关闭硬件流控SDCARD_Handler.Init.ClockDiv=SDIO_TRANSFER_CLK_DIV;            //SD传输时钟频率最大25MHZSD_Error=HAL_SD_Init(&SDCARD_Handler,&SDCardInfo);if(SD_Error!=SD_OK) return 1;SD_Error=HAL_SD_WideBusOperation_Config(&SDCARD_Handler,SDIO_BUS_WIDE_4B);//使能宽总线模式if(SD_Error!=SD_OK) return 2;return 0;
}

2.测试SD卡的读取

//测试SD卡的读取
//从secaddr地址开始,读取seccnt个扇区的数据
//secaddr:扇区地址
//seccnt:扇区数
void sd_test_read(u32 secaddr,u32 seccnt)
{u32 i; u8 *buf; u8 sta=0;buf=mymalloc(SRAMEX,seccnt*512);	//申请内存sta=SD_ReadDisk(buf,secaddr,seccnt);//读取secaddr扇区开始的内容if(sta==0)						{	 printf("SECTOR %d DATA:\r\n",secaddr);for(i=0;i<seccnt*512;i++)printf("%x ",buf[i]);//打印secaddr开始的扇区数据    	   printf("\r\nDATA ENDED\r\n"); }else printf("err:%d\r\n",sta);myfree(SRAMEX,buf);	//释放内存	   
}

3.测试SD卡的写入

//测试SD卡的写入(慎用,最好写全是0XFF的扇区,否则可能损坏SD卡.)
//从secaddr地址开始,写入seccnt个扇区的数据
//secaddr:扇区地址
//seccnt:扇区数
void sd_test_write(u32 secaddr,u32 seccnt)
{u32 i;u8 *buf; u8 sta=0; buf=mymalloc(SRAMEX,seccnt*512);		//从SDRAM申请内存for(i=0;i<seccnt*512;i++) buf[i]=i*3; 		//初始化写入的数据,是3的倍数.sta=SD_WriteDisk(buf,secaddr,seccnt);		//从secaddr扇区开始写入seccnt个扇区内容if(sta==0) printf("Write over!\r\n");		  
else printf("err:%d\r\n",sta);myfree(SRAMEX,buf);					//释放内存	   
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 梅特勒金属探测器检测仪维修SAFELINE V3-QF1
  • 2024年电脑录屏软件推荐:捕捉屏幕,记录生活,分享精彩
  • Flink 实时数仓(八)【DWS 层搭建(二)流量域、用户域、交易域搭建】
  • 【JavaEE初阶】CAS(比较和交换)
  • OrangePi AIpro学习4 —— 昇腾AI模型应用
  • 代码随想录算法训练营Day33 | 509. 斐波那契数 | 70. 爬楼梯 | 746. 使用最小花费爬楼梯
  • C++——模板进阶
  • 卷积神经网络 - 结构化输出篇
  • 【Linux】编译器gcc/g++ 、程序翻译过程、动静态库
  • springboot引入redis
  • UML建模-测试用例
  • c++的异常处理机制(try、catch、throw)
  • PDF——分割pdf的10个工具
  • 基于STC89C52单片机的U盘设计
  • SVN工作原理和使用示例
  • 分享一款快速APP功能测试工具
  • 【剑指offer】让抽象问题具体化
  • Angularjs之国际化
  • Bytom交易说明(账户管理模式)
  • codis proxy处理流程
  • SSH 免密登录
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 开发基于以太坊智能合约的DApp
  • 排序(1):冒泡排序
  • 前端
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 人脸识别最新开发经验demo
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 7行Python代码的人脸识别
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​力扣解法汇总946-验证栈序列
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define 用法
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (南京观海微电子)——COF介绍
  • (转)创业的注意事项
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitignore文件_Git:.gitignore
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET成年了,然后呢?
  • .NET委托:一个关于C#的睡前故事
  • ??myeclipse+tomcat
  • @我的前任是个极品 微博分析
  • []串口通信 零星笔记
  • [001-03-007].第07节:Redis中的管道
  • [145] 二叉树的后序遍历 js
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BJDCTF2020]The mystery of ip1
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)