一、WiFi 介绍 WiFi 又称“无线热点”或“无线网络”,是 Wi-Fi 联盟的商标,一个基于 IEEE 802.11 标准的无线局域网技术。WiFi 支持的接口有 UART, USB, SDIO, PCIE,它们的传输速率分别由低到高排序,可以应用到不同的场景中。 WiFi 网卡有两种工作模式: ① 一种是无线终端模式 (STA),也就是手机日常使用的模式,通过该模式连接网络上网; ② 一种是无线热点模式 (AP),也就是手机的个人热点模式,通过该模式提供热点供其它设备上网; 二、SDIO 接口介绍SDIO 就是 SD 的 I/O 接口(interface)的意思,它是在 SD 内存卡接口的基础上发展起来的接口,SDIO 接口兼容以前的 SD 内存卡,并且可以连接 SDIO 接口的设备。 SDIO1.0 标准定义了两种类型的 SDIO 卡: 1. 全速的 SDIO 卡,传输率可以超过 100Mbps; 2. 低速的 SDIO 卡,支援的时脉速率在 0 至 400KHz 之间。 SDIO 协议是由 SD卡的协议演化升级而来的,很多地方保留了 SD 卡的读写协议,同时 SDIO 协议又在 SD 卡协议之上添加了 CMD52 和 CMD 53 命令。由于这个,SDIO 和 SD 卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开支来支持低速 I/O 能力。低速卡支持类似调制解调器,条形码扫描仪和 GPS 接收器等应用。高速卡支持网卡,电视卡以及组合卡等。组合卡指的是存储器+SDIO,对组合卡来操作需要全速和 4BIT 的传输模式,这是 SDIO1.0 标准规定的。 SDIO 通过 SD 的 I/O 管脚来连接外部的外围 DEVICE 并传输数据。这些外围设备,我们称为 SDIO 卡,常见的有: Wi-Fi card (无线网络卡) CMOS sensor card (照相模块) GPS card GSM/GPRS modem card Bluetooth card Radio/TV card 三、SDIO 总线 SDIO 总线和 USB 总线类似,SDIO 总线也有两端,其中一端是主机(HOST)端,另一端是设备端(DEVICE),采用 HOST- DEVICE 这样的设计是为了简化 DEVICE 的设计,所有的通信都是由 HOST 端发出命令开始的。在 DEVICE 端只要能解析 HOST 的命令,就可以同 HOST 进行通信了,SDIO 的 HOST 可以连接多个 DEVICE。 CLK 信号:HOST 给 DEVICE 的 时钟信号,每个时钟周期传输一个命令。 CMD 信号:双向 的信号,用于传送 命令 和 响应。 DAT0-DAT3 信号:四条用于传送的数据线。 VDD 信号:电源信号。 VSS1,VSS2:电源地信号。 SD/SDIO 的传输模式分为三种 spi mode ——(标准的 spi 模式) 1-bit mode —— cmd line、 data line、clk line、irq Line 4-bit mode ——1 cmd line 、3 data line、clk SDIO 的每个脚位在不同信号模式下的定义如下图:  四、SDIO 的命令与响应SDIO 总线上都是 HOST 端发起请求,然后 DEVICE 端回应请求。 Command:用于开始传输的命令,是由 HOST 端发往 DEVICE 端的。其中命令是通过 CMD 信号线传送的。 Response:回应是 DEVICE 返回的 HOST 的命令,作为 Command 的回应。也是通过 CMD 线传送的。 Data:数据是双向的传送的。可以设置为 1 线模式,也可以设置为 4 线模式。数据是通过DAT0-DAT3 信号线传输的。 SDIO 命令为:6 字节,48bit  对于读命令:首先 HOST 会向 DEVICE 发送命令,紧接着 DEVICE 会返回一个握手信号,此时,当 HOST 收到回应的握手信号后,DEVICE会将数据放在 4 位的数据线上,在传送数据的同时会跟随着 CRC 校验码。当整个读传送完毕后,HOST 会再次发送一个命令,通知 DEVICE 操作完毕,DEVICE 同时会返回一个响应。  从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带 CRC 校验(由硬件自动处理),单个数据块读的时候,在收到 1 个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,SDIO 卡将一直发送数据给主机,直到接到主机发送的 STOP 命令(CMD12)。 (1)发送 CMD17(单块)或 CMD18(多块)读命令,返回 0x00 (2)接收数据开始令牌 0xfe(或 0xfc )+ 正式数据 512Bytes + CRC 校验 2Bytes, 默认正式传输的数据长度是 512Bytes ,可用 CMD16 设置块长度。 对于写命令:首先 HOST 会向 DEVICE 发送命令,紧接着 DEVICE 会返回一个握手信号,此时,当HOST 收到回应的握手信号后,会将数据放在 4 位的数据线上,在传送数据的同时会跟随着 CRC 校验码。当整个写传送完毕后,HOST 会再次发送一个命令,通知 DEVICE 操作完毕,DEVICE 同时会返回一个响应。  数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在 SDIO 卡非繁忙的时候发送。这里的繁忙信号由 SDIO 卡拉低 SDIO_D0,以表示繁忙,SDIO 硬件自动控制,不需要我们软件处理 (1)发送 CMD24(单块)或 CMD25(多块)写命令,返回 0x00 (2)发送数据开始令牌 0xfe(或 0xfc ) + 正式数据 512Bytes + CRC 校验 2Bytes SDIO 卡的初始化流程: (1)发送 CMD52 复位 SDIO 卡 (2)发送 CMD0 使卡进入 IDLE 状态 (3)发送 CMD8 获取该卡所支持的电压值(3.3v or 1.8v) (4)发送 CMD5 读取 OCR 寄存器 (5)发送 CMD3 获取设备的从地址 (6)发送 CMD7 选中相应从地址的卡 (7)发送 CMD52 设置4位数据传输模式 详细的 SDIO 卡初始化过程的函数调用可参考我的另一篇文章《SDIO WiFi 之设备初始化流程分析》 五、参考文献《SDIO接口》 《嵌入式接口-SDIO》 |