搜索
bottom↓
回复: 2

斑竹 有没有 dma 读取tf卡的 例子,我看你们的例子不是采用dma

[复制链接]

出0入0汤圆

发表于 2021-2-18 23:12:03 | 显示全部楼层 |阅读模式
本帖最后由 QbJacky 于 2021-2-18 23:27 编辑

你们原来的demo 是采用是查询的,要关闭中断,
搞了一天 没有改好


  1. #define SD_SDIO_DMA_STREAM        DMA2_Channel2
  2. void SD_DMA_Config(u32*mbuf,u32 bufsize,u8 dir)
  3. {                 
  4.         DMA_InitTypeDef    DMA_InitStructure;
  5.         /* DMA1 Channel7 configuration ----------------------------------------------*/
  6.         DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
  7.         DMA_DeInit(SD_SDIO_DMA_STREAM);
  8.         DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)(&TEST_SDIOx->DATA_BUF0);                                                                //(u32)USART2_DR_Address;        //外设地址
  9.         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)mbuf;                                                                                                                                                                //内存地址,发送时候
  10.         if(dir==1)
  11.                 DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST;
  12.         else
  13.                 DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralSRC;
  14.         DMA_InitStructure.DMA_BufferSize = bufsize;
  15.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  16.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  17.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;                        //size 0 for byte  1 halfword 2 word
  18.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  19.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  20.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  21.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  22.         DMA_Init(SD_SDIO_DMA_STREAM, &DMA_InitStructure);       
  23.         DMA_Cmd(SD_SDIO_DMA_STREAM,ENABLE);                                                                                                                                                                        //启动传输       
  24. }  
复制代码

  1. void SDIO_Init(void)
  2. {
  3.         SD_Error errorstatus;
  4.         NVIC_InitTypeDef NVIC_InitStruct;                 //中断参数结构体
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);                                                                //启动DMA时钟
  6.         SDIO1_GPIOInitRemap();       
  7.         RCC->APB2ENR |= 0x1<<12; //open sdio2 clkgate       
  8.         TEST_SDIOx->MMC_CARDSEL = 0xC0;   //enable module, enable mmcclk
  9.         TEST_SDIOx->MMC_CTRL    = 0x03|((0x7)<<3)|(1<<8);//4bit,low speed,1/16 divider,初始化时必须用低速               
  10.         TEST_SDIOx->MMC_CRCCTL   = 0xC0;
  11.         errorstatus=SD_Init();

  12.         printf("sd_init:%d\r\n",errorstatus);

  13.         NVIC_InitStruct.NVIC_IRQChannel = SDIO2_IRQn;                        //帧中断
  14.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;        //占先优先级0
  15.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;                  //次优先级0
  16.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                         //IRQ通道被使能
  17.         NVIC_Init(&NVIC_InitStruct);                                                          //初始化NVIC寄存器

  18. }


  19. //SDIO中断服务函数                  
  20. void SDIO_IRQHandler(void)
  21. {               
  22.         INT8U err;
  23.         OSIntEnter();
  24.         err=SD_ProcessIRQSrc();//处理所有SDIO相关中断
  25.         printf("sdio_irq:%d\r\n",err);
  26.         OSIntExit();
  27. }                                        
复制代码


读取 block 如下
  1. SD_Error SD_ReadBlock(u8 *buf,long long addr,u16 blksize,u32 nblks)
  2. {
  3.         SD_Error errorstatus=SD_OK;
  4.         u32 tempNblk;
  5.         u32 i;
  6.         u32 timeout=SDIO_DATATIMEOUT;  
  7.         u32 *tempbuff=(u32*)buf;        //转换为u32指针
  8.           TEST_SDIOx->BUF_CTL &= ~(1<<14);
  9.         if(CardType==SDIO_HIGH_CAPACITY_SD_CARD)//大容量卡
  10.         {
  11.                 blksize=512;
  12.                 addr>>=9;
  13.         }   
  14.         SDIO_Send_Cmd(SD_CMD_SET_BLOCKLEN,1,blksize);                                //发送CMD16+设置数据长度为blksize,短响应           
  15.         printf("c");
  16.         errorstatus=CmdResp1Error(SD_CMD_SET_BLOCKLEN);                                //等待R1响应   
  17.         if(errorstatus!=SD_OK)        return errorstatus;                                   //响应错误
  18.         printf("d");
  19.         SDIO_Send_Data_Cfg(SD_DATATIMEOUT,nblks*blksize,blksize,1);        //nblks*blksize,块大小恒为512,卡到控制器         
  20.         TEST_SDIOx->BUF_CTL |= (1<<14);                                                         //SDIO DMA使能
  21.         SD_DMA_Config((u32*)buf,nblks*blksize,0);
  22.         TEST_SDIOx->MMC_IO = 0x02;
  23.         if(nblks>1)                                                                                                        //多块读  
  24.         {
  25.                 SDIO_Send_Cmd(SD_CMD_READ_MULT_BLOCK,1,addr);                        //发送CMD18+从addr地址出读取数据,短响应           
  26.                 errorstatus=CmdResp1Error(SD_CMD_READ_MULT_BLOCK);                //等待R1响应   
  27.                 printf("abc%d\r\n",errorstatus);
  28.                 if(errorstatus!=SD_OK)return errorstatus;                           //响应错误         
  29.         }else                                                                                                                //单块读
  30.         {
  31.                 SDIO_Send_Cmd(SD_CMD_READ_SINGLE_BLOCK,1,addr);                        //发送CMD17+从addr地址出读取数据,短响应           
  32.                 printf("e");
  33.                 errorstatus=CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK);        //等待R1响应   
  34.                 printf("f");
  35.                 if(errorstatus!=SD_OK)return errorstatus;                           //响应错误         
  36.                 printf("efg%d\r\n",errorstatus);
  37.         }
  38.         TEST_SDIOx->MMC_INT_MASK |=(1<<0)|(1<<1)|(1<<6)|(1<<7);                //使能sd 中断
  39.         return errorstatus;
  40. }       
复制代码

出0入0汤圆

 楼主| 发表于 2021-2-19 01:26:39 | 显示全部楼层
将 SDIO_IRQHandler 改为 SDIO2_IRQHandler
能进入中断了 但是 是cmd 的中断 数据传输完成的中断没有启动
好像 没有绑定到 dma 和 sdio2 的关系

出0入0汤圆

发表于 2021-2-19 14:15:55 | 显示全部楼层
关注学习一下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 07:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表