程序要使用spi dma,由于以前没有用到过,有些疑惑,主要使用的是spi2,我主要是想用其接收一帧数据,主要的配置如下:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//SPI2 RX DMA 将数据从外设读取到内部存储器中
DMA_DeInit(DMA1_Channel4); //
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)RfBuf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设为源地址
DMA_InitStructure.DMA_BufferSize = 64;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //传输时外设地址不自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设传输长度为8 bit
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存传输长度为8 bit
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //非循环采集
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级为中
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器到存储器模式
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel4, DISABLE);
// Tx DMA Config
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure.DMA_PeripheralBaseAddr = SPI2_DR_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = 0;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
DMA_Cmd(DMA1_Channel5, DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
由于程序主要是想要使用SPI2的DMA 接收,所以我的接收函数如下:
A7130_CS_LOW(); //拉低总线
ByteSend(0x45); //spi 发送地址
DMA_Cmd(DMA1_Channel4,ENABLE); //使能spi2 DMA 接收
while(!DMA_GetFlagStatus(DMA1_FLAG_TC4)); //等待接收完成
DMA_ClearFlag(DMA1_FLAG_TC4); //清除接收完成标志
DMA_Cmd(DMA1_Channel4, DISABLE); //关闭中断
A7130_CS_HIGH(); //拉高总线
现在的情况是这样的,调试程序的时候,总是在 while(!DMA_GetFlagStatus(DMA1_FLAG_TC4));这一步,这表明没有接收完成,
我的疑问如下:
1:如要使用spi dma rx,是不是需要使能spi dma的TX的?
2:spi dma 中收发时的时钟改如何给,不需要时钟的吗?
其实,归结起来就是由于使用一般的spi读我的某个器件数据的时候,是需要先使用spi发送一个地址,然后再发送一些空时钟给器件,在发送空时钟的过程中,器件会将数据发送到spi总线上,DMA这个读的过程该如何操作,谢谢!
2018-9-5 09:39:46
您下载一下:http://www.stmcu.org/bbs/article_244_589952.html
STM32神舟IV号光盘资料的摄像头模块代码就是DMA做的,可以参考一下
您下载一下:http://www.stmcu.org/bbs/article_244_589952.html
STM32神舟IV号光盘资料的摄像头模块代码就是DMA做的,可以参考一下
举报
2018-9-5 10:03:23
时序由模块自己控制,接收DMA在收到数据以后会自动存放到对应的缓冲数组中。
时序由模块自己控制,接收DMA在收到数据以后会自动存放到对应的缓冲数组中。
举报
2018-9-5 10:16:00
stm32做主机,只有发出tx才能rx, 开启一个发送的dma就能tx
stm32做主机,只有发出tx才能rx, 开启一个发送的dma就能tx
举报
2018-9-5 10:40:48
这个网上有很多例程,可以参考一下,我忘记了ST的库例程有没有了。
这个网上有很多例程,可以参考一下,我忘记了ST的库例程有没有了。
举报