OpenEdv-开源电子网

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

USB读卡器实验 DMA+SPI的问题,向大神们请教

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2011-3-23
在线时间
2 小时
发表于 2014-2-14 15:38:40 | 显示全部楼层 |阅读模式
我最近在玩USB读卡器的实验,往SD卡写数据我测试的速度是170KB/S,太慢了。坛子上有人说用DMA能提高速度。于是我修改了一下USB读卡器的实验:DMA+SPI。

这是初始化DMA函数:
MYDMA_Config(DMA1_Channel5,(u32)&SPI2->DR,(u32)OUT_BUFF,512);//DMA1通道5,外设为SPI2,存储器为OUT_BUFF,长度512.     


这是SPI写数据函数:
u8 SD_SendBlock(u8*buf,u8 cmd)
{
u16 t;    
if(SD_WaitReady())return 1;//等待准备失效
for(t=0;t<512;t++)
OUT_BUFF[t]=buf[t];
SD_SPI_ReadWriteByte(cmd);
if(cmd!=0XFD)//不是结束指令
{
// for(t=0;t<512;t++)SPI2_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
MYDMA_Enable(DMA1_Channel5);//开始一次DMA传输!
        SD_SPI_ReadWriteByte(0xFF);//忽略crc
        SD_SPI_ReadWriteByte(0xFF);
t=SD_SPI_ReadWriteByte(0xFF);//接收响应
if((t&0x1F)!=0x05)return 2;//响应错误      
}      
    return 0;//写入成功
}

得到的现象就是往SD卡里拷数据的时候屏幕会显示错误,而且拷的数据也不正确。请问是什么原因呢?









正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2011-3-23
在线时间
2 小时
 楼主| 发表于 2014-2-14 15:39:47 | 显示全部楼层
我主要想问一下我这样写对不对?如果不对的话怎么写呢?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-14 15:56:41 | 显示全部楼层
SPI的速度最高是多少?你想要快速的话用SDIO驱动方式吧

原子的USB实验SDIO版本http://www.openedv.com/posts/list/25896.htm

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-14 15:57:00 | 显示全部楼层
回复【2楼】laochang777:
---------------------------------
你的DMA配置了没有?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2011-3-23
在线时间
2 小时
 楼主| 发表于 2014-2-14 16:15:52 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
SDIO挑卡比较严重,我这个卡是1G的,能够初始化,但是无法读取数据,2G的卡可以。
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2011-3-23
在线时间
2 小时
 楼主| 发表于 2014-2-14 16:16:18 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base;  //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
DR_Base=cpar;
DMA_CHx->CPAR=DR_Base;   //DMA1 外设地址 
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr;      //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr;    //DMA1,传输数据量
DMA_CHx->CCR=0X00000000;//复位
DMA_CHx->CCR|=1<<4;  //从存储器读
DMA_CHx->CCR|=0<<5;  //普通模式
DMA_CHx->CCR|=0<<6;  //外设地址非增量模式
DMA_CHx->CCR|=1<<7;  //存储器增量模式
DMA_CHx->CCR|=0<<8;  //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式   
}
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-2-14 16:51:02 | 显示全部楼层
回复【5楼】laochang777:
---------------------------------
1、我搞了这个http://www.openedv.com/posts/list/27146.htm
2、有寄存器版本和库函数版本,建议你用的话就用库函数那个,暂时没发现bug。另外有个原子的战舰的测试工程
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 10:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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