| /****************************************************************************** / 函数功能:初始化W25Q64
 / 修改日期:2013/9/10 19:04:16
 / 输入参数:none
 / 输出参数:none
 / 使用说明:none
 ******************************************************************************/
 void W25X_Init(void)
 {
 SPI_InitTypeDef  SPI_InitStructure ;
 DMA_InitTypeDef  DMA_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 //配置DMA通道,DMA1_CH2收
 //读取SPI FLASH时多数为空数据故而数据地址无需增加
 //启动DMA1的时钟
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 DMA_DeInit(DMA1_Channel2);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI1->DR);
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)W25X_Buffer;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 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_VeryHigh;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel2, &DMA_InitStructure);
 
 
 //配置DMA通道,DMA1_CH3发送
 DMA_DeInit(DMA1_Channel3);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI1->DR);
 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&W25X_TX_Byte);
 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_Disable;
 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_Medium;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel3, &DMA_InitStructure);
 
 //关闭DMA,清DMA标记,使能DMA1_CH2的传输完成中断
 DMA_Cmd(DMA1_Channel3, DISABLE);            //关闭发送DMA
 DMA_Cmd(DMA1_Channel2, DISABLE);            //关闭接收DMA
 DMA_ClearFlag(DMA1_FLAG_GL3|DMA1_FLAG_TC3|DMA1_FLAG_HT3|DMA1_FLAG_TE3);
 DMA_ClearFlag(DMA1_FLAG_GL2|DMA1_FLAG_TC2|DMA1_FLAG_HT2|DMA1_FLAG_TE2);
 DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE);
 
 //初始化SPI时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
 
 
 // SPI配置
 SPI_Cmd(SPI1,DISABLE);
 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;
 SPI_InitStructure.SPI_Mode = SPI_Mode_Master ;
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b ;
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low ;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 ;    //72MHz分频
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ; //SPI设置成LSB模式
 SPI_InitStructure.SPI_CRCPolynomial = 7 ;
 SPI_Init( SPI1, &SPI_InitStructure ) ;
 SPI_Cmd(SPI1,ENABLE);           //启动SPI
 
 //打开SPI1的DMA发送接收请求
 SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
 SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
 
 //清DMA忙信号
 sem_W25X_DMA_Busy = false;
 
 //使能NVIC中断
 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = W25X_DMA_TC_PRIO;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
 }
 
 
 |