你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于SPI的DMA方式读写SD卡

[复制链接]
waytoanswer 发布时间:2012-12-28 23:24
近期在做CH376的驱动,由于官方提供了参考手册,和驱动程序,在稍加移植后测试了简单的U盘读写函数,获取设备信息等功能并测试了读取文件的速度。由于之前移植了FATFS读写SD卡,想对比一下二者读写速度如何,于是采用内部RTC测时间加UART输出结果的方式测量了一下读文件的速度,测试结果CH376读取U盘速度约260KB/s(采用SPI接口,时钟为18MHz),SPI读取SD卡11M的MP3文件约330KB/s左右(SPI时钟为18MHz),后来优化了一下读SD卡的函数,速度提升390KB/s。可还是觉得速度不够快,于是考虑用DMA方式读取。好了,上面废话了那么多,下面进入正题。
SPI既可以用工作于DMA发送方式,也可以工作于DMA接收方式。SPI 采用DMA发送时一般没什么问题,然而接收时则出问题了。虽然都配置好了SPI_RX的DMA通道,也将SPI->CR2里的RXDMAEN置位了,但始终接收不到SD卡的数据,程序始终在等待DMA传输完成位置位。虽然知道SPI只有在DR写入数据开始发送时才会输出时钟,但在做DMA接收时认为时钟是自动输出的,于是始终解决不了问题,后来在网上找了很久,终于找到一个帖子,里面说的情况跟我遇到的类似,从中了解到SPI在DMA接收时并没有时钟输出,后来想想,这种SPI DMA接收应该是工作在从机模式的吧,因为主机会发送时钟。如果需要工作在主机接收模式,则还是要靠写DR来发送时钟,为此可以在开启接收DMA的同时开启发送DMA,并且接收DMA的优先级高于发送DMA,发送DMA配置为内存到外设,内存地址不自增,发送字节数与接收字节数相同,并且始终发送0xFF,这样发送通道的DMA每发送完一字节,RXNE置位,触发接收通道DMA,由于接收通道DMA优先级高于发送DMA,于是接收DMA接收一字节,而后TXE置位,又触发发送DMA,像这样循环,从而实现了SPI 的DMA连续接收数据。下面附上移植的FATFS里的rcvr_mmc()数据读函数:
/*-----------------------------------------------------------------------*/
/* Receive bytes from the card (bitbanging)                              */
/*-----------------------------------------------------------------------*/
unsigned char g_SPIDMASEND=0xFF;
static unsigned char DMA_Config_Flag=0;
static
void rcvr_mmc (
BYTE *buff, /* Pointer to read buffer */
UINT bc  /* Number of bytes to receive */
)
{
    if(bc>=50)
    {
        if(DMA_Config_Flag==0)
        {
            MYDMA_Config(DMA1_Channel4,(u32)&SPI2->DR,(u32)buff,bc,0x2080); //SPI2_DMA_RX
            MYDMA_Config(DMA1_Channel5,(u32)&SPI2->DR,(u32)&g_SPIDMASEND,bc,0x1010);//SPI2_DMA_TX
            DMA_Config_Flag=1;
        }
        else
        {
            DMA1_Channel4->CNDTR=bc;
            DMA1_Channel4->CMAR=(u32)buff;
            DMA1_Channel5->CNDTR=bc;
        }
        while((SPI2->SR&2)==0);
        SPI2->DR;
        SPI2->CR2|=3;  //enable TXDMA,RXDMA
                           
        MYDMA_Enable(DMA1_Channel4);
        MYDMA_Enable(DMA1_Channel5);
////////////////////////////////////////////////////////
//参考 http://bbs.eeworld.com.cn/thread-250154-1-1.html
////////////////////////////////////////////////////////
        
        while(!(DMA1->ISR&(1DR=0xff;
            while((SPI2->SR&1)==0);
            *buff++ = SPI2->DR;
        }
    }
}
当读取数据小于50时采用非DMA读写,大于等于50采用DMA读写,以提高效率。这样改写后,再测试读取同一文件的速度达到696KB/s,相比之前提升了近3/4,DMA的速度果然够快。大家也可以尝试一下。
09_1.jpg
收藏 4 评论9 发布时间:2012-12-28 23:24

举报

9个回答
waytoanswer 回答时间:2012-12-29 13:57:24

RE:关于SPI的DMA方式读写SD卡

求围观啊
gideon518j 回答时间:2013-1-22 15:08:20

回复:关于SPI的DMA方式读写SD卡

 好文! 用DMA的性能都杠杠的。
hwl1023 回答时间:2013-5-13 11:27:08

RE:关于SPI的DMA方式读写SD卡

求个完整例程。谢谢
lvlovelive 回答时间:2013-5-30 18:08:56

回复:关于SPI的DMA方式读写SD卡

好东东啊,学习了……
liucl2008 回答时间:2013-7-13 11:21:26

RE:关于SPI的DMA方式读写SD卡

就需要这么一点程序吗
pbSTM32 回答时间:2014-3-20 21:13:46

回复:关于SPI的DMA方式读写SD卡

回复第 6 楼 于2013-07-13 11:21:26发表:
就需要这么一点程序吗 

你好,最近我也在用CH376,也用DMA方式,能不能给个完整的程序,感激不尽啊!邮箱是:1373812024@qq.com
mengyy123 回答时间:2015-10-31 09:42:17
SD传输的时候一直卡在了DMA等待这里
用野火的不行,换了安富莱的驱动就可以了
putiliaozu 回答时间:2017-8-3 09:58:36
nihaoshijie5188 回答时间:2018-2-22 15:42:47
希望大家可以多交流呀

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版