OpenEdv-开源电子网

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

stm32f407 sd卡读数据透传

[复制链接]

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
发表于 2020-8-25 16:48:15 | 显示全部楼层 |阅读模式
1金钱
请教下stm32f407 sd卡读数据透传怎么实现? sdiojie'ko

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

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-25 16:48:41 | 显示全部楼层
stm32f407 sd卡读数据透传  sdio接口  走的文件系统
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-8-26 00:54:51 | 显示全部楼层
用文件系统读,你所谓的数据透传是啥意思?
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-26 10:49:22 | 显示全部楼层
本帖最后由 yaakovH 于 2020-8-27 11:03 编辑
正点原子 发表于 2020-8-26 00:54
用文件系统读,你所谓的数据透传是啥意思?

原子哥,我现在是用的文件系统读
1.初始化sd卡时,设置模式为DMA模式了;
          errorstatus=SD_PowerON();                        //SD卡上电
         if(errorstatus==SD_OK)errorstatus=SD_InitializeCards();                        //初始化SD卡                                                                                                                  
          if(errorstatus==SD_OK)errorstatus=SD_GetCardInfo(&SDCardInfo);        //获取卡信息
         if(errorstatus==SD_OK)errorstatus=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡   
           if(errorstatus==SD_OK)errorstatus=SD_EnableWideBusOperation(SDIO_BusWide_4b);        //4位宽度,如果是MMC卡,则不能用4位模式
          if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType))
        {                     
                SDIO_Clock_Set(SDIO_TRANSFER_CLK_DIV);                        //设置时钟频率,SDIO时钟计算公式:SDIO_CK时钟=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定为48Mhz
                errorstatus=SD_SetDeviceMode(SD_DMA_MODE);        //设置为DMA模式
                printf("sd errorstatus : %d \r\n",errorstatus);
                //errorstatus=SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式
         }

2.读取文件采取的文件系统读
if(FR_OK == f_open(&fsrc, "0:file.txt", FA_OPEN_EXISTING | FA_READ))
        {
            printf("file.txt f_open ok !\r\n");

            while(1)
            {   
                memset(txt_buf,'0',1024);
                ///delay_ms(2);
                ress = f_read(&fsrc, txt_buf, 1024, &br);            配置sd卡 DMA模式后,这里获取到数据的方式 应该就是sd卡透传过来的
                printf("br=%d \r\n",br);
                if(ress || br == 0)
                {
                    if(ress)
                        printf("file.txt f_read failed!\r\n");

                    if(br == 0)
                    {
                        printf("br == 0!");
                        delay_ms(200);
                    }
                    
                    f_close(&fsrc);
                    myfree(SRAMIN,txt_buf);
                    
                    printf("f_close fil");

                    break;
                }                  send_data_size = br;

                sent = M8266WIFI_SPI_Send_BlockData(txt_buf, (u32)send_data_size, 5000, link_no, NULL, 0, &status);    这里是 WiFi模块将数据传输给手机,我没想明白的就是  我就算配置spi的DMA,使能DMA,感觉这里txt_buf就直接用了,也没用到SPI的DMA透传           《《《《《==迷惑点
            …………
=============================

3.我这边所谓的数据透传,就是
3.1 卡里面存放的有多个文件,大小不一(txt格式,里面许多数据)
3.2 读卡,这里希望是DMA透传的方式进行传输(主控到WiFi模块,WiFi模块是spi接口的,现用的是spi2,spi1用于flash了)
3.3 读到的数据通过WiFi模块传给手机(3.3部分已经测试过,能达到600k-700kb/s)

现在主要问题是主控到WiFi模块的透传;
刚开始我采用的sd卡模式是查询模式,后面改成DMA模式,传输速度没有变化(这里的改成DMA模式只是  在初始化地方 设置了下 模式为DMA模式,不确定切换模式是否还需要其他操作步骤)

现在想要完成 主控到WiFi的读卡透传

我有试过  将下面1024变成 50*1024  
具体现象:主控到手机的总时间  与之前相比差不多,时间主要花费在 主控到WiFi模块部分
代码贴:
        txt_buf = mymalloc(SRAMIN,1024);

        if(FR_OK == f_open(&fsrc, "0:file.txt", FA_OPEN_EXISTING | FA_READ))
        {
            printf("file.txt f_open ok !\r\n");

            while(1)
            {   
                memset(txt_buf,'0',1024);
                ///delay_ms(2);
                ress = f_read(&fsrc, txt_buf, 1024, &br);              这里
             …………
============

回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-26 10:56:03 | 显示全部楼层
本帖最后由 yaakovH 于 2020-8-26 11:10 编辑

刚进一步测试发现,我这边设置的DMA模式生效了,返回的0也就是SD_OK
打印结果:
LCD ID:9341
sd errorstatus : 0
res0= 0
res1= 0
M8266WIFI module initialisation success!
sd errorstatus : 0
Card space is enough!
log_root :: 0:/PGearDatas
f_mkdir ok!
f_open ok !
br=152
f_read ok !
…………
=====

代码打印部分: 初始化的地方
………
          if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType))
        {                     
                SDIO_Clock_Set(SDIO_TRANSFER_CLK_DIV);                        //设置时钟频率,SDIO时钟计算公式:SDIO_CK时钟=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定为48Mhz
                errorstatus=SD_SetDeviceMode(SD_DMA_MODE);        //设置为DMA模式
                printf("sd errorstatus : %d \r\n",errorstatus);

                //errorstatus=SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式
         }
…………
===============
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-26 10:58:02 | 显示全部楼层
本帖最后由 yaakovH 于 2020-8-27 09:44 编辑

用的 stm32f407探索者
上面跑的freertos
wifi模块 是 spi接口

给我的感觉,DMA模式与查询模式 没什么区别


然后不知道卡里面的数据 到 WiFi模块 不知道有没有透传?(读卡应该是透传打开了)
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-26 11:12:11 | 显示全部楼层
帮自己顶一下
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-26 14:55:48 | 显示全部楼层
本帖最后由 yaakovH 于 2020-8-26 14:56 编辑

怎么实现主控到WiFi的读卡透传
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-27 10:55:46 | 显示全部楼层
换种问法哈:stm32f407 + sdio sd卡 + spi接口 wifi模块   怎么样实现 sd卡里面的数据 透传到WiFi模块?sd卡的DMA已经配置;
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
 楼主| 发表于 2020-8-27 11:04:13 | 显示全部楼层
希望路过的大佬 指点下,不甚感激  讲讲想法也行
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2020-8-4
在线时间
18 小时
发表于 2020-10-21 16:25:38 | 显示全部楼层
楼主,在下小白一名,请教一下你
这部分读取速度如何
while(1)
            {   
                memset(txt_buf,'0',1024);
                ///delay_ms(2);
                ress = f_read(&fsrc, txt_buf, 1024, &br);            配置sd卡 DMA模式后,这里获取到数据的方式 应该就是sd卡透传过来的
                printf("br=%d \r\n",br);
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2020-10-23 14:19:03 | 显示全部楼层

1.先读文件个数 ,返回文件包数  ucBlockNum = sd_File_Parser(ucDMA2_RevceBuff[6], ucDMA2_RevceBuff[7], ucDMA2_RevceBuff[8]);
2.发送指定包号数据  get_SD_Block(ucDMA2_RevceBuff[6]);
3.返回OK
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-29 18:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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