RT-Thread论坛
直播中

廉鼎琮

9年用户 1031经验值
私信 关注
[问答]

AP6181移植到STM32H723,wifi库初始化错误怎么解决?

STM32H723ZGT6和AP6181采用SDIO接口通信,WIFI库采用了潘多拉的libwifi_6181_0.2.6armcm4_gcc.a,WIFI固件采用了wifi_image_0.1.rbl,OTA库采用了libota_noalgo_0.1.2_stm32l4_gcc.a.
已经成功移植了FAL、SFUD、easyflash、filesystem,sdio驱动使用了art-pi的sdio驱动,wifi驱动采用潘多拉的drv_wlan.c驱动.
目前遇到的问题是执行wifi_hw_init()后初始化失败,目前没有头绪,各位大佬熟悉这块的可以指点下么?
下面附上启动LOGO图:

图中sdio已经驱动起来了,识别到了SDIO接口的类型

图中wifi固件也已经写入wifi_image分区

图中执行wifi初始化函数报错,看起来是CMD52命令错误


回帖(2)

柴扉

2025-9-18 17:33:03
  1.降低SDIO CLK的传输速度
2.缩短STM32H723ZGT6和AP6181之间连接线的长度
建议用逻辑分析仪测下线上的数据是否正常,目前提供的信息不太容易找出问题。
举报

尚文清

2025-9-23 17:00:56

针对AP6181在STM32H723上的初始化失败问题,以下是系统化的解决方案:


1. 确认SDIO底层驱动配置



  • 时钟配置检查

    • 确保SDIO时钟初始化阶段使用低速(400kHz),操作阶段切换至高速(≤50MHz)。

    • 验证时钟分频系数(STM32H723 SDIO时钟源通常为200MHz):
      // 初始化阶段(400kHz)
      sdio_clock_set(0xFF); // 分频值 = 200MHz / (2 * 0.4MHz) ≈ 250 → 0xFA
      // 高速阶段(30MHz示例)
      sdio_clock_set(0x02); // 200MHz / (2 * 30MHz) ≈ 3.33 → 分频值=3


  • GPIO复用配置

    • 检查SDIO引脚是否正确映射到D0-D3、CMD、CLK,并启用高速模式:
      __HAL_RCC_GPIOC_CLK_ENABLE();
      GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // 必需



2. 缓存一致性处理(H7核心关键)



  • 在SDIO DMA传输前后添加缓存维护:
     // DMA发送前(清理缓存)
    SCB_CleanDCache_by_Addr((uint32_t*)buf, len);
    // DMA接收后(失效缓存)
    SCB_InvalidateDCache_by_Addr((uint32_t*)buf, len);

  • drv_wlan.c的读写函数中(如sdio_transfer)插入缓存操作。


3. WiFi固件完整性验证



  • 检查固件分区地址与链接脚本是否一致:
     // 分区表示例
    static fal_partition_t wififw = fal_partition_find("wifi_image");

  • 通过串口输出固件内容校验和:
     uint32_t checksum = 0;
    const uint8_t *fw_data = fal_partition_read(wififw, 0, buf, size);
    for(int i=0; i printf("Firmware Checksum: 0x%08Xn", checksum);


4. WiFi库兼容性适配



  • 修改库链接配置

    • 替换OTA库为H7兼容版本(搜索libota_*_stm32h7_gcc.a)。

    • 在工程中移除L4库,添加H7优化的WiFi库(若存在)。


  • 指令集调整
     // 在rtconfig.h中添加宏禁用FPU(若库不支持)
    #define __FPU_PRESENT 0


5. 关键信号调试



  • 硬件信号测量

    • 使用示波器检查:

      • SDIO_CLK是否在初始化阶段输出400kHz方波。

      • DAT0信号是否有CMD5的响应(0x01FF0000)。


    • 确保复位引脚时序:
      // 复位序列示例
      HAL_GPIO_WritePin(WIFI_RST_GPIO_Port, WIFI_RST_Pin, GPIO_PIN_RESET);
      rt_thread_mdelay(50);
      HAL_GPIO_WritePin(WIFI_RST_GPIO_Port, WIFI_RST_Pin, GPIO_PIN_SET);
      rt_thread_mdelay(500); // 等待稳定



6. 软件调试增强




  • wifi_hw_init()中添加阶段日志:


     int wifi_hw_init(void) {
         LOG_D("Step1: SDIO Init");
         if(sdio_init() != RT_EOK) return -1;

         LOG_D("Step2: FW Download");
         if(plat_wifi_fw_download() != 0) {
             LOG_E("FW Download Failed!");
             return -2;
         }

         LOG_D("Step3: Chip Boot");
         if(wifi_chip_boot() != 0) return -3;
         return 0;
    }


  • 捕获并打印SDIO错误寄存器:
     if(SDIO->STA & SDIO_STA_ERROR_FLAGS) {
         LOG_E("SDIO Error: 0x%08X", SDIO->STA);
         SDIO->ICR = SDIO_STA_ERROR_FLAGS; // 清除标志
    }


7. 替代方案验证



  • 临时替换为官方HAL库SDIO驱动:
     // 使用STM32CubeH7的BSP驱动
    #include "stm32h7xx_hal_sd.h"
    extern SD_HandleTypeDef hsd;
    HAL_SD_Init(&hsd);


8. 时序调整



  • 在初始化命令后增加延时:
     // 发送CMD0后等待10ms
    rt_thread_mdelay(10);




问题定位步骤建议



  1. 优先确认硬件信号(CLK、CMD波形)。

  2. 检查缓存维护代码是否插入到所有DMA缓冲区操作中。

  3. 分段执行初始化(先SDIO再固件加载),通过日志定位崩溃点。

  4. 若日志显示"FW Download Failed",重点排查固件加载路径和校验逻辑。


通过以上系统性排查,90%以上的AP6181初始化问题可得到解决。重点聚焦在H7的缓存处理、SDIO时序配置及固件完整性验证三个核心环节。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分