OpenEdv-开源电子网

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

SDIO 发送数据长度与块大小的关系?

[复制链接]

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
发表于 2017-1-7 14:16:27 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 不死鸟 于 2017-1-11 14:22 编辑

近来又遇到一个SDIO发送的问题,在调试过程中我想发送64Bytes的数据,如果SDIO块大小(DBLOCKSIZE)设置为64Bytes,长度(DLEN)设置为64Bytes,是可以正常发送出去的,但是如果设置为块大小为32Bytes,长度为64Bytes,那么实际上只能发出去长度为32Bytes的数据,也就是说实际发送的数据是和块大小相同的,而不是和数据长度相同,不知是哪里出了问题,请了解的人帮忙指点一二,多谢了!
代码如下
[mw_shl_code=c,true]
        SDIO->DTIMER = 0xFFFFFFFF; //超时时间
        SDIO->DLEN = u32length&0x01FFFFFF;   //长度共25bit
        SDIO->DCTRL &= 0xffffff08;                        //清除之前的设置
        SDIO->DCTRL &= ~(1<<2);              //数据块传输
        SDIO->DCTRL |= u16block&0xF0;           //数据块长度
        SDIO->DCTRL &= ~(1<<1);                            //数据由控制器向外设发送
        SDIO->DCTRL |= (1<<3);              //使能DMA  
        SDIO->DCTRL |=0x01;                                 //使能传输
       
        DMA2->IFCR |= 0x0000f000;                        //清除DMA2通道4相关中断标志位

        DMA2_Channel4->CCR &= !(1 << 0);                //通道不工作,关闭DMA2

        DMA2_Channel4->CCR &= 0x00000000;                //清除之前的设置
        DMA2_Channel4->CCR |= 0<<14;                        //非存储器到存储器模式
        DMA2_Channel4->CCR |= 2<<12;                        //通道优先级高

        DMA2_Channel4->CCR |= 2<<10;                //存储器数据宽度32bits
        DMA2_Channel4->CCR |= 2<<8;                        //外设数据宽度32bits

        DMA2_Channel4->CCR |= 1<<7;                                //执行存储器地址增量操作
        DMA2_Channel4->CCR |= 0<<6;                                //不执行外设地址增量操作
        DMA2_Channel4->CCR |= 0<<5;                                //不执行循环操作
        DMA2_Channel4->CCR |= (0x01<<4);                //设置传输方向

        //数据传输数量
        DMA2_Channel4->CNDTR = u32length/4;
       
        DMA2_Channel4->CPAR  = (uint32_t)&SDIO->FIFO;        //外设地址
        DMA2_Channel4->CMAR  = (uint32_t)pu32data;                //存储器地址寄存器
        DMA2_Channel4->CCR |= 0x0A;                                           //开启传输错误中断和传输结束中断
        DMA2_Channel4->CCR |= 1<<0;                                            //通道开启,使能DMA2
[/mw_shl_code]

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

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
 楼主| 发表于 2017-1-11 13:42:13 | 显示全部楼层
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-1-11 13:47:46 | 显示全部楼层
确定你这个寄存器配置正确?
QQ截图20170111134654.png
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
 楼主| 发表于 2017-1-11 14:16:03 | 显示全部楼层
本帖最后由 不死鸟 于 2017-1-11 14:21 编辑
八度空间 发表于 2017-1-11 13:47
确定你这个寄存器配置正确?

  
感谢@八度空间 的驾临,我重新看了一下,恕我愚拙没有看出问题,还请点播,多谢!

SDIO->DCTRL &= 0xffffff08;           //清除之前的设置 主要是清除数据块长度,数据传输模式,数据传输方向,数据传输使能,保留之前DMA使能的设置
    SDIO->DCTRL &= ~(1<<2);              //数据块传输  bit2位数据传输模式  0位块数据传输
    SDIO->DCTRL |= u16block&0xF0;    //数据块长度 块大小为bit3--bit7
    SDIO->DCTRL &= ~(1<<1);             //数据由控制器向外设发送  bit1为数据传输方向 0表示控制器向卡传输  即主机输出数据
    SDIO->DCTRL |= (1<<3);              //使能DMA  bit3位DMA使能  1表示使能DMA  
    SDIO->DCTRL |=0x01;              //使能传输  bit0为数据传输使能位 1 表示开始传输数据
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-1-11 20:26:37 | 显示全部楼层
不死鸟 发表于 2017-1-11 14:16
感谢@八度空间 的驾临,我重新看了一下,恕我愚拙没有看出问题,还请点播,多谢!

SDIO->DCTRL & ...

SDIO->DCTRL |= ((u16block&0x1F)<<3);
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
 楼主| 发表于 2017-1-12 10:15:52 | 显示全部楼层
八度空间 发表于 2017-1-11 20:26
SDIO->DCTRL |= ((u16block&0x1F)

哦哦,你说的是这个,我传入的u16block本身就是移位完成的。就是下面这种模式
#define SDIO_DataBlockSize_1b               ((uint32_t)0x00000000)
#define SDIO_DataBlockSize_2b               ((uint32_t)0x00000010)
#define SDIO_DataBlockSize_4b               ((uint32_t)0x00000020)
#define SDIO_DataBlockSize_8b               ((uint32_t)0x00000030)
#define SDIO_DataBlockSize_16b              ((uint32_t)0x00000040)
#define SDIO_DataBlockSize_32b              ((uint32_t)0x00000050)
#define SDIO_DataBlockSize_64b              ((uint32_t)0x00000060)
#define SDIO_DataBlockSize_128b             ((uint32_t)0x00000070)
#define SDIO_DataBlockSize_256b             ((uint32_t)0x00000080)
#define SDIO_DataBlockSize_512b             ((uint32_t)0x00000090)
#define SDIO_DataBlockSize_1024b            ((uint32_t)0x000000A0)
#define SDIO_DataBlockSize_2048b            ((uint32_t)0x000000B0)
#define SDIO_DataBlockSize_4096b            ((uint32_t)0x000000C0)
#define SDIO_DataBlockSize_8192b            ((uint32_t)0x000000D0)
#define SDIO_DataBlockSize_16384b           ((uint32_t)0x000000E0)

不过你的代码我理解上有点问题,不知道你说的u16block是什么样的格式,如果是块大小,如1,2,3,那么貌似会有问题,bit3是DMA使能位,bit4--bit7是数据块长度位,
SDIO->DCTRL |= ((u16block&0x1F)<<3);是想把数据块大小和DMA使能同时设置么?
这个语句里(u16block&0x1F)的bit4会一直是1吧?bit0会受到u16block的数据影响,进而影响到DMA使能位,您看是么?


回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-1-13 11:26:06 | 显示全部楼层
不死鸟 发表于 2017-1-12 10:15
哦哦,你说的是这个,我传入的u16block本身就是移位完成的。就是下面这种模式
#define SDIO_DataBlockSi ...

如果你这个u16block变量传入的时候已经移位了,设置寄存器的时候就不用再移位了,否则就要移位
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
 楼主| 发表于 2017-1-13 14:03:09 | 显示全部楼层
八度空间 发表于 2017-1-13 11:26
如果你这个u16block变量传入的时候已经移位了,设置寄存器的时候就不用再移位了,否则就要移位

嗯,是的,谢谢。我想问一下,您测过STM32F103的SDIO极限性能么?我现在使用36MHz时钟,8位数据线,每次发送的块大小最多为4Bytes,否则就会出错,而使用18MHz时钟就不会有这个问题。不知这是不是STM32F103的自身瓶颈?请您指点,谢谢啦
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2017-1-13 15:19:40 | 显示全部楼层
既然块大小是32,那么传64字节就要分两次,SDIO每块后面都会有CRC。
所以不能像UART这类流式的随便传
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
 楼主| 发表于 2017-1-13 15:41:05 | 显示全部楼层
aozima 发表于 2017-1-13 15:19
既然块大小是32,那么传64字节就要分两次,SDIO每块后面都会有CRC。
所以不能像UART这类流式的随便传

嗯,你说的有道理,好像发完一块后都是需要等待CRC应答的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 11:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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