|
本帖最后由 QbJacky 于 2021-2-18 23:27 编辑
你们原来的demo 是采用是查询的,要关闭中断,
搞了一天 没有改好
- #define SD_SDIO_DMA_STREAM DMA2_Channel2
- void SD_DMA_Config(u32*mbuf,u32 bufsize,u8 dir)
- {
- DMA_InitTypeDef DMA_InitStructure;
- /* DMA1 Channel7 configuration ----------------------------------------------*/
- DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
- DMA_DeInit(SD_SDIO_DMA_STREAM);
- DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(&TEST_SDIOx->DATA_BUF0); //(u32)USART2_DR_Address; //外设地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (u32)mbuf; //内存地址,发送时候
- if(dir==1)
- DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;
- else
- DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralSRC;
- DMA_InitStructure.DMA_BufferSize = bufsize;
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //size 0 for byte 1 halfword 2 word
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
- DMA_Init(SD_SDIO_DMA_STREAM, &DMA_InitStructure);
- DMA_Cmd(SD_SDIO_DMA_STREAM,ENABLE); //启动传输
- }
复制代码
- void SDIO_Init(void)
- {
- SD_Error errorstatus;
- NVIC_InitTypeDef NVIC_InitStruct; //中断参数结构体
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); //启动DMA时钟
- SDIO1_GPIOInitRemap();
- RCC->APB2ENR |= 0x1<<12; //open sdio2 clkgate
- TEST_SDIOx->MMC_CARDSEL = 0xC0; //enable module, enable mmcclk
- TEST_SDIOx->MMC_CTRL = 0x03|((0x7)<<3)|(1<<8);//4bit,low speed,1/16 divider,初始化时必须用低速
- TEST_SDIOx->MMC_CRCCTL = 0xC0;
- errorstatus=SD_Init();
- printf("sd_init:%d\r\n",errorstatus);
- NVIC_InitStruct.NVIC_IRQChannel = SDIO2_IRQn; //帧中断
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //占先优先级0
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //次优先级0
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStruct); //初始化NVIC寄存器
- }
- //SDIO中断服务函数
- void SDIO_IRQHandler(void)
- {
- INT8U err;
- OSIntEnter();
- err=SD_ProcessIRQSrc();//处理所有SDIO相关中断
- printf("sdio_irq:%d\r\n",err);
- OSIntExit();
- }
复制代码
读取 block 如下
- SD_Error SD_ReadBlock(u8 *buf,long long addr,u16 blksize,u32 nblks)
- {
- SD_Error errorstatus=SD_OK;
- u32 tempNblk;
- u32 i;
- u32 timeout=SDIO_DATATIMEOUT;
- u32 *tempbuff=(u32*)buf; //转换为u32指针
- TEST_SDIOx->BUF_CTL &= ~(1<<14);
- if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//大容量卡
- {
- blksize=512;
- addr>>=9;
- }
- SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize); //发送CMD16+设置数据长度为blksize,短响应
- printf("c");
- errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN); //等待R1响应
- if(errorstatus!=SD_OK) return errorstatus; //响应错误
- printf("d");
- SDIO_Send_Data_Cfg(SD_DATATIMEOUT,nblks*blksize,blksize,1); //nblks*blksize,块大小恒为512,卡到控制器
- TEST_SDIOx->BUF_CTL |= (1<<14); //SDIO DMA使能
- SD_DMA_Config((u32*)buf,nblks*blksize,0);
- TEST_SDIOx->MMC_IO = 0x02;
- if(nblks>1) //多块读
- {
- SDIO_Send_Cmd(SD_CMD_READ_MULT_BLOCK,1,addr); //发送CMD18+从addr地址出读取数据,短响应
- errorstatus=CmdResp1Error(SD_CMD_READ_MULT_BLOCK); //等待R1响应
- printf("abc%d\r\n",errorstatus);
- if(errorstatus!=SD_OK)return errorstatus; //响应错误
- }else //单块读
- {
- SDIO_Send_Cmd(SD_CMD_READ_SINGLE_BLOCK,1,addr); //发送CMD17+从addr地址出读取数据,短响应
- printf("e");
- errorstatus=CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK); //等待R1响应
- printf("f");
- if(errorstatus!=SD_OK)return errorstatus; //响应错误
- printf("efg%d\r\n",errorstatus);
- }
- TEST_SDIOx->MMC_INT_MASK |=(1<<0)|(1<<1)|(1<<6)|(1<<7); //使能sd 中断
- return errorstatus;
- }
复制代码
|
|