[技术问答] HC32F460 spi dma无法进中断

[复制链接]
4838|11
 楼主| reptt 发表于 2025-4-8 18:11 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 reptt 于 2025-4-8 18:14 编辑

代码如下,恳请大佬们帮助#include "bsp_spi.h"
static void INT_SRC_DMA1_TC0_IrqCallback(void);
//SPIx Config
void bsp_SPIxCfg(void)
{
  stc_spi_init_t stcSpiInit;
    stc_spi_delay_t stcSpiDelay;

   stc_gpio_init_t stcGpioInit;

    (void)GPIO_StructInit(&stcGpioInit);
    stcGpioInit.u16PinDrv       = PIN_HIGH_DRV;
    (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_04,  &stcGpioInit);
    (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_05, &stcGpioInit);
    (void)GPIO_Init(GPIO_PORT_A, GPIO_PIN_07, &stcGpioInit);

  GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_04,GPIO_FUNC_41);//SPI1-MISO

    GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_05,GPIO_FUNC_40);//SPI1-MOSI

    GPIO_SetFunc(GPIO_PORT_A,GPIO_PIN_07,GPIO_FUNC_43);//SPI1-SCK

    /* Enable SPI1 clock */
    FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_SPI1, ENABLE);
    /************************* Configure SPI1***************************/
    SPI_StructInit(&stcSpiInit);
    stcSpiInit.u32WireMode = SPI_3_WIRE;
    stcSpiInit.u32TransMode = SPI_SEND_ONLY;
    stcSpiInit.u32MasterSlave = SPI_MASTER;
    stcSpiInit.u32SpiMode = SPI_MD_1;
    stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV256;
    stcSpiInit.u32DataBits = SPI_DATA_SIZE_8BIT;
    stcSpiInit.u32FirstBit = SPI_FIRST_MSB;
    //stcSpiInit.u32SuspendMode = SPI_COM_SUSP_FUNC_OFF;
    stcSpiInit.u32FrameLevel = SPI_1_FRAME;
    (void)SPI_Init(CM_SPI1, &stcSpiInit);

    SPI_DelayStructInit(&stcSpiDelay);
    stcSpiDelay.u32IntervalDelay = SPI_INTERVAL_TIME_1SCK;
    stcSpiDelay.u32ReleaseDelay = SPI_RELEASE_TIME_1SCK;
    stcSpiDelay.u32SetupDelay = SPI_SETUP_TIME_1SCK;
    (void)SPI_DelayTimeConfig(CM_SPI1, &stcSpiDelay);

    /* Enable SPI1 */
    SPI_Cmd(CM_SPI1, ENABLE);

}

static void Spi_DmaCfg(void)
{

      /* DMA1 FCG enable */
    FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE);
    /* AOS FCG enable */
    FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);

    stc_dma_init_t stcDmaInit;

    /* Base Config */
    (void)DMA_StructInit(&stcDmaInit);

    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = 0UL;
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;

    stcDmaInit.u32DestAddr = (uint32_t)(&CM_SPI1->DR);
    stcDmaInit.u32SrcAddr = 0;
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
  (void)DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit);
  /* DMA1_CH0 Config */
    AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_SPI1_SPRI);
  /* IRQ sign-in */

  stc_irq_signin_config_t stcIrq;
    stcIrq.enIntSrc = INT_SRC_DMA1_TC0;
    stcIrq.enIRQn = INT038_IRQn;
    stcIrq.pfnCallback = &INT_SRC_DMA1_TC0_IrqCallback;
    (void)INTC_IrqSignIn(&stcIrq);
    /* NVIC config */
    NVIC_ClearPendingIRQ(stcIrq.enIRQn);
    NVIC_SetPriority(stcIrq.enIRQn, DDL_IRQ_PRIO_15);
    NVIC_EnableIRQ(stcIrq.enIRQn);

    /* DMA module enable */
    DMA_Cmd(CM_DMA1, ENABLE);
  /* DMA channel enable */
    (void)DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
  DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_BTC_CH0);
       
}

/**
* @brief  SPI configure.
* @param  None
* @retval None
*/
void SPI_DMA_SEND(uint8_t * buf,uint8_t len)
{

  while(DMA_GetTransCompleteStatus(CM_DMA1,DMA_INT_BTC_CH0)==SET){};
    DMA_SetSrcAddr(CM_DMA1, DMA_CH0, (uint32_t)(&buf));
    DMA_SetTransCount(CM_DMA1, DMA_CH0, len);
    /* Enable DMA channel */
    DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);

}

/* INT_SRC_DMA1_BTC0 Callback. */
static void INT_SRC_DMA1_TC0_IrqCallback(void)
{
    //add your codes here
DMA_ClearTransCompleteStatus(CM_DMA1, DMA_INT_TC_CH0);//DMA_INT_TC_CH0,DMA_INT_BTC_CH0

       
}

void bsp_spi_init(void)
{
bsp_SPIxCfg();
Spi_DmaCfg();
}
mmexport1744107055302.png
Amazingxixixi 发表于 2025-4-24 15:45 | 显示全部楼层
学习一下啊!感觉有点知识慌了
classroom 发表于 2025-5-27 12:36 | 显示全部楼层
DMA中断源配置错误?
probedog 发表于 2025-5-27 14:00 | 显示全部楼层
DMA传输方向、数据宽度、地址递增方式等配置错误,可能导致传输异常且无法触发中断。
flycamelaaa 发表于 2025-5-27 15:00 | 显示全部楼层
DMA通道的使能和失能操作顺序或时机不正确,可能导致中断无法进入。
stormwind123 发表于 2025-5-27 18:00 | 显示全部楼层
中断标志位未清除?
classroom 发表于 2025-5-27 18:30 | 显示全部楼层
可能SPI与DMA的触发源配置不匹配,或SPI传输未正确触发DMA传输。
powerantone 发表于 2025-5-27 19:00 | 显示全部楼层
DMA中断优先级设置过低,可能被其他高优先级中断抢占。
jcky001 发表于 2025-5-27 21:00 | 显示全部楼层
在DMA中断服务程序中,调用DMA_ClearIrqFlag函数清除中断标志位,避免中断被屏蔽。
初级工程渣 发表于 2025-6-30 15:26 | 显示全部楼层
若使用 DMA 传输,需补充中断处理逻辑
狗啃模拟 发表于 2025-8-31 23:51 | 显示全部楼层
SPI 发送配置为DmaMemToPeriph,接收配置为DmaPeriphToMem
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

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