AT32讲堂050 | 雅特力AT32 MCU SDIO入门指南

描述


 

简介

AT32 MCU的主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、SD存储卡、SDIO卡间提供了操作接口。SD储存卡和SDIO卡的系统规格书可以通过SD卡协议网站。多媒体卡系统规格书由MMCA技术委员会发布,可以在多媒体卡协会的网站上获得。1、SD Card:SDSC/SDHC/SDXC,支持的卡最大容量不同,支持1bit或4bit传输,0-25MHz或0-50MHz的传输模式。2、MMC Card:支持1bit,4bit或8bit传输,0-20MHz,0-26MHz或0-52MHz的传输模式。3、SDIO Card:一种使用SD接口协议,支持多功能的卡,比如wifi卡,GPS卡,蓝牙卡等等。
 

SDIO主要结构

SDIO包含4个部分:1、SDIO适配器模块:由控制单元、命令单元和数据单元所组成,实现所有MMC/SD/SDIO卡的相关功能,如时钟的产生、命令和数据的传送

  • 控制单元:管理并产生时钟信号
  • 命令单元:管理命令的传输
  • 数据单元:管理数据的传输

2、AHB接口:产生中断和DMA请求信号3、适配器寄存器:SDIO寄存器4、BUF:用于数据传输校准功能图1. SDIO框图AT32

  • 所有数据线配置为复用推挽模式。SDIO_CMD和SDIO_D[7:0]可双向通信,应外接上拉电阻或内部上拉。
  • SDIO使用一个时钟信号:SDIO适配器时钟(SDIOCLK=AHB总线时钟(HCLK))。
  • 复位后默认情况下SDIO_D0用于数据传输。初始化后主机可以改变数据总线的宽度。可选1bit(SDIO_D0)、4bit(SDIO_D[3:0])、8bit(SDIO_D[7:0])三种数据总线的宽度。

表1. SDIO外部引脚说明AT32

SDIO总线通信

总线上的通信是通过传送命令和数据实现。
1、在多媒体卡/SD/SDIO总线上的基本操作是命令/响应结构。2、在SD/SDIO Card上传送的数据是只能以数据块的形式传输;在MMC Card上传送的数据是以数据块或数据流的形式传输。图2. SDIO命令“无响应”和“有响应”操作AT32图3. SDIO(多)数据块读操作AT32图4. SDIO(多)数据块写操作AT32注意:当有Busy(繁忙)信号时,SDIO(SDIO_D0被拉低)将不会发送任何数据。图5. SDIO MMC卡数据流读操作AT32图6. SDIO MMC卡数据流写操作AT32

SDIO功能

SDIO时钟

1)SDIO_CK是MCU端输出到卡的时钟:每个时钟周期在命令和数据线上传输1bit命令或数据。2)SDIO_CK信号的两下降沿之间为一个时钟周期,硬件在上升沿捕获数据。3)当启动了省电模式并且卡总线处于空闲状态(命令通道和数据通道子单元进入空闲阶段后的8个时钟周期)。图7. 开启省电模式的命令/响应波形图AT324)支持多达10位分频系数,也就是1024级分频,此时可得SDIO_CK频率=SDIOCLK/[CLKPSC[9:0]+2]。5)可以使用bypass模式,输出一个不分频的时钟,SDIO_CK频率=SDIOCLK。6)硬件流控模式,可在数据传输即将发生上溢或者下溢的时候,通过停止SDIO_CK防止溢出。7)可以配置CLKEDG bit来选择时钟的产生。SDIO_CK可实现略微偏移(半个SDIOCLK)。8)应用时,SD卡初始化的时候SDIO_CK不能大于400kHZ,之后的时钟频率由对应卡型号限制。
SDIO时钟配置相关函数

配置SDIO时钟

AT32

使能省电模式

AT32使能SDIO时钟bypass模式AT32使能硬件流控模式AT32设置SDIO电源AT32使能SDIO时钟输出AT32SDIO时钟初始化举例:AT32

命令通道

1)命令通道单元通过SDIO_CMD向卡发送命令并从卡接收响应。2)命令超时,即等待卡响应的时间,固定为64个SDIO_CK时钟周期。这个由通信协议决定,固定不可配置。3)可以置位WAITPEND bit,命令只有在数据传输完之后才由硬件自动发出,而不是立刻发出。多用于流数据的传输模式,目的是保证中止命令可以精准地停止卡的数据传输。表2. 命令格式AT324)根据该命令的需要,可配置等待响应位(Wait for response bits)来指示CPSM是否需要等待响应。具体可配置为:1、无响应;2、短响应;3、长响应。表3. 短响应格式AT32表4. 长响应格式AT325)当设置SDIO_CMDCTRL寄存器的CCSMEN位,控制器开始发送命令。命令发送完成时,命令通道状态机(CCSM)设置命令通道状态标志并在不需要响应时进入空闲状态。当收到响应后,接收到的CRC码将会与内部产生的CRC码比较,然后设置相应的状态标志。图8. 命令通道状态机(CCSM)AT326)当CMDRSPCMPL、CMDFAIL、CMDCMPL、CMDTIMEOUT置位后,命令通道状态机(CCSM)都会回到Idle状态。而DOCMD置位时,CPSM处于除Idle以外的任何状态。表5. 命令通道标志AT32命令通道配置相关函数配置命令通道状态机AT32使能命令通道状态机AT32

命令通道初始化举例:

AT32

 

数据通道

1)数据通道单元通过SDIO_D[7:0]在主机与卡之间传输数据。图9. 数据通道状态机(DCSM)AT322)数据BUF(先进先出)子单元是一个具有发送和接收单元的数据缓冲区。3)BUF包含一个每字32位宽、共32个字的数据缓冲区,共128Byte。表6. 数据令牌格式AT324)DOTX和DORX由数据通道单元设置而且是互斥的:

  • 当DOTX标志有效时,BUF代表发送数据缓冲区。(DPSM处于Wait_R或者Receive状态)
  • 当DORX标志有效时,BUF代表接收数据缓冲区。(DPSM处于Wait_S或者Send状态)

表7. 发送BUF状态标志AT32表8. 接收BUF状态标志

AT32

SDIO_D[7:0]时序1)在块模式下,发送完数据后,卡会返回一个确认CRC的序列,数据通道状态机(DCSM)在等待“这个序列和Busy结束”时有超时控制,超时时间由SDIO数据定时器寄存器(SDIO_DTTMR)设置。2)卡端返回的CRC status(5bit)只会发送在SDIO_D0上,卡端收到正确的数据(CRC正确)后发出的序列为“00101”,若是错误的数据(CRC错误)的序列为“01011”。3)数据通道状态机(DCSM)在WAIT_R等待接收数据时也有超时控制,超时时间也由SDIO数据定时器寄存器(SDIO_DTTMR)设置。4)在块模式下的数据传输总个数一定要是block size的整数倍。当一个块发送完后需要收到“CRC序列和Busy结束”时,硬件才会发送下一个数据块。在流模式下不需设定blocksize的大小。图10. 1bit数据传输方式AT32图11. 4bit数据传输方式AT32图12. 8bit数据传输方式AT32数据通道配置相关函数配置数据通道状态机AT32使能数据通道状态机AT32设置数据总线宽度AT32

数据通道初始化举例:
 

AT32

SDIO AHB接口

1)AHB接口产生中断和DMA请求,并访问SDIO接口寄存器和数据BUF。它包含一个数据通道、寄存器译码器和中断/DMA控制逻辑。2)SDIO中断:当至少有一个选中的状态标志为高时,中断控制逻辑产生中断请求。中断屏蔽寄存器用于选择可以产生中断的条件,如果设置了相应的屏蔽标志位,则对应的状态标志可以产生中断。表9. SDIO中断屏蔽寄存器AT323)DMA接口:DMA主要用于在SDIO BUF和Memory之间传输数据。

  • BUF在接收数据时,RXBUFH标志作为DMA接收请求。
  • BUF在发送数据时,TXBUFH标志作为DMA发送请求。

SDIO中断/DMA配置相关函数

SDIO中断配置函数

AT32SDIO DMA使能函数AT32使能SDIO DMA接收数据举例:AT32

数据传输模式

当SD/MMC卡需要读/写数据时,可以配置、使能SDIO主机的数据通道后,通过PIO模式或DMA模式来读/写SDIO的数据BUF的方式实现。

PIO模式

SDIO的数据BUF共128字节,读/写数据共用。根据SDIO主机数据通道所配置的传送方向来判断读或写数据BUF。在读取数据BUF接收数据时,用户查询SDIO_STS寄存器的RXBUFH标志位,如置位可读取8字节的数据,最后再查询RXBUF标志位,以读完剩余小于8字节的未读数据。在写入数据BUF发送数据时,用户查询SDIO_STS寄存器的TXBUFH标志位,如置位可写入最多8字节的数据,直至写完所有待发送的数据。当在PIO模式下运行时,用户都必须确保轮询状态。

DMA模式

DMA模式是访问数据BUF的另一种选择。使用DMA控制器来代替CPU对数据BUF的访问,可以节省CPU运行的时间。使用DMA控制器之前,要先使能SDIO的DMA模式,再去设置DMA控制器的功能,最后使能与数据BUF读或写相关的中断,用以判断数据BUF读/写是否完成,是否有数据校验错误等。控制方式和范例可以参照BSP里的demo。SDIO用DMA模式读或写数据BUF时,只能以WORD为最小传输单位。DMA的长度需换算成WORD单位,数据宽度也必须选择WORD。DMA模式相关配置函数SDIO的DMA模式使能AT32SDIO的中断使能AT32

SDIO主机接口初始化

初始化SDIO主机

这部分介绍了如何去初始化SD/MMC主机接口来建立命令通道和数据通道去初始化 SD/MMC卡。图13. 初始化SD/MMC主机接口流程图AT32时钟配置SDIO使用一个时钟信号:SDIO适配器时钟(SDIOCLK=AHB总线时钟(HCLK))。SDIO_CK的时钟配置对于SD/MMC卡初始化配置时,该时钟范围在100到400KHz。

SD卡初始化

SD卡上电和初始化的流程可参考协议”SD Physical Layer Specification Version 2.00”来实现,并由此来配置命令通道和数据通道去识别和初始化SD卡。图14. SD卡识别和初始化流程图AT32SD卡的上电和初始化发送CMD0:软件复位命令,将卡置于空闲状态。发送CMD8:根据卡端的响应识别SD卡的版本型号和支持的电压范围。

  • 如果卡端回复了响应,这说明是V2.00或更新的SD卡。再判断响应是否有效,如响应无效,则支持的电压范围不兼容;如有效,则支持的电压范围是兼容的。
  • 如果卡端没有回复响应。则说明是V2.00或更新的SD卡(没有匹配支持的电压),或是V1.X的SD卡,或是没有连接SD卡。

发送ACMD41:获取SD卡的OCR(Operation Conditions Register)。

  • 读取OCR中的Busy(Card power up status)bit,判断SD卡的上电过程是否完成,直到该位置1说明上电完成。
  • 读取OCR中的CCS(Card Capacity Status)bit,判断该卡是高容量或是标准容量的V2.00的SD卡。

SD卡的识别过程发送CMD2:获取SD卡的CID(Card IDentification)Register。发送CMD3:获取SD卡的相对地址。发送CMD9:获取SD卡的CSD(Card Specific Data)Register。配置SD卡的数据总线宽度1)发送ACMD6:改变SD卡的数据总线宽度(可支持1-bit或4-bit线宽)2)配置SDIO主机的数据总线宽度线宽。总线宽度设置函数AT32

配置SD卡数据总线宽度举例:

AT32

MMC卡初始化

MMC卡上电和初始化的流程可参考协议”MultiMediaCard (MMC) Electrical Standard (MMCA, 4.2)”来实现,并由此来配置命令通道和数据通道去识别和初始化MMC卡。图15. MMC卡识别和初始化流程图AT32MMC卡的上电和初始化发送CMD0:软件复位命令,将卡置于空闲状态。发送CMD1:获取MMC卡的OCR(Operation Conditions Register)。

  • 读取OCR中的Busy(Card power up status)bit,判断MMC卡的上电过程是否完成,直到该位置1说明上电完成。

MMC卡的识别过程发送CMD2:获取MMC卡的CID(Card IDentification)Register。发送CMD3:设置MMC卡的相对地址。发送CMD9:获取MMC卡的CSD(Card Specific Data)Register。配置MMC卡的数据总线宽度1)发送CMD6:改变MMC卡的数据总线宽度(可支持1-bit或4-bit或8-bit线宽)2)配置SDIO主机的数据总线宽度线宽。总线宽度设置函数AT32

配置MMC卡数据总线宽度举例:

AT32

SDIO主机接口读/写 SD/MMC卡

s

读/写SD卡

在读/写SD卡时,只能以数据块的方式进行读/写。当SD卡上电并初始化完成,由空闲状态进入传输状态后,就可以进行SD卡的读/写操作。图16. SD卡状态图(数据传输模式)AT32在初始化完成后,SD卡进入Stand-by状态,需发送CMD7根据相对地址去选中SD卡,此时可进入到transfer状态,便可以进行SD卡的读/写操作。

发送CMD13:获取SD卡状态。

发送CMD16:设置SD卡单块的大小。下面的命令是用于读/写单块或多块的数据:

  • CMD1:读单块数据。

 

  • CMD18:读多块数据。

 

  • CMD23:写单块数据。

 

  • CMD24:写多块数据。

 

 

读/写MMC卡

在读/写MMC卡时,可以以数据块或数据流的方式进行读/写。当MMC卡上电并初始化完成,由空闲状态进入传输状态后,就可以进行MMC卡的读/写操作。图17. MMC卡状态图(数据传输模式)AT32在初始化完成后,MMC卡进入Stand-by状态,需发送CMD7根据相对地址去选中MMC卡,此时可进入到transfer状态,便可以进行MMC卡的读/写操作。发送CMD13:获取MMC卡状态。发送CMD16:设置MMC卡单块的大小。

下面的命令是用于读/写单块或多块的数据:

  • CMD1:读单块数据。
  • CMD18:读多块数据。
  • CMD23:写单块数据。
  • CMD24:写多块数据。

下面的命令是用于读/写数据流:

  • CMD11:读数据流。
  • CMD20:写数据流。

读/写 SD/MMC卡 案例

下图展示了读/写SD/MMC卡案例的流程图。图18. 读/写SD/MMC卡案例AT32

SDIO主机读写基于 SD/MMC卡的FATFS文件

s在SD/MMC卡上装载FATFS文件系统,文件能被传送,可使用PIO或DMA的传输模式。后面有案例会具体描述如何去创建、写入然后读取一个文件在SD/MMC卡上。

将文件系统导入工程文件

在案例中,我们需要导入FATFS文件系统的API层和硬件层,并根据具体的存储介质来修改硬件层。通过”ffconf.h”配置FatFs的相关功能(可裁剪),以满足应用的需要。图19. FATFS文件系统相关文件AT32

FATFS文件系统案例

下图展示了FATFS文件系统案例的流程图。图20. FATFS文件系统案例AT32PS. 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分