======================================================================
现在WIFI热点很多、无线路由器已经白菜价格了,我也一直想在STM32平台低成本实现WIFI通信。上Linux,WINCE太复杂,开发环境和STM32的环境相比,不是一个数量级。要学的东西太多。 因此决定利用业余时间尝试下 STM32 裸机无系统 + WIFI 方案。不过现在对WLAN协议一无所知,不知道编译后的代码空间和RAM空间需求。先弄套源码试试再说。
1. 首先从WIFI芯片选型上,决定选择常用的比较容易购买的Marvell 88W8686芯片。考虑先购买成品SDIO (带SPI)接口的88W8686模块进行调试。
先移植SPI接口,再移植SDIO接口。 淘宝有SDIO接口的WIFI模块,插入STM32开发板的SD卡接口即可实现WIFI功能。硬件比较容易实现。(如果成功,之前购买了安富莱STM32开发板的用户就可以通过购买SDIO接口的WIFI模块学习WIFI了)
2. 到网上收集了一些资料。有了些初步的了解
(1)88W8686 每次上电需要下载固件 (可以通过STM32的SPI接口或SDIO接口访问88W8686寄存器的方式下载固件,也可以控制88W8686从SPI接口引导自己加载固件)
两个二进制固件文件: helper_gspi.bin (3K)和gspi8686.bin (117K),共120K字节。这是Marvell官方提供的固件,没有源码的。不过我们也不需要研究其源码,只需要将其下载到88W8686内部即可。
88W8686有2个SPI接口,一个叫SPI (设备接口,可以连接串行Flash),一个叫G-SPI(主机接口,和STM32的SPI相连),STM32的命令通过G-SPI接口发送。
后期我们设计WIFI模块的时候,可能考虑加上一片SPI串行Flash存储固件,这样就可以通过发送简单的命令,让其自动从SPI Flash加载固件。这样做有2个好处:
(a)可以加快加载速度,按照最大50M的时钟访问SPI串行Flash。
(b)避免120K字节固件占用STM32有限的Flash空间。留出更多的空间做应用,同时大幅度降低调试下载时间。
(2) 实现的难点在于WLAN协议以及WLAN和TCP/IP协议栈的接口软件移植。底层SPI接口和SDIO接口读写寄存器应该是比较好实现的。
(3)移植方案:基于Linux的驱动源码,尽量不修改文件夹结构,也少改WLAN部分的源码,因为对WLAN协议不熟,修改了后可能导致很多问题,不便于比对查找问题。通过单独增加一个接口文件,重载Linux系统特有的函数,一些特定的宏也重新指定,保证编译通过。看懂所有的源代码是不可能的,那样太花时间。我的首要目的是创建一个MDK工程,将所有的源码文件加入工程,然后编译通过。调试是下一步事情。只要保证修改过的地方都有注释,确认不会影响整体流程,成功的可能性还是比较大的。
|