Afanx 发表于 2023-2-6 11:20

N32WB031 SPI+DMA发送demo

本帖最后由 Afanx 于 2023-2-6 11:20 编辑

例程附件:


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) {
    }
}测试结果:




页: [1]
查看完整版本: N32WB031 SPI+DMA发送demo