本帖最后由 不死鸟 于 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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
感谢@八度空间 的驾临,我重新看了一下,恕我愚拙没有看出问题,还请点播,多谢!
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 表示开始传输数据
哦哦,你说的是这个,我传入的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使能位,您看是么?
如果你这个u16block变量传入的时候已经移位了,设置寄存器的时候就不用再移位了,否则就要移位
一周热门 更多>