打印
[技术问答]

一个常见的场景, 初次使用HC32, DMA + SPI 给屏幕送数据。

[复制链接]
728|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanshengdian|  楼主 | 2025-6-8 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
遇到的问题是这样, HC32F460 使用SPI4驱动2寸屏,
spi 初始化
void SPI_Config(void)
{
        GPIO_SetDebugPort(GPIO_PIN_SWO, DISABLE);
        GPIO_SetFunc(GPIO_PORT_B,GPIO_PIN_03,GPIO_FUNC_47);//SPI4-SCK
        GPIO_SetFunc(GPIO_PORT_B,GPIO_PIN_05,GPIO_FUNC_44);//SPI4-MOSI

        stc_spi_init_t stcSpiInit;
        stc_spi_delay_t stcSpiDelay;
        stc_irq_signin_config_t stcIrqSignConfig;

        /* Enable SPI4 clock */
        FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_SPI4, ENABLE);
        /************************* Configure SPI4***************************/
        SPI_StructInit(&stcSpiInit);
        stcSpiInit.u32WireMode = SPI_3_WIRE;                        //SPI_4_WIRE;
        stcSpiInit.u32TransMode = SPI_SEND_ONLY;
        stcSpiInit.u32MasterSlave = SPI_MASTER;
        stcSpiInit.u32SpiMode = SPI_MD_0;
        stcSpiInit.u32BaudRatePrescaler = SPI_BR_CLK_DIV2;
        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_SPI4, &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_SPI4, &stcSpiDelay);

        SPI_Cmd(CM_SPI4, ENABLE);
}

DMA初始化
void spi_dma_config(void)
{
    stc_dma_init_t stcDmaInit;
    stc_irq_signin_config_t stcIrqSignConfig;

    /* DMA configuration */
    FCG_Fcg0PeriphClockCmd((FCG0_PERIPH_DMA1 | FCG0_PERIPH_AOS), ENABLE);
    (void)DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32BlockSize  = 1UL;
    stcDmaInit.u32TransCount = 65536;
    stcDmaInit.u32DataWidth  = DMA_DATAWIDTH_8BIT;
    /* Configure TX */
    stcDmaInit.u32SrcAddrInc  = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    stcDmaInit.u32SrcAddr     = (uint32_t)(&dis_buf[0]);
    stcDmaInit.u32DestAddr    = (uint32_t)(&CM_SPI4->DR);
    if (LL_OK != DMA_Init(CM_DMA1, DMA_CH0, &stcDmaInit)) {
        for (;;) {
        }
    }
    AOS_SetTriggerEventSrc(AOS_DMA1_0, EVT_SRC_SPI4_SPTI);
               

    /* DMA receive NVIC configure */
    stcIrqSignConfig.enIntSrc    = INT_SRC_DMA1_TC0;
    stcIrqSignConfig.enIRQn      = INT000_IRQn;
    stcIrqSignConfig.pfnCallback = &DMA_TransCompleteCallback;
    (void)INTC_IrqSignIn(&stcIrqSignConfig);
    NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
    NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);

    /* Enable DMA and channel */
    DMA_Cmd(CM_DMA1, ENABLE);
    DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
}

void DMA_ReloadConfig(void)
{
    DMA_SetSrcAddr(CM_DMA1, DMA_CH0, (uint32_t)(&dis_buf[0]));
    DMA_SetTransCount(CM_DMA1, DMA_CH0, 65535);
    /* Enable DMA channel */
    DMA_ChCmd(CM_DMA1, DMA_CH0, ENABLE);
}

按DDL里面的例子, main() 里面这样写的
        SPI_Cmd(CM_SPI4, DISABLE);
        spi_dma_config();
        DMA_ReloadConfig();
        SPI_Cmd(CM_SPI4, ENABLE);

实际结果是   spi 没有任何动作, , ,

请教大家, 怎么配置好了SPI 和DMA之后,  触发DMA给SPI搬运数据?

谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝