你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

SDIO 标致位 没有变

[复制链接]
憨客鱼 提问时间:2026-3-23 11:24 / 未解决

我用STM32F407 SDIO 驱动 marvell8801访问WIFI ,程序是从网上下载的标准程序,

static uint8_t hw_sdio_cmd53_write(uint8_t func_num,uint32_t address, uint8_t incr_addr, uint8_t *buf,uint32_t size,uint16_t cur_blk_size) { uint8_t error_status = 0; uint32_t remain_size = size; SDIO_CmdInitTypeDef SDIO_CmdInitStructure = {0}; SDIO_DataInitTypeDef SDIO_DataInitStructure = {0}; LL_DMA_InitTypeDef DMA_DataInitStructure = {0};

__SDIO_CLEAR_FLAG(SDIO, SDIO_FLAG_CMDREND);

/ 1.·¢ËÍCMD53 / / CMD53µÄÃüÁî²ÎÊý¸ñʽΪ / / |--RW FLAG--|--FUNC NUM--|--BLK MODE--|--OP MODE--|--REG ADDR--|--BYTE/BLK CNT--| / / |--1 BYTE--|--3 BYTE--|--1 BYTE--|--1 BYTE--|--17 BYTE--|--9 BYTE --| / SDIO_CmdInitStructure.Argument = 0x80000000; / CMD53µÄR/W writeµÄflag / SDIO_CmdInitStructure.Argument |= func_num << 28; / FUNC / SDIO_CmdInitStructure.Argument |= 0x08000000; / Block mode / SDIO_CmdInitStructure.Argument |= incr_addr ? 0x04000000 : 0x0; / OP MODE :1.µÝÔö 0,¹Ì¶¨µØÖ· /

SDIO_CmdInitStructure.Argument |= address << 9; / REG ADDR,ҪдÈëµÄµØÖ· /

if(remain_size%cur_blk_size) { SDIO_CmdInitStructure.Argument |= (remain_size/cur_blk_size+1); } else { SDIO_CmdInitStructure.Argument |= remain_size/cur_blk_size; }

SDIO_CmdInitStructure.CmdIndex = SDIO_CMD53; SDIO_CmdInitStructure.Response = SDIO_RESPONSE_SHORT; SDIO_CmdInitStructure.WaitForInterrupt = SDIO_WAIT_NO; SDIO_CmdInitStructure.CPSM = SDIO_CPSM_ENABLE;

SDIO_SendCommand(SDIO,&SDIO_CmdInitStructure);

/ µÈ´ý·¢ËÍÍê³É / while (__SDIO_GET_FLAG(SDIO,SDIO_FLAG_CMDREND) == RESET); error_status = hw_sdio_check_err();

if (HW_ERR_OK != error_status) { return HW_ERR_SDIO_CMD53_FAIL; }

__SDIO_CLEAR_FLAG(SDIO, SDIO_FLAG_CMDREND);

/ 2.Æô¶¯DMA / LL_DMA_DeInit(DMA2,LL_DMA_STREAM_3); LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_3); LL_DMA_ClearFlag_TC3(DMA2); DMA_DataInitStructure.Channel = LL_DMA_CHANNEL_4; DMA_DataInitStructure.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; DMA_DataInitStructure.FIFOMode = LL_DMA_FIFOMODE_ENABLE; DMA_DataInitStructure.FIFOThreshold = LL_DMA_FIFOTHRESHOLD_FULL; DMA_DataInitStructure.MemBurst = LL_DMA_MBURST_INC4; DMA_DataInitStructure.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; DMA_DataInitStructure.Mode = LL_DMA_MODE_PFCTRL; if(remain_size%cur_blk_size) { DMA_DataInitStructure.NbData = (remain_size/cur_blk_size+1)cur_blk_size/4; } else { DMA_DataInitStructure.NbData = (remain_size/cur_blk_size)cur_blk_size/4; } DMA_DataInitStructure.PeriphBurst = LL_DMA_PBURST_INC4; DMA_DataInitStructure.PeriphOrM2MSrcAddress = (uint32_t)&SDIO->FIFO; DMA_DataInitStructure.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; DMA_DataInitStructure.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; DMA_DataInitStructure.Priority = LL_DMA_PRIORITY_VERYHIGH; DMA_DataInitStructure.MemoryOrM2MDstAddress = (uint32_t)buf; DMA_DataInitStructure.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;

LL_DMA_Init(DMA2, LL_DMA_STREAM_3, &DMA_DataInitStructure); LL_DMA_EnableStream(DMA2, LL_DMA_STREAM_3);

/ 3.ÅäÖÃSDIO data½á¹¹Ìå / SDIO_DataInitStructure.DataTimeOut = SDIO_24M_DATATIMEOUT;

if(remain_size%cur_blk_size) { SDIO_DataInitStructure.DataLength = (remain_size/cur_blk_size+1)cur_blk_size; } else { SDIO_DataInitStructure.DataLength = (remain_size/cur_blk_size)cur_blk_size; }

hw_sdio_set_dblocksize(&SDIO_DataInitStructure.DataBlockSize,cur_blk_size); SDIO_DataInitStructure.TransferDir = SDIO_TRANSFER_DIR_TO_CARD; SDIO_DataInitStructure.TransferMode = SDIO_TRANSFER_MODE_BLOCK;

SDIO_DataInitStructure.DPSM = SDIO_DPSM_ENABLE;

SDIO_ConfigData(SDIO,&SDIO_DataInitStructure);

__SDIO_DMA_ENABLE(SDIO);

while (LL_DMA_IsActiveFlag_TC3(DMA2) == RESET); / µÈ´ýDMA·¢Ëͳɹ¦ / SDIO_CLEAR_FLAG(SDIO, SDIO_FLAG_DATAEND);/ Çå³ý·¢ËÍÍê³É±êÖ¾ / SDIO_CLEAR_FLAG(SDIO, SDIO_FLAG_DBCKEND);/ Çå³ý·¢ËÍ/½ÓÊÕÊý¾Ý¿é /

LL_DMA_DeInit(DMA2,LL_DMA_STREAM_3); LL_DMA_DisableStream(DMA2,LL_DMA_STREAM_3); LL_DMA_ClearFlag_TC3(DMA2); / Çå³ýDMA´«ÊäÍê³É±ê־λ /

__SDIO_DMA_DISABLE(SDIO); return HW_ERR_OK; }

这段是 wifi_start_scan 的代码 ,这段执行 完了 按道理 标志位应该有了

但是

if((SDIO->STA&SDIO_IT_SDIOIT) == SDIO_IT_SDIOIT) { SDIO->ICR |= SDIO_IT_SDIOIT ; mrvl88w8801_process_packet(); }

这段代码就是进不去,不知道是什么原因

收藏 评论0 发布时间:2026-3-23 11:24

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版