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

2019-10-15 08:05发布

本帖最后由 不死鸟 于 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]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
不死鸟
2019-10-16 06:41
八度空间 发表于 2017-1-13 11:26
如果你这个u16block变量传入的时候已经移位了,设置寄存器的时候就不用再移位了,否则就要移位

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

一周热门 更多>