搜索

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

[复制链接]
36|1
 楼主 | 2021-4-7 08:30 | 显示全部楼层 |阅读模式
试了好多都不成功,最后找了一个SPI通过DMA读写SD卡的例程,是对每个字节进行开关DMA,而且在SPI读写函数中需要重新初始化DMA,实际测试感觉跟不用DMA方式速度差不多呢,没啥优势,  贴一下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:24 | 显示全部楼层
DMA并不能提升SPI的读写速度,DMA只是托管了SPI的控制,实际的收发数据速度还是由SPI的硬件限制。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表