当前位置:   article > 正文

sdio stm32理解 205 sdio调试 stm32f205_sdio卡中的function0和function1

sdio卡中的function0和function1

sdio stm32理解

  • 空间

sdio理解,
sdio是一种总线,与USB类似,
1.CMD线是双向的,上面传输的是命令,host向device发命令,

device 响应host的数据都是在CMD线上传输的
2.mmc_host为是主机数据结构,描述主控制器host
初初化主机,sdhci_s3c_probe(),有没有SD设置,都不受影响。

主要是对mmc_host结构时行设置。
3.rescan(host),主机host扫描SDIO总线,过程如下:1st:发

SD_SEND_IF_COND命令判断device是SD1.0还是SD2.0.
2nd:探测SD卡。

4.加载device驱动。
5.驱动与ID表对应起来,根据ID表与驱动重新驱动device设备。成功

(1) Wifi卡的常用接口有: 
–CF 接口 
–USB接口 
–SDIO接口 
–SPI接口 
–PCMCIA接口 
很多时候,同一个wifi卡同时支持多种接口,譬如marvell的8686的wifi卡,既支持spi接口,也支持sdio接口.
(2) SD卡与SDIO卡的异同 
1.SD卡使用的是SD卡协议,而SDIO卡使用的是SDIO协议;协议不一样,初始化/读写方式都不一样 
2.ARK1600控制器既支持SD卡也支持SDIO卡,在驱动上完全可以做到同一个卡槽既支持SD卡也支持SDIO卡,甚至combo卡,因此在驱动上有个判断过程,判断插进来的是SD卡还是SDIO卡
3.两者的引脚定义不一样,尽管引脚个数都一样 
(3) 
•SDIO协议 
–相对于SD协议,SDIO协议特有的命令有:cmd5,cmd52,cmd53 
–cmd5命令相当于SD卡协议中的acmd41,用于匹配SDIO卡的电压 
–对于SDIO卡中的单个寄存器的读写一般都使用cmd52命令,而对于多字节数据的读写则用cmd53命令。 
–cmd53分字节和块传输模式 
对于字节传输模式相当于SD协议的单块读写(cmd17,cmd24) 
对于块传输模式相当于SD协议的块读写(cmd18,cmd25) 
(4) 
•Cmd53 
–对于字节传输模式,它可以是1~512之间的任意长度的传输,而不是固定长度 
–对于块传输模式,首先它的块长度可以人为设定,但不能超过规定的最大块长度 
–相对于SD卡中的块传输模式,在最后一个块传输末尾,是不需要发送块停止命令的(cmd12) 
--每个SDIO卡都由1~7个function (optional)和一个memory function(mandatory)组成 
•什么是function ?
–所谓function,就是一个I/O设备,它实质就是一些寄存器的集合 
(5) SDIO卡里function的组织分布 
•CIA就是function0,也就是memory function,它每个SDIO卡所必须具有的,它里面包含了如下一些重要信息: 
–SDIO协议的版本号,BUS MOD,块大小等。这些信息有些是只读的,有些是可读可写的 
•Function1~7是可选的,根据具体的应用的不同,所包含的function数目也不一样,譬如我门使用的marvell的8686芯片,它就只有function0和function1
(6)sdio 1~4bit mode
PIN
SDIO 4-BIT MODE
SDIO 1-BIT MODE
1
CD/DAT3
Data line 3
N/C
Not used
2
CMD
Command line
CMD
Command line
3
VSS1
Ground
VSS1
Ground
4
VDD
Supply voltage
VDD
Supply voltage
5
CLK
Clock
CLK
Clock
6
VSS2
Ground
VSS2
Ground
7
DAT[0]
Data line 0
DATA
Data line
8
DAT[1]
Data line1 or INT line
IRQ
Interruption
9
DAT[2]
Data line2 or read wait
RW
Read wait
1.SDIO mode 同样也有1bit和4bit 总线模式 
2.SD与SDIO卡的引脚的一个最大的区别是:SDIO有个中断引脚DAT[1],在4bit模式下,DAT[1]既做数据线,又做中断线,因此是分时复用的,在总线发送命令期间,DAT[1]用作中断线。
(7)SD
PIN
SD MODE
1
Name
Type
Description
2
CD/DATA3
I/O/PP
Card detect/data line3
3
CMD
Pp
Command/response
4
Vss1
S
Ground
5
VDD
S
Supply voltage
6
Vss2
S
Ground
7
DAT0
I/O/PP
Data line0
8
DAT1
I/O/PP
Data line1
9
DAT2
I/O/PP
Data line2
•当HOST同时连接多个卡时: 
–时钟,电源,地线可以为每个卡公共 
–但每个卡都有自己单独的数据和命令总线,避免干扰 
–在卡的初始化过程中,命令是单独发到每个卡的,允许驱动来检测每个卡槽的卡是否存在,并且分配相应的逻辑地址给每个卡槽。 
–HOST与每个卡槽的卡的数据传输都是单独进行的,因为每个卡槽都有自己的数据总线 
–在卡的初始化完成后,命令可以同时发送到每个卡槽,因为此时命令中已经包含了卡的逻辑地址(在卡的分别初始化时分配的)
(8)SD卡与SDIO卡的检测判别 
–上电,发送CMD5命令,如果有响应,并且响应中的MP位为0,说明对应卡槽中的卡为SDIO卡,进而开始SDIO卡的初始化流程 
–如果发送CMD5命令没有响应,则说明对应卡槽的卡为SD或MMC卡,进而开始SD/MMC卡的初始化流程 
–如果发送CMD5命令,有响应,且响应中的MP位为1,说明这个卡不但是SDIO卡,同时也时SD卡,也就是所谓的combo卡,则进行combo卡的初始化流程
(9)目前linux下,已支持的wifi卡有如下厂家的卡: 
–Marvell 8385 and Marvell 8686 
–Intersil公司 Prism54 chips series 
–Intel IWL4965 and IWL3945 
–Atheros corporation 5xxx chipset 
–Broadcom(博通)43xx 
–Ralink(雷凌)RT2x00 
•Linux下已经支持了市面上的大多数wifi卡的驱动 
•每种wifi卡都是需要固件(firmware)才能驱动的,并且同一种卡工作在不同接口时对应的firmware是不一样的 
•需要注意的是:很多firmware都是要花钱的 
•固件通过其驱动下载到无线卡中,才能驱动起来 
(10)wifi驱动的通用的软件架构 
1. 分为两部分,上面为主机端驱动,下面是我们之前所说的firmware 
2. 其中固件部分的主要工作是:因为天线接受和发送回来的都是802.11帧的帧,而主机接受和传送出来的数据都必须是802.3的帧,所以必须由firmware来负责802.3的帧和802.11帧之间的转换,
3. 当天线收到数据,并被firmware处理好后会放在一个buffer里,并产生一个中断,主机在收到中断后就去读这个buffer。 

205 sdio调试 stm32f205

  • 空间

写一下这两天郁闷的SDIO调试。经历坎坷,但最终还是搞定了!!祝贺一下,老天总是在我快要放弃的时候才眷顾我一下。

把WIFI的驱动从103移植到205,刚开始感觉应该不难吧,都是STM的东西,但真正做下来才知道,F1XX ,F2XX相差还是很大的。SDIO,dma都有较大的区别,F2XX相对于F1XX有很多改进的地方,不是说不好,而是从F1XX直接跳到F2XX有点不适应。

首先说SDIO,103的SDIO是挂在AHB总线上的,而205的SDO是挂在APB总线上的,造成了它们的寄存器地址都不一样,在这上面就走了很多弯路。

还有DMA,这个改进的在多了,眨一看,以为不是一个公司的芯片,完全不同,205上增加了很多103上没有的东西,是让我迷惑的就是stream流,DMS FIFO,什么DMA1,DMA2各有8个streams,每个stream又可以选择8个通道。把我给彻底搞迷糊了。尤其是这个SDIO,居然SDIO通道可以map到stream3或者stream6上都可以,怎么搞的????

st为什么这么早,我也不清楚,但是据说可以避免DMA申请冲突,提升数据带宽等等等等,

由于出现了FIFO就可以实现DMA的目的地址,与源地址可以不对齐的,比如目的地址数据是32位的,源地址数据可以是8位的,完全可以在FIFO里面打散重组。这个不错,不过没有用到。

还有可以流控,这个可害惨我了,花了我几乎一下午的时间,调试这个东西。

单字节的命令读写都同有问题了,可是一到数据块BLOCK的读写就出现错误,看DMA的寄存器,总共16个了,发了12个停止了,记数器里还有4个没有发送。为什么没有发完,我一遍一遍的检查寄存器,没有问题呀,难道不是DMA的问题,是SDIO的问题?有可能,既然DMA没有问题,那一定是SDIO的问题。于是又详细的查看SDIO寄存器的各个位含义,但是还是没有发现不合适,错误的地方。没辙了,我把官方SDIO操作sd卡的例程,一句一句的对比,看看有什么不一样的地方,最后发现在什么突发模块的设置不一样,还有就是流控不一样,因为在103中根本就没有点两个概念,老程序里面也没有设置,所以我移植的时候也没怎么搭理它,结果悲剧出现在这。修改之后,运行,OK,

困惑我一天的问题就这么解决了。

好久没有调试这么底层的东西了,因为STM的库太好了,不需要我再去观察寄存器了,也许嵌入式最有魅力,也是最值钱的东西也就在这里!!!!!!!


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/281377
推荐阅读
相关标签
  

闽ICP备14008679号