本帖最后由 Afanx 于 2023-2-6 11:20 编辑
例程附件:
N32WB03x_SPI_DMA_demo.zip
(211.58 KB, 下载次数: 17)
GPIO配置:
- void GPIO_Configuration(void)
- {
- GPIO_InitType GPIO_InitStructure;
- RCC_EnableAPB2PeriphClk(SPI_MASTER_GPIO_CLK | RCC_APB2_PERIPH_AFIO, ENABLE);
- GPIO_InitStruct(&GPIO_InitStructure);
- /* Configure SPI_MASTER pins: SCK ,MISO and MOSI */
- GPIO_InitStructure.Pin = SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI;
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH;
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
- GPIO_InitStructure.GPIO_Pull = GPIO_NO_PULL;
- GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_AF;
- GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);
- }
DMA配置:
- void DMA_SPI_Configuration(void)
- {
- DMA_InitType DMA_InitStructure;
- RCC_EnableAHBPeriphClk(SPI_MASTER_DMA_CLK, ENABLE);
- /* SPI_MASTER_TX_DMA_CHANNEL configuration */
- DMA_DeInit(SPI_MASTER_TX_DMA_CHANNEL);
- DMA_InitStructure.PeriphAddr = (uint32_t)&SPI_MASTER->DAT;
- DMA_InitStructure.MemAddr = (uint32_t)SPI_Master_Tx_Buffer;
- DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
- DMA_InitStructure.BufSize = BUFFER_SIZE;
- DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
- DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
- DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;
- DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Byte;
- DMA_InitStructure.CircularMode = DMA_MODE_NORMAL;
- DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
- DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
- DMA_Init(SPI_MASTER_TX_DMA_CHANNEL, &DMA_InitStructure);
- DMA_RequestRemap(SPI_MASTER_TX_DMA_REMAP, DMA, SPI_MASTER_TX_DMA_CHANNEL, ENABLE);
- }
SPI配置:
- void SPI_Configuration(void)
- {
- SPI_InitType SPI_InitStructure;
- RCC_EnableAPB2PeriphClk(SPI_MASTER_CLK, ENABLE);
- SPI_I2S_DeInit(SPI_MASTER);
- /* SPI_MASTER configuration
- * ------------------------------------------------*/
- SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
- SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
- SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
- SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
- SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
- SPI_InitStructure.NSS = SPI_NSS_SOFT;
- SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_32;
- SPI_InitStructure.FirstBit = SPI_FB_MSB;
- SPI_InitStructure.CRCPoly = CRC_POLYNOMIAL;
- SPI_Init(SPI_MASTER, &SPI_InitStructure);
- /* Enable SPI_MASTER */
- SPI_Enable(SPI_MASTER, ENABLE);
- }
封装SPI_DMA写函数:
- void SPI_Write_DMA(SPI_Module* SPIx, uint8_t* writePtr, uint16_t len)
- {
- uint32_t timeOut = 0x1000;
- while ((SPI_I2S_GetStatus(SPIx, SPI_I2S_BUSY_FLAG) != RESET) && (timeOut--)) __NOP(); // Wait BUSY
- // SPI_I2S_ReceiveData(SPIx); // CLear RNE
- SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, DISABLE); // Disable DMA request
- DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, DISABLE); // Disable DMA
- SPI_MASTER_TX_DMA_CHANNEL->MADDR = (uint32_t)writePtr;
- SPI_MASTER_TX_DMA_CHANNEL->TXNUM = len;
- DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, ENABLE); // Enable DMA
- SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, ENABLE); // DMA Start Work
- }
主函数测试:
- int main(void)
- {
- log_init();
- log_info("\n this is a SPI master DMA Demo.\n");
- GPIO_Configuration();
- DMA_SPI_Configuration();
- SPI_Configuration();
-
- log_info("\n DMA Transfer start.\n");
-
- for (int i = 0; i < 3; i++) {
- SPI_Write_DMA(SPI_MASTER, SPI_Master_Tx_Buffer, BUFFER_SIZE);
-
- while (!DMA_GetFlagStatus(SPI_MASTER_TX_DMA_FLAG, SPI_MASTER_DMA)) __NOP();
- }
-
- log_info("\n DMA Transfer end.\n");
- while (1) {
- }
- }
测试结果:
|