程序要使用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这个读的过程该如何操作,谢谢! |
RE:关于stm32 SPI DMA传输的请教
STM32神舟IV号光盘资料的摄像头模块代码就是DMA做的,可以参考一下
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教
RE:关于stm32 SPI DMA传输的请教