OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3985|回复: 5

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

[复制链接]

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2018-4-10
在线时间
28 小时
发表于 2021-4-6 14:22:06 | 显示全部楼层 |阅读模式
求一份 STM32F103  用SPI方式读写SD卡+fatfs操作系统的参考例程;是每个字节都开关DMA?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2018-4-10
在线时间
28 小时
 楼主| 发表于 2021-4-6 14:36:12 | 显示全部楼层
回复 支持 反对

使用道具 举报

5

主题

356

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4648
金钱
4648
注册时间
2019-4-30
在线时间
902 小时
发表于 2021-4-6 15:51:05 | 显示全部楼层
你先实现SPI对SD卡的读写,然后实现FATFS的接口就好了
回复 支持 反对

使用道具 举报

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2018-4-10
在线时间
28 小时
 楼主| 发表于 2021-4-6 17:08:13 | 显示全部楼层
a1281854907 发表于 2021-4-6 15:51
你先实现SPI对SD卡的读写,然后实现FATFS的接口就好了

试了好多都不成功,最后找了一个SPI通过DMA读写SD卡的例程,是对每个字节进行开关DMA,而且在SPI读写函数中需要重新初始化DMA,实际测试感觉跟不用DMA方式速度差不多呢,没啥优势
回复 支持 反对

使用道具 举报

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2018-4-10
在线时间
28 小时
 楼主| 发表于 2021-4-6 17:25:24 | 显示全部楼层
贴一下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]);
}
回复 支持 反对

使用道具 举报

28

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2018-4-10
在线时间
28 小时
 楼主| 发表于 2021-4-7 08:17:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 00:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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