void SpiCC3000DMAInit(void) { NVIC_InitTypeDef NVIC_RxInt_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(SPI_DMA_RX_CHANNEL); DMA_DeInit(SPI_DMA_TX_CHANNEL); /* Configure and enable SPI DMA TX Channel interrupt */ NVIC_RxInt_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn; NVIC_RxInt_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_RxInt_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_RxInt_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_RxInt_InitStructure); /* Enable the DMA Channels Interrupts */ DMA_ITConfig(SPI_DMA_TX_CHANNEL, DMA_IT_TC, ENABLE); //传输完成中断打开 DMA_ITConfig(SPI_DMA_RX_CHANNEL, DMA_IT_TC, ENABLE); /* Configure DMA Peripheral but don't send data*/ CC3000_DMA_Config(SPI_DMA_RX, (uint8_t*)wlan_rx_buffer,0); CC3000_DMA_Config(SPI_DMA_TX, (uint8_t*)wlan_tx_buffer,0); /* Enable SPI DMA request */ SPI_I2S_DMACmd(SPI_BASE,SPI_I2S_DMAReq_Rx, ENABLE); SPI_I2S_DMACmd(SPI_BASE,SPI_I2S_DMAReq_Tx, ENABLE); /* Enable DMA RX Channel */ DMA_Cmd(SPI_DMA_RX_CHANNEL, ENABLE); /* Enable DMA TX Channel */ DMA_Cmd(SPI_DMA_TX_CHANNEL, ENABLE); }
int SpiIO(eSPIOperation op, const uint8_t *ptrData, uint32_t ulDataSize, int waitOnCompletion) { eCC3000States current = State(); /* Disable DMA Channels */ CC3000_SPI_DMA_Channels(DISABLE); if (op == eRead) { CC3000_DMA_Config(CC3000_DMA_RX, (uint8_t*) ptrData, ulDataSize); CC3000_DMA_Config(CC3000_DMA_TX, (uint8_t*) spi_readCommand, ulDataSize); } else { CC3000_DMA_Config(CC3000_DMA_RX, (uint8_t*) sSpiInformation.pRxPacket, ulDataSize); CC3000_DMA_Config(CC3000_DMA_TX, (uint8_t*) ptrData, ulDataSize); } /* Enable DMA SPI Interrupt */ DMA_ITConfig(CC3000_SPI_TX_DMA_CHANNEL, DMA_IT_TC, ENABLE); /* Enable DMA Channels */ CC3000_SPI_DMA_Channels(ENABLE); return waitOnCompletion ? Still(current) : 0; }
void SpiDMATXReconfig(unsigned char *tx_buffer,unsigned short NumData) { DMA_DeInit(SPI_DMA_TX_CHANNEL); DMA_ITConfig(SPI_DMA_TX_CHANNEL, DMA_IT_TC, ENABLE); //传输完成中断打开 CC3000_DMA_Config(SPI_DMA_TX, (uint8_t*)tx_buffer,NumData); DMA_Cmd(SPI_DMA_TX_CHANNEL, ENABLE); }