STM32 - 无线模块 88W8801 基础主机驱动
发布时间:2023-08-09 07:16:31 来源:哔哩哔哩


(相关资料图)

Marvell 88W8801 是一款支持 GHz、IEEE 协议的无线模块,其内部仅集成了 CPU、SRAM、MAC、Baseband 等必要组件,相比于其他高度集成的无线模块而言透明度更高,灵活性更好。该模块支持 USB 和 SDIO 接口,简单应用场景下速率表现还不错;在 STM32 等单片机上工作时,通常考虑设计 SDIO 驱动。

为什么不选择更常见的 nRF24L01、ESP8266 或者 ESP32 等无线模块呢?好问题,这里分开来说。nRF24L01 在传输大量数据时速率实在是个问题,ESP8266 的 NonOS SDK 不再更新,ESP32 虽然有 SDIO 驱动,但是没找到无操作系统的方案,这部分的官方文档也少得可怜。

除了这些因素,集成度太高和独立开发环境(点名表扬 ESP-IDF)两大问题才是重中之重。集成度太高隐藏了过多细节,调整也麻烦;独立开发环境本身就让人头痛,感觉......不如 Qt(

开始之前,请务必阅读大佬的文章,里面详细介绍了 88W8801 驱动的实现过程:/article/details/103786004

在此基础上,这里做了一些微不足道的改进,供各位参考:/glifeather/marvell_wlan_host_driver

阅读下方内容时,建议同时参考上述链接(Github 上的 README 偏向使用方法,这里重在简述代码逻辑)。

首先选择单片机型号。STM32F1 系列虽然有 SDIO 接口,但系统主频较低,内存也较小,因此选择的是 STM32F407。调试信息输出到 SPI2 上的 TFT-LCD,屏幕大小为 128*160(在头文件中定义),驱动芯片为 ST7735S。通过修改 ,也可输出到串口或其他设备上。

为什么从 SPI2 开始呢?因为开发板的板载 Flash 连接到了 SPI1 上(ˉ▽ˉ;)。由于无线模块内置 ROM 空间较小,上电时要求主机将固件发送到 SRAM 中运行。如果直接将固件保存到 const 变量,将极大延长烧录时间,不妨第一次就将固件写入 Flash,之后每次读取 16-1024 字节(由模块给定),通过 SDIO 接口发送出去。在 AC6 编译器下,这将导致无法切换 Ready 状态或校验 CRC 出错,将优化等级改为 -Oz 即可,原因不明。

88w8801_ 负责操作 W25Q16DV

如果看到这里——别急,请先阅读一下代码吧(写了一晚上,让咱先补个觉......

标签: