野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24583|回复: 3

求教 STM32F103 用SPI方式读写SD卡+fatfs操作系统

[复制链接]
发表于 2021-4-7 08:27:30 | 显示全部楼层 |阅读模式
参考资料比较少,试了好多都不成功,最后找了一个SPI通过DMA读写SD卡的例程,是对每个字节进行开关DMA,而且在SPI读写函数中需要重新初始化DMA,实际测试感觉跟不用DMA方式速度差不多呢,没啥优势
回复

使用道具 举报

 楼主| 发表于 2021-4-7 08:28:09 | 显示全部楼层

贴一下SPI读写一个字节的函数,在函数里需要配置DMA,后面的都是调用这个函数,大家有什么更好的处理方式;这种方式效果还没有我直接不用DMA好呢

u8 SPI1_ReadWriteByte(u8 TxData)
{
        DMA_InitTypeDef DMA_InitStructure;
        DMA_Cmd(DMA1_Channel2,DISABLE);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI1_DR_Addr;
                // Äú′æμØÖ·(òa′«êäμıäá¿μÄÖ¸Õë)
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI_RX_BUF;
        // ·½Ïò£o′óÄú′æμ½íaéè      
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        // ′«êä′óD¡      
        DMA_InitStructure.DMA_BufferSize = 1;
        // íaéèμØÖ·2»Ôö            
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        // Äú′æμØÖ·×ÔÔö
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        // íaéèêy¾Yμ¥λ      
        DMA_InitStructure.DMA_PeripheralDataSize =
        DMA_PeripheralDataSize_Byte;
        // Äú′æêy¾Yμ¥λ
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         
        // DMAģ꽣¬ò»′λòÕßÑ-»·Ä£ê½
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
        //DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;      
        // óÅÏ輶£oÖD      
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
        // ½ûÖ1Äú′æμ½Äú′æμÄ′«êä
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        // ÅäÖÃDMAí¨μà                  
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);      
      
        DMA_DeInit(DMA1_Channel3);
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI_TX_BUF;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);               
        SPI_TX_BUF[0]= TxData;
        DMA_ClearFlag(DMA1_FLAG_TC2);
        DMA_ClearFlag(DMA1_FLAG_TC3);
        DMA_Cmd (DMA1_Channel3,ENABLE);
        DMA_Cmd (DMA1_Channel2,ENABLE);
        SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx, ENABLE);
        SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Rx, ENABLE);      
        while (!DMA_GetFlagStatus(DMA1_FLAG_TC2));
        while (!DMA_GetFlagStatus(DMA1_FLAG_TC3));
        DMA_Cmd (DMA1_Channel3,DISABLE);
        DMA_Cmd (DMA1_Channel2,DISABLE);
        DMA_ClearFlag(DMA1_FLAG_TC2);
        DMA_ClearFlag(DMA1_FLAG_TC3);      
        return (SPI_RX_BUF[0]);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-7 10:26:31 | 显示全部楼层
@野火 66666666666666666666
回复 支持 反对

使用道具 举报

发表于 2021-4-8 15:58:54 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-29 22:11 , Processed in 0.035422 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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