[N32WBxxx] N32WB031 SPI+DMA发送demo

[复制链接]
 楼主| Afanx 发表于 2023-2-6 11:20 | 显示全部楼层 |阅读模式
本帖最后由 Afanx 于 2023-2-6 11:20 编辑

例程附件:
N32WB03x_SPI_DMA_demo.zip (211.58 KB, 下载次数: 17)

GPIO配置:
  1. void GPIO_Configuration(void)
  2. {
  3.     GPIO_InitType GPIO_InitStructure;

  4.     RCC_EnableAPB2PeriphClk(SPI_MASTER_GPIO_CLK | RCC_APB2_PERIPH_AFIO, ENABLE);

  5.     GPIO_InitStruct(&GPIO_InitStructure);
  6.     /* Configure SPI_MASTER pins: SCK ,MISO and MOSI */
  7.     GPIO_InitStructure.Pin            = SPI_MASTER_PIN_SCK | SPI_MASTER_PIN_MOSI;
  8.     GPIO_InitStructure.GPIO_Speed     = GPIO_SPEED_HIGH;
  9.     GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
  10.     GPIO_InitStructure.GPIO_Pull      = GPIO_NO_PULL;
  11.     GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_AF;
  12.     GPIO_InitPeripheral(SPI_MASTER_GPIO, &GPIO_InitStructure);
  13. }
DMA配置:
  1. void DMA_SPI_Configuration(void)
  2. {
  3.     DMA_InitType DMA_InitStructure;

  4.     RCC_EnableAHBPeriphClk(SPI_MASTER_DMA_CLK, ENABLE);
  5.     /* SPI_MASTER_TX_DMA_CHANNEL configuration */
  6.     DMA_DeInit(SPI_MASTER_TX_DMA_CHANNEL);
  7.     DMA_InitStructure.PeriphAddr     = (uint32_t)&SPI_MASTER->DAT;
  8.     DMA_InitStructure.MemAddr        = (uint32_t)SPI_Master_Tx_Buffer;
  9.     DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;
  10.     DMA_InitStructure.BufSize        = BUFFER_SIZE;
  11.     DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
  12.     DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
  13.     DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_BYTE;
  14.     DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_Byte;
  15.     DMA_InitStructure.CircularMode   = DMA_MODE_NORMAL;
  16.     DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
  17.     DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;
  18.     DMA_Init(SPI_MASTER_TX_DMA_CHANNEL, &DMA_InitStructure);
  19.     DMA_RequestRemap(SPI_MASTER_TX_DMA_REMAP, DMA, SPI_MASTER_TX_DMA_CHANNEL, ENABLE);
  20. }
SPI配置:
  1. void SPI_Configuration(void)
  2. {
  3.     SPI_InitType SPI_InitStructure;

  4.     RCC_EnableAPB2PeriphClk(SPI_MASTER_CLK, ENABLE);

  5.     SPI_I2S_DeInit(SPI_MASTER);
  6.     /* SPI_MASTER configuration
  7.      * ------------------------------------------------*/
  8.     SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
  9.     SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
  10.     SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
  11.     SPI_InitStructure.CLKPOL        = SPI_CLKPOL_HIGH;
  12.     SPI_InitStructure.CLKPHA        = SPI_CLKPHA_SECOND_EDGE;
  13.     SPI_InitStructure.NSS           = SPI_NSS_SOFT;
  14.     SPI_InitStructure.BaudRatePres  = SPI_BR_PRESCALER_32;
  15.     SPI_InitStructure.FirstBit      = SPI_FB_MSB;
  16.     SPI_InitStructure.CRCPoly       = CRC_POLYNOMIAL;
  17.     SPI_Init(SPI_MASTER, &SPI_InitStructure);

  18.     /* Enable SPI_MASTER */
  19.     SPI_Enable(SPI_MASTER, ENABLE);
  20. }
封装SPI_DMA写函数:
  1. void SPI_Write_DMA(SPI_Module* SPIx, uint8_t* writePtr, uint16_t len)
  2. {
  3.     uint32_t timeOut = 0x1000;
  4.     while ((SPI_I2S_GetStatus(SPIx, SPI_I2S_BUSY_FLAG) != RESET) && (timeOut--)) __NOP();  // Wait BUSY

  5.     // SPI_I2S_ReceiveData(SPIx);  // CLear RNE

  6.     SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, DISABLE);  // Disable DMA request

  7.     DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, DISABLE); // Disable DMA
  8.     SPI_MASTER_TX_DMA_CHANNEL->MADDR = (uint32_t)writePtr;
  9.     SPI_MASTER_TX_DMA_CHANNEL->TXNUM = len;
  10.     DMA_EnableChannel(SPI_MASTER_TX_DMA_CHANNEL, ENABLE);  // Enable DMA

  11.     SPI_I2S_EnableDma(SPIx, SPI_I2S_DMA_TX, ENABLE);  // DMA Start Work
  12. }
主函数测试:
  1. int main(void)
  2. {
  3.     log_init();

  4.     log_info("\n this is a SPI master DMA Demo.\n");

  5.     GPIO_Configuration();
  6.     DMA_SPI_Configuration();
  7.     SPI_Configuration();
  8.         
  9.     log_info("\n DMA Transfer start.\n");
  10.         
  11.     for (int i = 0; i < 3; i++) {
  12.         SPI_Write_DMA(SPI_MASTER, SPI_Master_Tx_Buffer, BUFFER_SIZE);
  13.                
  14.                 while (!DMA_GetFlagStatus(SPI_MASTER_TX_DMA_FLAG, SPI_MASTER_DMA)) __NOP();
  15.     }
  16.         
  17.     log_info("\n DMA Transfer end.\n");

  18.     while (1) {
  19.     }
  20. }
测试结果:
wb031_spi_dma.png



您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

51

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部