基于STM32的SDIO用4位总线24MHZDMA模式操作SHDC卡
智芯STM32开发板SD卡资料SD卡要点说明
SD 卡 要 点 说 明
Written by pasyong
SD卡有两个可选的通信协议:SD模式和SPI模式。
为了电路的简化,选用SPI模式。
模式选择;SD卡默认为SD模式,要进入SPI模式时,要遵守如下操作。
当SD卡接收RESTE命令(CMD0)时,拉低CS即可。
命令CMD0就是0,CMD16就是16,其它以此类推。
SPI命令格式如下,由6个字节构成,高位在前。
SPI模式下Command从CMD0到CMD63。
Command Argument为附加命令,有些CMD命令有,有些无,CRC为校验字节。
下图是SPI模式下的命令分类表。
SPI命令分为11个组,各个组是多个命令的集合,每个组中的命令有相似的功能。
这里介绍三个常用命令。
CMD0,CMD1,CMD16
CMD0 为复位,CMD1为激活初始化,CMD16设置一个读写块的长度。
有些命令发送出去后会有返回值,表示的是错误码。
比如CMD0,CMD1返回值是R1格式的。
一个字节长,0,7位是0,其它位表示错误码。
SD卡初始化
在上电后,主机启动SCK及在CMD线上发送74个高电平的信号,接着发送CMD0进入SPI 模式,然后发送CMD1激活初始化进程。
读扇区:SD卡允许以块数据进行读写,在这里我们用CMD16命令设定每读写的块为512字节,正好是一个扇区。
设置好后用CMD17读块命令读取512放入缓冲区既可。
野火stm32-MicroSD卡(单纯读block)3.5.0-SDIO_4bit
SDIO_SD卡4bit模式详解实验描述:MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。
没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上打印出来。
硬件连接:PC12-SDIO-CLK:CLKPC10-SDIO-D2 :DATA2PC11-SDIO-D3:CD/DATA3PD2-SDIO-CMD :CMDPC8-SDIO-D0:DATA0PC9-SDIO-D1:DATA1库文件:startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/misc.c用户文件: USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdio_sdcard.c野火STM32开发板 MicroSD卡硬件原理图:SDIO简介->野火STM32开发板的CPU ( STM32F103VET6 )具有一个SDIO接口。
SD/SDIO/MMC主机接口可以支持MMC卡系统规范4.2版中的3个不同的数据总线模式:1位(默认)、4位和8位。
在8位模式下,该接口可以使数据传输速率达到48MHz,该接口兼容SD存储卡规范2.0版。
SDIO存储卡规范2.0版支持两种数据总线模式:1位(默认)和4位。
目前的芯片版本只能一次支持一个SD/SDIO/MMC 4.2版的卡,但可以同时支持多个MMC 4.1版或之前版本的卡。
除了SD/SDIO/MMC,这个接口完全与CE-ATA数字协议版本1.1兼容。
知识准备:大多数人原来没有了解过SD协议,又看到SDIO的驱动有2000多行,感觉无从下手。
【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(六)-FatFs使用的思路介绍
f_open打开/创建⽂件f_close关闭⽂件f_read读取⽂件f_write写⼊⽂件f_lseek移动读/写指针,扩展⼤⼩f_truncate 截断⽂件f_sync 刷新缓存数据f_forward 转移⽂件数据到⼀个数据流f_expand 为⽂件分配⼀个连续的块f_gets 读取⼀个字符串(string )f_putc写⼊⼀个字符(character )f_puts写⼊⼀个字符串(string )f_printf写⼊⼀个格式化字符串f_tell获取当前读/写指针f_eof⽂件结束测试f_size获取长度f_error测试错误f_opendir 打开⼀个⽬录f_closedir 关闭⼀个已打开的⽬录f_readdir 读取⽬录f_findfirst 打开⼀个⽬录并读取匹配的第⼀个项⽬f_findnext 查找下⼀个匹配的项⽬【STM32】使⽤SDIO 进⾏SD 卡读写,包含⽂件管理FatFs (六)-FatFs 使⽤的思路介绍本篇要来介绍⽂件管理FatFs官⽅的⽹站是:这是⼀个⽇本⼈写的,除了⽂件管理以外,还有其他的,例如解码JPEG 、红外遥控等在官⽹链接内,最下⽅有个Return ,点击后就可以看到相关的开源库以下开始正题(本⽂⾥提到的媒介,其实就是设备了,我不想改图了...)打开官⽅⽹站,页⾯简单明了,就分为4个区块(以下图⽚为FatFs 官⽹上截取的图⽚)第⼀区块、介绍及特性(Features ):FatFs 是⽂件管理系统,可⽤于SD 卡、硬盘(ATA )、RTC 时钟,FTL 和etc 不清楚是什么,另外,也可以⽤于Flash 或是EEPROM第⼆区块、应⽤接⼝(Application Interface ):FatFs 提供了接⼝,使得我们的应⽤可以和它交互。
官⽹左侧为⼀些接⼝的介绍,分四个部分第⼀部分:File Access (⽂件存取)第⼆部分:Directory Access (⽬录访问)f_stat 检查⽂件或⼦⽬录是否存在f_unlink 删除⽂件或⼦⽬录f_rename 重命名/移动⽂件或⼦⽬录f_chmod 更改⽂件或⼦⽬录的属性f_utime更改⽂件或⼦⽬录的时间戳f_mkdir创建⼦⽬录f_chdir 更改当前⽬录f_chdive 更改当前驱动f_getcwd 检索当前⽬录和驱动f_mount注册/注销⼀个⼯作区(挂起与否)f_mkfs在逻辑驱动上创建⼀个FAT 卷f_fdisk 在物理驱动上创建分区f_getfree 获取卷上的可⽤空间f_getlabel 获取卷标f_setlabel 设置卷标f_setcp设置活动代码页disk_status获取设备状态disk_initialize 初始化设备disk_read读取数据disk_write写⼊数据disk_ioctl控制设备相关功能get_fattime 获取当前时间第三部分:File and Dirextor Management (⽂件和⽬录管理)第四部分:Volume Management and System Configuration (卷管理和系统配置)第三区块、媒介访问接⼝(Media Access Interface ):你想管理的存储设备,必须要和FatFs 链接。
stm32dma原理
STM32 DMA原理详解概述直接存储器访问(Direct Memory Access, DMA)是一种用于数据传输的技术,它可以在不占用CPU的情况下,实现高速、高效的数据传输。
STM32系列微控制器中集成了DMA控制器,使得外设与内存之间的数据传输更加灵活和高效。
本文将详细介绍STM32 DMA的基本原理,包括DMA控制器的结构、工作模式以及配置方法等内容。
DMA控制器结构STM32系列微控制器中的DMA控制器通常由一个或多个DMA通道组成。
每个DMA通道都有自己独立的寄存器集合,用于配置和控制该通道的数据传输。
下图展示了一个典型的STM32 DMA控制器结构。
在这个结构中,我们可以看到以下几个主要组件:1.DMA通道:每个DMA通道都有自己独立的配置寄存器和状态寄存器。
通过配置寄存器可以设置源地址、目标地址、数据长度等参数,通过状态寄存器可以获取当前传输状态。
2.数据总线:连接CPU、内存和外设。
3.外设:与DMA进行数据传输的外设。
4.中断控制器:用于处理DMA传输完成或错误时产生的中断。
5.DMA总线:用于连接DMA通道和数据总线。
DMA工作模式STM32 DMA控制器支持多种工作模式,以适应不同的数据传输需求。
下面介绍几种常见的DMA工作模式:1.直接模式(DMA Direct Mode):在直接模式下,DMA通道直接将外设的数据读取到内存或者将内存中的数据写入外设,不经过CPU。
这种模式适用于大量数据传输,可以提高传输效率。
2.循环模式(DMA Circular Mode):在循环模式下,DMA通道会循环执行一次传输操作,即当一次传输完成后,会自动重新开始下一次传输。
这种模式适用于连续性数据流的传输。
3.波形生成模式(DMA Waveform Generation Mode):在波形生成模式下,DMA通道可以按照预设波形数据从内存中读取数据,并通过外设输出。
这种模式适用于产生周期性波形信号。
SDIO协议规范
SDIO协议规范篇一:SDIO协议简介SDIO卡SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等。
SDIO协议是由SD卡的协议演化升级而来的,很多地方保留了SD卡的读写协议,同时SDIO协议又在SD卡协议之上添加了CMD52和CMD53命令。
由于这个,SDIO和SD卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开始来支持低速I/O能力。
低速卡支持类似调制解调器,条形码扫描仪和GPS接收器等应用。
高速卡支持网卡,电视卡还有“组合”卡等,组合卡指的是存储器+SDIO。
SDIO和SD卡的SPEC间的又一个重要区别是增加了低速标准。
SDIO卡只需要SPI和1位SD传输模式。
低速卡的目标应用是以最小的硬件开支来支持低速I/O能力,低速卡支持类似MODEM,条形扫描仪和GPS接收器等应用。
对组合卡来说,全速和4BIT操作对卡内存储器和SDIO部分都是强制要求的。
在非组合卡的SDIO设备里,其最高速度要只有达到25M,而组合卡的最高速度同SD卡的最高速度一样,要高于25M。
SDIO总线SDIO总线和USB总线类似,SDIO总线也有两端,其中一端是主机(HOST)端,另一端是设备端(DEVICE),采用HOST-DEVICE这样的设计是为了简化DEVICE的设计,所有的通信都是由HOST端发出命令开始的。
在DEVICE端只要能解溪HOST 的命令,就可以同HOST进行通信了。
SDIO的HOST可以连接多个DEVICE,如下图所示:这个是同SD的总线一样的,其中有如下的几种信号1. CLK信号:HOST给DEVICE的时钟信号.2. CMD信号:双向的信号,用于传送命令和反应。
3. DAT0-DAT3 信号:四条用于传送的数据线。
4. VDD信号:电源信号。
STM32与SD卡通信各层分析
STM32与SD卡通信各层分析最近做了一些STM32和SD卡通信的一些思考,一直以来SD的驱动和应用困扰了我很久,寒假的时候看到SD简化版物理层协议的时候就傻掉了,看到SD的驱动快3000行的代码也动摇了。
这几天几种地看了一下SD卡的相关内容,总结了一些体会,感觉也没有那么恐怖了。
我决定从分层上来讨论SD的驱动和应用,因为这样可以构建一个清晰的逻辑,且不知哪位计算机大师曾说过:一切计算机问题都可以用分层的方法来解决。
我自己把SD卡从驱动到应用共分为4层,从下至上依次为:驱动层、物理层、文件系统层、应用层。
下面一一来介绍各层的一些重要的操作。
1)驱动层驱动层,对应到ST的库,就是stm32f10x_sdio.c/.h这个两文件。
其实使用任何一个STM32的外设,只要用库函数都离不开这一对互相对应的.c/.h文件。
对于SDIO外设来说,它就是用来操作寄存器的,由于涉及ST库函数的编写,没能力参透,在此不赘述它的实现过程。
2)物理层这一层可以说是承上启下的一层,下接驱动层,用于操作寄存器,上接文件系统层,用于统一管理文件,可谓整个SD驱动的核心代码。
其实,如果对于SD的要求不高,可以直接在这一层上面进行文件操作,只是没有文件系统操作起来实在不便。
之所以叫物理层是因为这一部分的代码主要参考了SD卡物理层简化协议这样一个东西。
这个协议规定了控制器对SD卡操作的各种指令的格式和操作时序。
这一层对应了源代码中的sdio_sdcard.c/.h这两个文件,那么它主要实现了什么功能呢?这一层最重要的一个函数就是SD_Init()SD卡的初始化函数。
这函数包括了SD卡的上电、识别、卡初始这三个重要步骤,分别对应两个子函数SD_PowerOn、SD_IniTIalizeCards(),而SD_IniTIalizeCards()的返回值包含了卡的类型信息。
这两个子函数的实现则是通过STM32内置的SDIO控制器发送CMD命令完成,这个命令的发送要严格遵守SD协议的流程图,而且要及时进行标志位判断,否则很容易程序跑飞了。
stm32SPI模式读写SD卡
stm32SPI模式读写SD卡SPI模式读写SD卡SD卡初始化过程:1. 初始化STM32的SPI接口使用低速模式2. 延时至少74clock3. 发送CMD0,需要返回0x01,进入Idle状态4. 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态5. 设置读写block大小为512byte5. 把STM32的SPI设置为高速模式读一个block块的过程1. 发送CMD17(单块)或CMD18(多块)读命令,返回0x002. 接收数据开始令牌0xfe + 正式数据512Bytes + CRC 校验2Bytes写一个block块的过程1. 发送CMD24(单块)或CMD25(多块)写命令,返回0x002. 发送数据开始令牌0xfe + 正式数据512Bytes + CRC校验2Bytes/******************************************************************* ************* Function Name : SD_MMC_SPI_Init* Description : SD_MMC_SPI_Init* Input : None* Output : None* Return : zero init success, non-zero init error************************************************************************ *******/u8 SD_MMC_SPI_Init(void){GPIO_InitTypeDef GPIO_InitStructure;/* Enable SPI1 and GPIO clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE);/* Configure SPI1 pins: SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure SD_MMC_SPI_CS */GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SD_MMC_SPI_CS, &GPIO_InitStructure);///////////////////////////////////////////////////////////////////////////////* initialize SPI with lowest frequency */SD_MMC_Low_Speed();/* card needs 74 cycles minimum to start up */for(u8 i = 0; i < 10; ++i) {/* wait 8 clock cycles */ SD_MMC_ReadWrite_Byte(0x00); } /* address card */ SD_MMC_SPI_SELECT();/* reset card */u8 response;for(u16 i = 0; ; ++i){response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE ,0 );if( response == 0x01 ) break;if(i == 0x1ff) {SD_MMC_SPI_DESELECT(); return 1;}}/* wait for card to get ready */ for(u16 i = 0; ; ++i) {response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);if(!(response & (1 << R1_IDLE_STATE)))break;if(i == 0x7fff) {SD_MMC_SPI_DESELECT(); return 1;}}/* set block size to 512 bytes */if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512)) {SD_MMC_SPI_DESELECT();return 1;}/* deaddress card */SD_MMC_SPI_DESELECT();/* switch to highest SPI frequency possible */ SD_MMC_High_Speed();return 0;//////////////////////////////////////////////////////////////////// //////////}/******************************************************************* ************* Function Name : SD_MMC_Read_Single_Block * Description :SD_MMC_Read_Single_Block * Input : sector number and buffer data point * Output : None* Return : zero success, non-zero error************************************************************************ *******/u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer) {u8 Response;u16 i;u16 Retry = 0;//读命令 send read commandResponse =SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9); if(Response != 0x00)return Response;SD_MMC_SPI_SELECT();// start byte 0xfewhile(SD_MMC_ReadWrite_Byte(0xff) != 0xfe) {if(++Retry > 0xfffe){SD_MMC_SPI_DESELECT();return 1; //timeout}}for(i = 0; i < 512; ++i) {//读512个数据*buffer++ = SD_MMC_ReadWrite_Byte(0xff); }SD_MMC_ReadWrite_Byte(0xff); //伪crcSD_MMC_ReadWrite_Byte(0xff); //伪crcSD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff); // extra 8 CLKreturn 0;}/******************************************************************* ************* Function Name : SD_MMC_Write_Single_Block* Description : SD_MMC_Write_Single_Block * Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error.************************************************************************ *******/u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer) {u8 Response;u16 i;u16 retry=0;//写命令 send write commandResponse =SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, sector<<9);if(Response != 0x00)return Response;SD_MMC_SPI_SELECT();SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);//发开始符 start byte 0xfeSD_MMC_ReadWrite_Byte(0xfe);//送512字节数据 send 512 bytes datafor(i=0; i<512; i++){SD_MMC_ReadWrite_Byte(*buffer++);}SD_MMC_ReadWrite_Byte(0xff); //dummy crc SD_MMC_ReadWrite_Byte(0xff); //dummy crcResponse = SD_MMC_ReadWrite_Byte(0xff);//等待是否成功 judge if it successfulif( (Response&0x1f) != 0x05){SD_MMC_SPI_DESELECT();return Response;}//等待操作完 wait no busywhile(SD_MMC_ReadWrite_Byte(0xff) != 0x00) {if(retry++ > 0xfffe){SD_MMC_SPI_DESELECT();return 1;}}SD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff);// extra 8 CLKreturn 0;}if( SD_MMC_SPI_Init() ==1)printf(" _SD_MMC Initialization ERROR\r\n"); else{printf(" _SD_MMC Initialization OK\r\n"); //memset(buffer,0,512); //读取一个扇区的内容这里读的是0扇区SD_MMC_Read_Single_Block( 0 , buffer );Uart1_PutString( buffer , 512 );}。
基于STM32的AD采集与SD卡数据存储
基于STM32的AD采集与SD卡数据存储作者:杜佳良丁亚东赵俊杰来源:《电脑知识与技术》2016年第12期摘要:设计一种基于STM32的AD信号采集并且将采集相关信息在SD卡上存储的系统。
利用计算机软件将SD卡上的文本格式数据信息转换成EXCEL格式,方便用户对信息进行查询管理,在实际工程中具有很高的应用价值。
关键词:STM32;SD卡;数据存储中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)12-0235-03Abstract:Based on STM32,designing an analog to digital acquisition and related information will be collected on the SD card storage system. Using computer software to convert the text format data on the SD card into EXCEL format, user-friendly information query has a high value in the actual project.Key words: STM32; SD card; data storage随着工业自动化的发展,控制设备在各领域得到了广泛的应用。
在一个控制系统中,外界的传感器相当于一个系统的“鼻子”和“眼睛”,往往决定系统中下一步的动作,是一个系统的关键。
现在的32位处理器基本都具有ADC模块,免去了使用8位单片机需要外搭ADC电路的过程,简化电路设计并提高了转换的快速性和准确性。
现在加工制造业的迅速发展,对系统数据的实时性也提出了更高的要求,迫切需要一种简单方便的方式对大量数据进行存储。
大型控制系统通常会采用485通讯、以太网的方式将数据直接传送到上位机,建立数据库,而对于一些小型控制设备,这会大大增加设备的成本,相比之下,利用单片机和存储介质就地存储就显得更有优势。
STM32CubeMX生成SDIO FATFS程序
用STM32CubeMX快速生成一个SDIO+FATFS程序前提:默认已经装好MDK V5和STM32CubeMX。
硬件平台:STM32F4xx系列,并通过SDIO连接SD卡。
Step1.新建工程。
选择芯片型号。
Step2.配置时钟引脚。
Step3.配置SDIO为SD 4bit宽度总线。
Step4.使用FATFS中间件。
Step5.配置时钟树,SDIO模块输入要求为48MHz时钟Step6.配置SDIO时钟分频系数CLKDIV。
计算公式为SDIO_CK = 48MHz/(CLKDIV+2)。
如下图,CLKDIV=2,则SDIO时钟SDIO_CK=48MHz/(2+2)=12MHz。
Step7.使用DMA传输。
Step8.使能SDIO中断。
Step9.配置NVIC。
注意,此处要求SDIO中断优先级必须高于DMA2 stream3和DMA2 stream6的中断优先级。
因此,将DMA2 stream3和DMA2 stream6的中断优先级都将为2(或者更低)。
Step10.配置FATFS文件系统。
如果要支持中文文件名,则要配置PAGE_CODE项为中文。
如果要支持长文件名,要使能USE_LFN。
本程序全部使用默认值。
Step11. 生成MDK工程及代码。
特别注意,一定要加大堆栈大小,默认的堆栈大小不够用。
Step12.打开MDK工程。
Step13.选择芯片型号Step14.编译工程。
Step15.添加代码。
这时,就需要参考STM32CubeF4的例程了。
解压stm32cubef4.zip支持包,可以得到如STM32Cube_FW_F4_V1.9.0的文件夹。
其中就包含了STM32CubeF4的使用例程。
SD+FATFS的例程在STM32Cube_FW_F4_V1.9.0\Projects\STM324xG_EVAL\Applications\FatFs\FatFs_uSD目录下。
打开其中的MDK-ARM目录下的工程,参考其中main.c的代码。
ALIENTEK STM32 SDIO+4位 DMA模式教程(寄存器+精简+稳定版)
表 1.3.2 SDIO 命令格式 长响应的格式如表 1.3.3 所示:
表 1.3.3 SDIO 命令格式 同样,硬件为我们滤除了开始位、传输位、CRC7 以及结束位等信息,对于短响应,命 令索引存放在 SDIO_RESPCMD 寄存器,参数则存放在 SDIO_RESP1 寄存器里面。对于长响应, 则仅留 CID/CSD 位域,存放在 SDIO_RESP1~SDIO_RESP4 等 4 个寄存器。 SD 存储卡总共有 5 类响应(R1、R2、R3、R6、R7),我们这里以 R1 为例简单介绍一下。 R1(普通响应命令)响应输入短响应,其长度为 48 位,R1 响应的格式如表 1.3.4 所示:
SDIO_CK=SDIOCLK/(2+CLKDIV) 其中,SDIOCLK 为 HCLK,一般是 72Mhz,而 CLKDIV 则是分配系数,可以通过 SDIO 的 SDIO_CLKCR 寄存器进行设置(确保 SDIO_CK 不超过卡的最大操作频率)。 这里要提醒大家,在 SD 卡刚刚初始化的时候,其时钟频率(SDIO_CK)是不能超过 400Khz 的,否则可能无法完成初始化。在初始化以后,就可以设置时钟频率到最大了(但不可超过 SD 卡的最大操作时钟频率)。
2013-03-10
ALIENTEK STM32开发板
AN1302
图 1.4.2 SDIO_CLKCR 寄存器位定义 从上图可以看出时钟控制寄存器的最低 8 位,用于控制 SDIO_CK 的分配,位 8 用于控 制 SDIO_CK 的开启和关闭。我们还可以通过位[12:11],控制 SDIO 的数据位宽。 第三个,我们要介绍的是 SDIO 参数制寄存器(SDIO_ARG),该寄存器比较简单,就是 一个 32 位寄存器,用于存储命令参数,不过需要注意的是,必须在写命令之前先写这个参 数寄存器! 第四个,我们要介绍的是 SDIO 命令响应寄存器(SDIO_RESPCMD),该寄存器为 32 位, 比较简单,用于存储最后收到的命令响应中的命令索引。如果传输的命令响应不包含命令索 引,则该寄存器的内容不可预知。 第五个,我们要介绍的是 SDIO 响应寄存器组(SDIO_RESP1~SDIO_RESP4),该寄存器组 总共由 4 个 32 位寄存器组成,用于存放接收到的卡响应部分信息。如果收到短响应,则数 据存放在 SDIO_RESP1 寄存器里面,其他三个寄存器没有用到。而如果收到长响应,则依次 存放在 SDIO_RESP1~ SDIO_RESP4 里面,如表 1.4.1 所示:
零死角玩转stm32-高级篇1、SDIO(4bit + DMA、支持SDHC、带协议分析)
0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!1、SDIO(4bit + DMA、支持SDHC)1.1 实验描述及工程文件清单实验描述MicroSD卡(SDIO模式)测试实验,采用4bit数据线模式。
没有跑文件系统,只是单纯地读block并将测试信息通过串口1在电脑的超级终端上打印出来。
硬件连接PC12-SDIO-CLK:CLKPC10-SDIO-D2 :DATA2PC11-SDIO-D3:CD/DATA3PD2-SDIO-CMD :CMDPC8-SDIO-D0:DATA0PC9-SDIO-D1:DATA1用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_sdio.cFWlib/stm32f10x_dma.cFWlib/misc.c用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/sdio_sdcard.c野火STM32开发板 MicroSD卡硬件原理图:1.2 SDIO简介野火STM32开发板的CPU ( STM32F103VET6 )具有一个SDIO接口。
基于STM32的SDIO用4位总线24MHZDMA模式操作SHDC卡
基于STM32的SDIO用4位总线24MHZDMA模式操作SHDC卡很蛋疼的发现网上很多所谓的SDIO操作SHDC无意例外都是官方的那个烂玩意,完全没有修改过,所以很多时候根本无法初始化SHDC,我也在网上看到很多人关于这部分的疑问,虽然STM32的SDIO的确是可以这样操作。
但是很佩服那群人,什么都没改就发上来,把哥我害惨了。
经过查资料,追踪,最后运气可佳。
我发现自己的金士顿4GSD卡(class4)不能初始化跟用4位总线dma操作的原因。
各位也可以上网去找别人的试试,很多人都说不能用4位总线操作,而且用1位总线也只能是在低速率以及开启流控的情况下。
而且经常出错。
而4位总线总是提示没有检测到起始位。
但是他们都只会问,都没有去想象为什么,我也是。
但是后来发现。
STM32的SDIO是完全没问题的,可以读写SHDC,用4位总线24MHZ工作在DMA模式,大家看我修改出来的例程就知道了。
看我改过的地方,对比下官方的。
首先:在配置的时候,一开始的时候sd卡需要有至少发74个时钟使它自己初始话,这是2.0规范要求的,但是你们自己看看官方的,完全没有这个,我一直追踪,发先在电源初始化那里就已经卡住了- -|||。
于是我在那里面加入了一个发送74个时钟的小代码。
SD_Error SD_PowerON(void){SD_Error errorstatus = SD_OK;uint32_t response = 0, count = 0;bool validvoltage = FALSE;uint32_t SDType = SD_STD_CAPACITY;int16_t i = 0;/* Power ON Sequence-------------------------------------------------------*//* Configure the SDIO peripheral */SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV; /* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising; SDIO_InitStructure.SDIO_ClockBypass =SDIO_ClockBypass_Disable;SDIO_InitStructure.SDIO_ClockPowerSave =SDIO_ClockPowerSave_Disable;SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;SDIO_InitStructure.SDIO_HardwareFlowControl =SDIO_HardwareFlowControl_Disable;SDIO_Init(&SDIO_InitStructure);/* Set Power State to ON */SDIO_SetPowerState(SDIO_PowerState_ON);/* Enable SDIO Clock */SDIO_ClockCmd(ENABLE);/* CMD0: GO_IDLE_STATE-------------------------------------------------------*/ /* No CMD response required */SDIO_CmdInitStructure.SDIO_Argument = 0x0;SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_GO_IDLE_STATE; SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;看到没有,就是画线的那个,这个用37也可以了。
STM32外设SDIO应用之SD卡
STM32外设SDIO 应用之SD 卡一、SD 原理及内部结构SD 卡(Secure Digital Memory Card )是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD 卡允许在两种模式下工作,即SD 模式和SPI 模式。
1、SD 卡内部及引脚示意图:2、SD 模式及SPI 模式引脚名称P i n 3P i n 8P i n 7P i n 6P i n 5P i n 4P i n 2P i n 1P i n 93、Micro SD 引脚示意图及模式区别:二、SD 模式1、STM32的SDIO 适配器原理框图:注:R1b与R1格式相同,但可以选择在数据线上发送一个繁忙信号。
收到这些命令后,依据收到命令之前的状态,卡可能变为繁忙。
主机在收到此响应时应当检测忙状态。
R7中可接受的电压范围定义如下:6、部分命令详解CMD8用于初始化符合物理规范2.00版本的SD存储卡。
当卡处于空闲状态时,CMD8才是有效的。
该命令有两种功能:a.电压检测:检测卡是否能在主机提供的电压下工作b.扩充现有的命令及响应CMD8能通过重新定义某些现有命令的保留位,增加其新的功能。
ACMD41就是被这样被扩展后用于初始化高容量SD存储卡。
其中电源电压定义如下:当卡处于空闲状态,主机应当在发送ACMD41前发送CMD8。
在参数段,电源电压段是主机提供的电压值,而检测模式段可以是任何数值。
若主机支持卡的工作电压,卡会把接收到的电源电压及检测模式数值在命令响应中原样返回给主机。
若主机不支持卡的工作电压,卡不作响应并停留在空闲状态。
分是高容量卡(SDHC)还是标准容量卡(SDSC)。
7、SD卡寄存器SD卡寄存器有:卡识别寄存器(CID),相对卡地址寄存器(RCA),驱动级寄存器(DSR),特殊数据寄存器(CSD),SD卡配置寄存器(SCR),工作状态寄存器(OCR),SD状态寄存器(SSR),卡状态寄存器(CSR)。
基于STM32和MODBUS协议的多参数数据采集卡设计(精)
第32卷第12期 2010-12(上【205】基于STM32和MODBUS协议的多参数数据采集卡设计Multi-parameter data acquisition card design based on STM32 and MODBUS protocol肖前军XIAO Qian-jun(重庆工业职业技术学院,重庆 400050)摘要:为了实现工业现场数据采集的网络化和智能化,本文使用STM32作为控制器,采用MODBUS通信协议,设计了一款高性能多参数数据采集卡。
关键词:STM32;MODBUS协议;网络化;多参数中图分类号:TP391 文献标识码:A 文章编号:1009-0134(201012(上-0205-04Doi: 10.3969/j.issn.1009-0134.2010.12(上.670 引言在工业现场需要监控现场的工作环境和设备的运行状况,就需要测量现场的温度、湿度和设备的电压、电流等参数,以前的数据采集多采用变送器,变送器采集的数据采用模拟量传输,抗干扰能力较差,并且采集数据单一,不能完成多参数采集,由于采用模拟量传输不易实现网络化。
本文提出一种多参数数据采集卡的设计和实施方案,采用STM32作为微处理器,标准MODBUS协议作为通信规约,实现数据采集的网络化和智能化;该采集卡具有如下功能:可实现8路模拟量输入(混接),用户可将任一通道自由设置成标准电压、标准电流(加接取样电阻)、热电偶、热电阻等信号方式;8路继电器输出(控制或报警信号),报警继电器由I/O前端自行控制输出(组态),可单组或多组输出,每组输出为独立方式,报警输出触电电流≤3A;在串行通信方式(RS485)下,采用标准MODBUS协议,使采集卡与上位机或控制器进行通信;人机接口(键盘及显示),完成参数手动设置和测试结果现场显示。
1 系统总体方案系统总体框图如图1所示,包括电源处理电路,MCU控制器,串行通信模块,信号滤波电路,放大电路和A/D转换电路,信号隔离电路,输出报警和人机接口电路。
STM32F10x_SDIO
/*【01】函数SDIO_DeInit******************************************************************************* Function Name : SDIO_DeInit* Description : Deinitializes the SDIO peripheral registers to their default reset values. * Input : None* Output : None* Return : None*******************************************************************************/void SDIO_DeInit(void){SDIO->POWER = 0x00000000;SDIO->CLKCR = 0x00000000;SDIO->ARG = 0x00000000;SDIO->CMD = 0x00000000;SDIO->DTIMER = 0x00000000;SDIO->DLEN = 0x00000000;SDIO->DCTRL = 0x00000000;SDIO->ICR = 0x00C007FF;//清除所有中断标志SDIO->MASK = 0x00000000;}/*【02】函数SDIO_Init******************************************************************************* Function Name : SDIO_Init* Description : Initializes the SDIO peripheral according to the specified parameters in the SDIO_InitStruct. * Input : SDIO_InitStruct : pointer to a SDIO_InitTypeDef structure that contains the configurationinformation for the SDIO peripheral.* Output : None* Return : None*******************************************************************************/SDIO_Init的结构体如下:typedef struct{u8 SDIO_ClockDiv;//8bit分频系数u32 SDIO_ClockEdge;u32 SDIO_ClockBypass;u32 SDIO_ClockPowerSave;u32 SDIO_BusWide;u32 SDIO_HardwareFlowControl;} SDIO_InitTypeDef;上述结构体的参数设置如下:Table.2-2 SD时钟旁路选择Table.2-5 SD宽总线模式使能函数原型如下:void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct){u32 tmpreg = 0;/* Check the parameters */assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl));/*---------------------------- SDIO CLKCR Configuration ------------------------*//* Get the SDIO CLKCR value */tmpreg = SDIO->CLKCR;/* Clear CLKDIV, PWRSAV, BYPASS, WIDBUS, NEGEDGE, HWFC_EN bits *//* Set CLKDIV bits according to SDIO_ClockDiv value *//* Set PWRSAV bit according to SDIO_ClockPowerSave value *//* Set BYPASS bit according to SDIO_ClockBypass value *//* Set WIDBUS bits according to SDIO_BusWide value *//* Set NEGEDGE bits according to SDIO_ClockEdge value *//* Set HWFC_EN bits according to SDIO_HardwareFlowControl value */tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave |SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl);/* Write to SDIO CLKCR */SDIO->CLKCR = tmpreg;}/*【03】函数SDIO_StructInit******************************************************************************* Function Name : SDIO_StructInit* Description : Fills each SDIO_InitStruct member with its default value.* Input : SDIO_InitStruct: pointer to an SDIO_InitTypeDef structure which will be initialized. * Output : None* Return : None*******************************************************************************/对SDIO->CLKCR涉及到的参数结构体(SDIO_InitTypeDef)进行缺省值注入。
STM32之SDIO库
{uint32_t SDIO_ClockEdge;uint32_t SDIO_ClockBypass;uint32_t SDIO_ClockPowerSave;uint32_t SDIO_BusWide;uint32_t SDIO_HardwareFlowControl;uint8_t SDIO_ClockDiv;} SDIO_InitTypeDef;SDIO_ClockEdgeSDIO_ClockBypassSDIO_ClockPowerSave省电配置,时钟节能模式,开启后当总线为空闲时关闭时钟SDIO_BusWideSDIO_HardwareFlowControl硬件流控制,若开启,在FIFO不能进行发送和接收数据时,数据传输暂停SDIO_ClockDiv时钟分频系数,HCLK分频后输出到SDIO_CLK,SDIO_CK = HCLK/(2 + CLK_DIV){uint32_t SDIO_Argument;uint32_t SDIO_CmdIndex;uint32_t SDIO_Response;uint32_t SDIO_Wait;uint32_t SDIO_CPSM;} SDIO_CmdInitTypeDef;SDIO_ArgumentSDIO发送命令时,该寄存器指明了发送的命令中参数的值SDIO_CmdIndex下次发送的SDIO命令索引,其取值由SD卡协议中规定SDIO_ResponseSDIO_WaitSDIO_CPSM命令通道状态机(CPSM)使能位typedef struct{uint32_t SDIO_DataTimeOut;uint32_t SDIO_DataLength;uint32_t SDIO_DataBlockSize;uint32_t SDIO_TransferDir;uint32_t SDIO_TransferMode;uint32_t SDIO_DPSM;} SDIO_DataInitTypeDef;SDIO_DataTimeOut数据状态机超时时间设置SDIO_DataLength需要传输的数据字节长度。
STM32多路AD采样DMA使用方法
STM32多路AD采样DMA使用方法比画了很多天,终于今天下狠心把多通道ADC转换逼出来了,一直就看着ADC多通道的多种用法和DMA的用法眼晕,找了很多例子最多是3通道而且用的不是一个AD.终于靠自己的力量弄出来了,长出了一口气啊.我这里用的ADC的通道8~15共8个通道,采用自动连续转换模式,转换完一个通道的数据由DMA送到内存中,主程序中把每个通道的数据分检出来经过"去极值取平均值滤波"后送给LCD显示,在万利的开发板上显示的值比万利的例子稳定多了./************************************************************** ****************** Function Name : main* Description : Main program* Input : None* Output : None* Return : None*************************************************************** ****************/int main(void){#ifdef DEBUGdebug();#endif/* System clocks configuration ---------------------------------------------*/RCC_Configuration();/* NVIC configuration ------------------------------------------------------*/NVIC_Configuration();/* GPIO configuration ------------------------------------------------------*/GPIO_Configuration();LcdShow_Init();/* DMA1 channel1 configuration ----------------------------------------------*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_RCVTab;//内存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//dma传输方向单向DMA_InitStructure.DMA_BufferSize = 160;//设置DMA在传输时缓冲区的长度 wordDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设置DMA的内存递增模式,DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据字长DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存数据字长DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的传输模式:连续不断的循环模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的优先级别DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA1 channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);/* ADC1 configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描方式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发禁止ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 8;//用于转换的通道数ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channels configuration [规则模式通道配置]*/ ADC_RegularChannelConfig(ADC1, ADC_Channel_8 , 1, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_9 , 2, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 3, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 4, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 5, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 6,ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 7, ADC_SampleTime_239Cycles5);ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 8, ADC_SampleTime_239Cycles5);/* Enable ADC1 DMA [使能ADC1 DMA]*/ADC_DMACmd(ADC1, ENABLE);/* Enable ADC1 [使能ADC1]*/ADC_Cmd(ADC1, ENABLE);/* Enable ADC1 reset calibaration register */ADC_ResetCalibration(ADC1);/* Check the end of ADC1 reset calibration register */while(ADC_GetResetCalibrationStatus(ADC1));/* Start ADC1 calibaration */ADC_StartCalibration(ADC1);/* Check the end of ADC1 calibration */while(ADC_GetCalibrationStatus(ADC1));/* Start ADC1 Software Conversion */ADC_SoftwareStartConvCmd(ADC1, ENABLE);while(1){vu16 value1 = 0;vu16 value2 = 0;vu16 value3 = 0;vu16 value4 = 0;vu16 value5 = 0;vu16 value6 = 0;vu16 value7 = 0;vu16 value8 = 0;value1 = average(ADC_RCVTab,0); value2 = average(ADC_RCVTab,1); value3 = average(ADC_RCVTab,2); value4 = average(ADC_RCVTab,3); value5 = average(ADC_RCVTab,4); value6 = average(ADC_RCVTab,5); value7 = average(ADC_RCVTab,6); value8 = average(ADC_RCVTab,7);u8 num1 = value3 % 10;u8 num2 = (value3 / 10) % 10;u8 num3= (value3 / 100) % 10;u8 num4 = value3 / 1000;if (num1 > 9)display[3] = num1 + (65 - 10); elsedisplay[3] = num1 + (48-0);if (num2 > 9)display[2] = num2 +(65 - 10); elsedisplay[2] = num2 + (48 - 0);if (num3>9)display[1]=num3+(65-10);elsedisplay[1]=num3+(48-0);if (num4>9)display[0]=num4+(65-10);elsedisplay[0]=num4+(48-0); write_string(display); delay();}}。
[原创]STM32SDIO折腾记
[原创]STM32SDIO折腾记⽉初打样回来的PCB,断断续续搞到现在,离完成度还有距离。
这块被我⽼婆称为“背⼼”的板⼦,其实是我的STM32F4实验平台(Nucleo我有,但是光插针⽤起来也不⽅便,还得扩展卡)。
这块板⼦的布局是为⼀个数字⾳乐播放器设计的,但现在软件⼯作还缺很多。
这个⽉⾥实验过了STM32F411的时钟配置、DMA、I2C、I2S、SDIO. 其中 SDIO 折腾得最久,拿出来和⼤家分享下。
SDIO这个模块主要是为了读写SD存储卡(也可以操作SDIO wifi卡之类的),ST从STM32F10x 开始就已经⽀持SDIO/SDMMC了,因为是硬件专⽤模块,⽐⽤SPI⽅式读写SD卡效率要⾼很多,软件也⼤⼤简化。
我曾经(五年前的事了)在FPGA上为了记录数据,⽤SPI⽅式写过SD 卡,因为状态机太复杂,⽤起来很不好⽤。
在8位MCU的时代,⽤SPI⽅式操作SD卡已⽐较流⾏,可以找到不少的参考代码。
SD卡数据线有4条,在SPI模式下就利⽤不了全部的带宽,STM32的SDIO则是全部数据线都能⽤上的。
上图是常见标准尺⼨SD卡和MicroSD卡(和TF是同样东西不同叫法)的引脚,下图是STM32 SDIO模块的硬件连接,对应Card bus的引脚连到SD卡(卡座)上。
不过,SD卡只有D0..D3四条数据线,STM32的SDIO_D7..4这四条多出来的线以及8位宽度模式是给什么⽤的?我也不知道。
反正多的线也没地⽅连。
焊好SD卡座之后:对应SD卡pin都接到MCU上了。
卡座上另有CD引脚是检测卡插⼊的,卡插⼊后CD与GND连通。
还有WP引脚是识别写保护开关⽤的,我没连它。
个⼈的DIY就是折腾,ST官⽅库已经有SDIO的函数了为何不⽤?重新发明轮⼦?我就喜欢这么⼲,不喜欢烦琐的⼀层层打包的库函数啊,直接写寄存器才好玩先得知道这些信号都⼲吗的才是,ST⼿册这个图表⽰得差不多了除了 SDIO_CK 是时钟,只由MCU产⽣之外,SDIO_CMD和SDIO_Dn都是双向的I/O。
STM32的SDIO接口
2 SDIO接口工作原理
(3) SDIO接口的时钟 ① SDIO 适配器时钟(SDIOCLK):该时钟用于驱动SDIO适配器,来自PLL48CK,一般为48Mhz。 ② APB2总线接口时钟(PCLK2):该时钟用于驱动SDIO的APB2总线接口,一般为 84Mhz。 ③ 卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输 1 位命令或数据。 SDIO_CK 与 SDIOCLK 的关系(时钟分频器不旁路时)为:
Hale Waihona Puke 2021/8/82021/8/8
2 SDIO接口工作原理
SDIO总线协议数据传输方式(SD卡数据包有两种格式): 第2种:数据包发送格式是宽位数据包格式。对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态)寄
存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发 送给主机。
1 SDIO接口简介
SDIO设备分类
SD卡的种类
2 SDIO接口工作原理
(1) SDIO接口的引脚 STM32 控制器的SDIO有8根数据线(SD卡最多用4根数据线),1根输出时钟线,1根SDIO_CMD命令控制线。 (2) CMD命令控制线 SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答,SD卡也是通过该线传输应答信息。
STM32的SDIO接口
提纲
CONTENTS
1 SDIO接口简介 2 SDIO接口工作原理
1 SDIO接口简介
SDIO(Secure Digital Input and Output)全称为安全数字输入/输出接口,定义了一种外设接口,类似于 SPI、IIC等接口。STM32系列控制器集成一个SDIO主机接口,可以与MMC、SD等存储卡,以及SD I/O和CE-ATA 设备进行数据传输。由于SDIO接口传输速度较快,Wi-Fi Card、GPS Card等模块广泛采用SDIO传输协议与处理器 通信。