|
我用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(); } 这段代码就是进不去,不知道是什么原因 |
程序卡死在USB_EPStartXfer这里
SDIO 初始化 死在 __HAL_RCC_SDIO_CLK_ENABLE语句上
我现在使用STM32F446ZET6芯片,外挂了16m的片外SDRAM。想把程序在SDRAM中运行,一直尝试没有成功,希望得到帮助,是否有相关的例子或参考的文档
MotorControl Workbench 6.4.1 生成 FOC 项目代码后运行死机。
STM32F405rgt6 I2S DMA输入会造成卡死,这个芯片有BUG
USBX在F407上创建CDC不能正常使用
STM32F427ZGTx内部RTC秒及亚秒同步问题
有没有STM32F405RG参考设计
LSM6DS3TR-C静止情况下使用MotionFX固件算出的欧拉角周期性异常跳动
全球论坛无法登录
微信公众号
手机版