This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3351:带 SDIO 模式的 STM32 端口

Guru**** 2644125 points

Other Parts Discussed in Thread: CC3351

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1573042/cc3351-stm32-port-with-sdio-mode

器件型号:CC3351


工具/软件:

大家好、我一直使用 SPI 通过 STM32U5 系列测试 CC3351。

我使用了 cc33xx_RTOS_MCU_PACKAGE_R7_2 封装及其 SPI 移植示例。 经过一些试错后、我能够通过 SPI 与 CC3351 进行通信。

现在我要使用相同的 SDIO 引脚。 我正在尝试使用 HAL 提供的 SDIO 函数进行移植。 我在这里失败了。

这是我尝试过的:

#include "sdio_adapt.h"
#include "stm32u5xx_hal.h"

extern SDIO_HandleTypeDef hsdio1;

// Add a new flag for IO-only devices

int sdioAdapt_Init() {
    hsdio1.Instance = SDMMC1;
    hsdio1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
    hsdio1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
    hsdio1.Init.BusWide = SDMMC_BUS_WIDE_4B;
    hsdio1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
    hsdio1.Init.ClockDiv = 80 - 1;
    return HAL_SDIO_Init(&hsdio1) ;
//    if (HAL_SDIO_Init(&hsdio1) != HAL_OK) {
//        Error_Handler();
//    }
//
//    return HAL_OK;

}

int sdioAdapt_read(uint32_t address, uint8_t *data, uint32_t length) {
     HAL_StatusTypeDef ret;

        if (length == 1) {
            // CMD52 single-byte read
            HAL_SDIO_DirectCmd_TypeDef arg = {0};
            arg.Reg_Addr    = address;
            arg.ReadAfterWrite = 0;
            arg.IOFunctionNbr   = 0;      // CC3351 SDIO function (check datasheet!)

            ret = HAL_SDIO_ReadDirect(&hsdio1, &arg, data);
        } else {
            // CMD53 multi-byte read
            HAL_SDIO_ExtendedCmd_TypeDef arg = {0};
            arg.Reg_Addr    = address;
            arg.IOFunctionNbr   = 0;      // CC3351 SDIO function number
            arg.OpCode     = 1;      // incrementing address
            arg.Block_Mode  = 0;      // 0=byte mode, 1=block mode

            ret = HAL_SDIO_ReadExtended(&hsdio1, &arg, data, length, HAL_MAX_DELAY);
        }

        return (ret == HAL_OK) ? 0 : -1;
}

int sdioAdapt_write(uint32_t address, uint8_t *data, uint32_t length) {
    HAL_StatusTypeDef ret;

        if (length == 1) {
            // CMD52 single-byte write
            HAL_SDIO_DirectCmd_TypeDef arg = {0};
            arg.Reg_Addr    = address;
            arg.ReadAfterWrite = 0;
            arg.IOFunctionNbr   = 1;

            ret = HAL_SDIO_WriteDirect(&hsdio1, &arg, *data);
        } else {
            // CMD53 multi-byte write
            HAL_SDIO_ExtendedCmd_TypeDef arg = {0};
            arg.Reg_Addr    = address;
            arg.IOFunctionNbr   = 1;
            arg.OpCode     = 1;
            arg.Block_Mode  = 0;

            ret = HAL_SDIO_WriteExtended(&hsdio1, &arg, data, length, HAL_MAX_DELAY);
        }

        return (ret == HAL_OK) ? 0 : -1;
}

int sdioAdapt_deInit() {
    HAL_SDIO_DeInit(&hsdio1);
    return 0;
}

但这并不成功。 我将相同的代码从在 SPI 模式下工作的内容移植到 SDIO。 我在这里刚刚使用了 SDIO 通信。 禁用 SPI 端口文件和外设。

如果有任何我可以参考的东西,会有帮助。